diff options
Diffstat (limited to 'src/boot/multiboot2.cc')
| -rw-r--r-- | src/boot/multiboot2.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/boot/multiboot2.cc b/src/boot/multiboot2.cc new file mode 100644 index 0000000..b0e8c14 --- /dev/null +++ b/src/boot/multiboot2.cc @@ -0,0 +1,55 @@ +#include "multiboot2.hpp" +#include "libs/string.hpp" +#include "libs/stdio.hpp" + +u32* mb2_find_tag(u32 *mb2_info_addr, char type){ + u32 size=(u32)mb2_info_addr[0]; + + char *location=((char*)mb2_info_addr)+8; // Goto first tag + char *start=(char*)mb2_info_addr; + + while((location-start) < size){ + // Goto next 64bit align address + while(((u64)location&0x7) != 0) + location++; + // Parse type + u32 cur_type=((u32*)location)[0]; + u32 cur_size=((u32*)location)[1]; + + if(cur_type==type){ + return (u32*)location; + } + location+=cur_size; + } + + return 0; +} + +char mb2_find_bootloader_name(u32* mb2_info_addr, char *return_name){ + u32* addr=mb2_find_tag(mb2_info_addr,2); + if(addr){ + u32 size=addr[1]; + memcpy(addr+2, return_name, size); + return 1; + } + return 0; +} +char mb2_find_new_rsdp(u32* mb2_info_addr, u64 *return_addr, u32 *return_size){ + u32* addr=mb2_find_tag(mb2_info_addr,15); + if(addr){ + *return_size=addr[1]; + *return_addr=(u64)addr+2; + return 1; + } + return 0; +} + +char mb2_find_old_rsdp(u32* mb2_info_addr, u64 *return_addr, u32 *return_size){ + u32* addr=mb2_find_tag(mb2_info_addr,14); + if(addr){ + *return_size=addr[1]; + *return_addr=(u64)addr+2; + return 1; + } + return 0; +}
\ No newline at end of file |
