diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-06-13 11:09:10 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-06-13 11:09:10 -0700 |
commit | e64b42b0a1d39c154941329284c7ff3f47c32cd7 (patch) | |
tree | 8f51ccc984d24832aeabf241c18d85bac49a83af | |
parent | 6d82274573a430e8725965d509b9124bbc9174fd (diff) | |
download | misc-tests-e64b42b0a1d39c154941329284c7ff3f47c32cd7.tar.gz |
Add segment limits
-rw-r--r-- | user_visible_state.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/user_visible_state.c b/user_visible_state.c index 58d1d88..055de34 100644 --- a/user_visible_state.c +++ b/user_visible_state.c @@ -2,18 +2,25 @@ #include <stdint.h> #include <xmmintrin.h> -static void show_gdt_and_idt(void) +/* returns GDT limit */ +static uint16_t show_gdt_and_idt(void) { struct { unsigned short limit; unsigned long base; } __attribute__((packed)) val; + uint16_t ret; + __asm__ ("sgdt %0" : "=m" (val)); printf("GDT: base = 0x%016lX limit = 0x%04hX\n", val.base, val.limit); + ret = val.limit; + __asm__ ("sidt %0" : "=m" (val)); printf("IDT: base = 0x%016lX limit = 0x%04hX\n", val.base, val.limit); + + return ret; } static void show_ldt(void) @@ -54,12 +61,28 @@ static void show_rdtscp(void) printf("RDTSCP: cpu %d\n", cpu); } +static void show_seglimit(uint16_t index) +{ + uint32_t okay = 0, limit; + asm ("lsl %[index], %[limit]\n\t" + "jnz 1f\n\t" + "mov $1, %[okay]\n\t" + "1:" + : [limit] "=r" (limit), [okay] "+rm" (okay) + : [index] "r" ((index << 3) + 3)); + if (okay) { + printf("GDT entry %02hu limit: 0x%08X\n", index, limit); + } +} + int main() { - show_gdt_and_idt(); + uint16_t gdtlimit = show_gdt_and_idt(); show_ldt(); show_tr(); show_msw(); show_flags(); show_rdtscp(); + for (int i = 0; i <= gdtlimit; i++) + show_seglimit(i); } |