aboutsummaryrefslogtreecommitdiff
path: root/src/boot/multiboot.c
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-08 19:06:44 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-08 19:06:44 +0200
commit8fee35522dee033863f68c1d2b45f5fe988de9eb (patch)
tree5e094806066d2f13bc5ad1fefe663d132e291f8e /src/boot/multiboot.c
parent958e2dae042ca9e28f23e509d541730f30fa8502 (diff)
Handle clock interrupt and cleaning code
Diffstat (limited to 'src/boot/multiboot.c')
-rw-r--r--src/boot/multiboot.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/boot/multiboot.c b/src/boot/multiboot.c
new file mode 100644
index 0000000..0309eb0
--- /dev/null
+++ b/src/boot/multiboot.c
@@ -0,0 +1,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;
+}