From ae6924dae8df004a8389215b2d5a183fb4e4841a Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sun, 25 Jul 2010 14:46:21 -0400 Subject: [PATCH] Minor - introduce GDT_GRANLIMIT macro. Add macro to improve readability of GDT limit definitions. --- src/misc.c | 8 ++++---- src/util.h | 14 +++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/misc.c b/src/misc.c index 108c332..5cb4a01 100644 --- a/src/misc.c +++ b/src/misc.c @@ -149,17 +149,17 @@ u64 rombios32_gdt[] VAR16VISIBLE __aligned(8) = { // First entry can't be used. 0x0000000000000000LL, // 32 bit flat code segment (SEG32_MODE32_CS) - GDT_LIMIT(0xfffff) | GDT_CODE | GDT_B | GDT_G, + GDT_GRANLIMIT(0xffffffff) | GDT_CODE | GDT_B, // 32 bit flat data segment (SEG32_MODE32_DS) - GDT_LIMIT(0xfffff) | GDT_DATA | GDT_B | GDT_G, + GDT_GRANLIMIT(0xffffffff) | GDT_DATA | GDT_B, // 16 bit code segment base=0xf0000 limit=0xffff (SEG32_MODE16_CS) GDT_LIMIT(BUILD_BIOS_SIZE-1) | GDT_CODE | GDT_BASE(BUILD_BIOS_ADDR), // 16 bit data segment base=0x0 limit=0xffff (SEG32_MODE16_DS) GDT_LIMIT(0x0ffff) | GDT_DATA, // 16 bit code segment base=0xf0000 limit=0xffffffff (SEG32_MODE16BIG_CS) - GDT_LIMIT(0xfffff) | GDT_CODE | GDT_G | GDT_BASE(BUILD_BIOS_ADDR), + GDT_GRANLIMIT(0xffffffff) | GDT_CODE | GDT_BASE(BUILD_BIOS_ADDR), // 16 bit data segment base=0 limit=0xffffffff (SEG32_MODE16BIG_DS) - GDT_LIMIT(0xfffff) | GDT_DATA | GDT_G, + GDT_GRANLIMIT(0xffffffff) | GDT_DATA, }; // GDT descriptor diff --git a/src/util.h b/src/util.h index 85cf3f5..63999e0 100644 --- a/src/util.h +++ b/src/util.h @@ -162,15 +162,19 @@ static inline u8 readb(const void *addr) { : "ebx", "edx", "esi", "edi", "cc", "memory"); \ } while (0) -// GDT bit manipulation -#define GDT_BASE(v) ((((u64)(v) & 0xff000000) << 32) \ - | (((u64)(v) & 0x00ffffff) << 16)) -#define GDT_LIMIT(v) ((((u64)(v) & 0x000f0000) << 32) \ - | (((u64)(v) & 0x0000ffff) << 0)) +// GDT bits #define GDT_CODE (0x9bULL << 40) // Code segment - P,R,A bits also set #define GDT_DATA (0x93ULL << 40) // Data segment - W,A bits also set #define GDT_B (0x1ULL << 54) // Big flag #define GDT_G (0x1ULL << 55) // Granularity flag +// GDT bits for segment base +#define GDT_BASE(v) ((((u64)(v) & 0xff000000) << 32) \ + | (((u64)(v) & 0x00ffffff) << 16)) +// GDT bits for segment limit (0-1Meg) +#define GDT_LIMIT(v) ((((u64)(v) & 0x000f0000) << 32) \ + | (((u64)(v) & 0x0000ffff) << 0)) +// GDT bits for segment limit (0-4Gig in 4K chunks) +#define GDT_GRANLIMIT(v) (GDT_G | GDT_LIMIT((v) >> 12)) struct descloc_s { u16 length; -- 2.39.5