aboutsummaryrefslogtreecommitdiff
path: root/src/utils/multiboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/multiboot.c')
-rw-r--r--src/utils/multiboot.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/utils/multiboot.c b/src/utils/multiboot.c
new file mode 100644
index 0000000..891bd57
--- /dev/null
+++ b/src/utils/multiboot.c
@@ -0,0 +1,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;
+}