From b0e433fca25fa6d253cbb7db26171493c795a464 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Mon, 7 Dec 2020 22:48:28 +0100 Subject: [PATCH] pretty-print GDT entries --- kernel/src/arch/x86/gdt.c | 32 +++++++++++++++++++++++++ kernel/src/arch/x86/gdt.h | 3 +++ kernel/src/arch/x86_64/entry-stivale2.c | 5 ++-- kernel/src/arch/x86_64/gdt.h | 2 +- kernel/src/print/print.c | 14 +++++------ 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 kernel/src/arch/x86/gdt.c create mode 100644 kernel/src/arch/x86/gdt.h diff --git a/kernel/src/arch/x86/gdt.c b/kernel/src/arch/x86/gdt.c new file mode 100644 index 0000000..e1c97db --- /dev/null +++ b/kernel/src/arch/x86/gdt.c @@ -0,0 +1,32 @@ +#include + +#include "gdt.h" + +void print_gdt_ent(uint64_t* ent) { + uint64_t e = *ent; + uint64_t base = ((e >> 16) & 0xFFFFFF) | ((e >> 32) & 0xFF000000); + uint64_t limit = (e & 0xFFFF) | ((e >> 32) & 0xF0000); + uint64_t flags = ((e >> 52) & 0xF); + uint64_t access = ((e >> 40) & 0xFF); + + uint64_t code = (access & 0x8); + + int bits = (flags&0x2) ? 64 : ((flags&0x4) ? 32 : 16); + + uint64_t length = limit * ((flags & 0x8) ? 4096 : 1); + printf("%X (%h): \t", base, length); + if(e == 0) { + puts("NULL"); + return; + } + if(access & 0x80) putchar('P'); + printf("%d", (access >> 5) & 0x3); + if(access & 0x10) putchar('S'); + if(code) printf(" Code%d\t", bits); else puts(" Data\t"); + if(access & 0x4) putchar(code ? 'C' : 'D'); + if(access & 0x2) putchar(code ? 'R' : 'W'); + if(access & 0x1) putchar('A'); + + if(flags & 0x8) putchar('G'); + if(flags & 0x1) putchar('z'); +} diff --git a/kernel/src/arch/x86/gdt.h b/kernel/src/arch/x86/gdt.h new file mode 100644 index 0000000..9ca6416 --- /dev/null +++ b/kernel/src/arch/x86/gdt.h @@ -0,0 +1,3 @@ +#include + +void print_gdt_ent(uint64_t* ent); diff --git a/kernel/src/arch/x86_64/entry-stivale2.c b/kernel/src/arch/x86_64/entry-stivale2.c index 214ca30..c609aad 100644 --- a/kernel/src/arch/x86_64/entry-stivale2.c +++ b/kernel/src/arch/x86_64/entry-stivale2.c @@ -3,11 +3,12 @@ #include #include +#include +#include #include #include -#include "gdt.h" static uint8_t stack[4096] = {0}; void stivale2_main(struct stivale2_struct *info); @@ -46,7 +47,7 @@ void stivale2_main(struct stivale2_struct *info) { printf("GDT: %x (%d)\n", pGDT.base, pGDT.limit); for(int i = 0; i < (pGDT.limit+1)/8; i++) { uint64_t *gdt_ent = pGDT.base + 8*i; - printf("GDTent(%d at %x): %x\n", i, gdt_ent, *gdt_ent); + printf("GDT %d: ", i); print_gdt_ent(gdt_ent); putchar('\n'); } char *argv[3] = {"stivale2", info->bootloader_brand, info->bootloader_version}; diff --git a/kernel/src/arch/x86_64/gdt.h b/kernel/src/arch/x86_64/gdt.h index c759881..d908147 100644 --- a/kernel/src/arch/x86_64/gdt.h +++ b/kernel/src/arch/x86_64/gdt.h @@ -6,4 +6,4 @@ struct gdt_ptr uint64_t base; } __attribute__((packed)); -void loadgdt(); \ No newline at end of file +void loadgdt(); diff --git a/kernel/src/print/print.c b/kernel/src/print/print.c index fa06909..7044424 100644 --- a/kernel/src/print/print.c +++ b/kernel/src/print/print.c @@ -1,5 +1,6 @@ #include #include +#include #include "print.h" @@ -16,15 +17,10 @@ void print(const char* c) { static const char CONVERSION_TABLE[] = "0123456789abcdef"; static const char UNITS[] = "bKM"; -static void printhex(size_t num) { +static void printhex(size_t num, bool pad) { int i; char buf[17]; - if (!num) { - puts("0x0"); - return; - } - buf[16] = 0; for (i = 15; num; i--) { @@ -33,7 +29,7 @@ static void printhex(size_t num) { } puts("0x"); - for(int j = i; j >= 0; j--) { + for(int j = i; pad && j >= 0; j--) { putchar('0'); } @@ -79,7 +75,9 @@ void printf(const char *format, ...) { if (*format == '%') { format++; if (*format == 'x') { - printhex(va_arg(argp, size_t)); + printhex(va_arg(argp, size_t), false); + } else if (*format == 'X') { + printhex(va_arg(argp, size_t), true); } else if (*format == 'd') { printdec(va_arg(argp, size_t)); } else if (*format == 's') {