aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2010-07-25 14:46:21 -0400
committerKevin O'Connor <kevin@koconnor.net>2010-07-25 14:46:21 -0400
commitae6924dae8df004a8389215b2d5a183fb4e4841a (patch)
tree2aa554d143974a7b61cec982e295c4720ce7abc9
parent0f788893a8bbad95edcdf3db5009642633dee7dc (diff)
downloadseabios-ae6924dae8df004a8389215b2d5a183fb4e4841a.tar.gz
Minor - introduce GDT_GRANLIMIT macro.
Add macro to improve readability of GDT limit definitions.
-rw-r--r--src/misc.c8
-rw-r--r--src/util.h14
2 files changed, 13 insertions, 9 deletions
diff --git a/src/misc.c b/src/misc.c
index 108c3326..5cb4a016 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 85cf3f54..63999e0f 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;