aboutsummaryrefslogtreecommitdiff
path: root/src/utils/multiboot.c
blob: 891bd572ad5122a00f535c15071922ae8a75594b (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
#include "multiboot.h"

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;

    for(int i=0;i<10;i++){       
        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;
}