return low | ((uint64_t)high)<<32;
}
-void update_with_value(uint64_t value) {
+void update_with_value(uint64_t value, int y) {
const char *hex = "0123456789abcdef";
for(int i = 15; i >= 0; i --) {
- (PHY_MAP_BASE)[0xb8000 + (i*2)] = hex[value&0xf];
- (PHY_MAP_BASE)[0xb8000 + (i*2) + 1] = 7;
+ (PHY_MAP_BASE)[0xb8000 + (i*2) + y*0xa0] = hex[value&0xf];
+ (PHY_MAP_BASE)[0xb8000 + (i*2) + y*0xa0 + 1] = 7;
value >>= 4;
}
}
extern void syscall_entry();
+extern void sysenter_entry();
+extern void invoke_sysenter();
extern void enter_userspace();
void wrmsr_wrapper(uint32_t which, uint64_t val) {
void userspace() {
while(1) {
- uint64_t before = rdtsc_wrapper();
- for(int i = 0; i < 4096; i ++) __asm__("syscall");
- uint64_t after = rdtsc_wrapper();
- update_with_value(after-before);
+ {
+ uint64_t before = rdtsc_wrapper();
+ for(int i = 0; i < 4096; i ++) __asm__("syscall");
+ uint64_t after = rdtsc_wrapper();
+ update_with_value(after-before, 0);
+ }
+ {
+ uint64_t before = rdtsc_wrapper();
+ for(int i = 0; i < 4096; i ++) invoke_sysenter();
+ uint64_t after = rdtsc_wrapper();
+ update_with_value(after-before, 1);
+ }
}
}
wrmsr_wrapper(0xc0000084, 0x200);
wrmsr_wrapper(0xc0000081, ((uint64_t)(0x18+3) << 48) + ((uint64_t)0x08 << 32));
+ wrmsr_wrapper(0x174, 8);
+ uint64_t value;
+ wrmsr_wrapper(0x175, (uint64_t)&value - 0x100);
+ wrmsr_wrapper(0x176, (uint64_t)sysenter_entry);
+
enter_userspace((uint64_t)userspace);
while(1) {}