summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-06-13 11:09:10 -0700
committerAndy Lutomirski <luto@amacapital.net>2014-06-13 11:09:10 -0700
commite64b42b0a1d39c154941329284c7ff3f47c32cd7 (patch)
tree8f51ccc984d24832aeabf241c18d85bac49a83af
parent6d82274573a430e8725965d509b9124bbc9174fd (diff)
downloadmisc-tests-e64b42b0a1d39c154941329284c7ff3f47c32cd7.tar.gz
Add segment limits
-rw-r--r--user_visible_state.c27
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);
}