blob: 0309eb040ee349a03bbd79e23cb333ab205715af (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#include "multiboot.h"
#include "utils/mem.h"
/// See boot.S
extern u8* MB_INFO;
char mb_load_tag(char **data, char type){
char *c_info_size=MB_INFO;
char *c_tag_type=c_info_size+8;
char *c_tag_size=c_info_size+12;
int max_size=*((int*)c_info_size);
while(((int)c_tag_type-(int)MB_INFO)<max_size){
int tag_type=*((int*)c_tag_type);
int tag_size=*((int*)c_tag_size);
if(tag_type==type){
*data=c_tag_type;
return 0;
}
c_tag_type=c_tag_type+tag_size+4;
// Skip padding for 64 bits
int p=c_tag_type;
while((p & 0x7) != 0)
p++;
// Assign address after padding
c_tag_type=p;
c_tag_size=c_tag_type+4;
}
return 1;
}
char mb_load_bl_name(MBI_TAG_BL_NAME *data){
char *to_load;
if(!mb_load_tag(&to_load,2)){
memcpy(to_load,data,8);
to_load+=8;
data->name=to_load;
return 0;
}
return 1;
}
char mb_load_fb(MBI_TAG_FB *data){
char *to_load;
if(!mb_load_tag(&to_load,8)){
asm("mov %0, %%ecx;aa:;jmp aa;"::"r"(to_load));
memcpy(to_load,data,8);
to_load+=8;
memcpy(to_load,&(data->framebuffer_addr),8);
return 0;
}
return 1;
}
|