167400082e6a80812fcb36987f2ca95e6857ee66
[sliver.git] / kernel / kmain.c
1 #include <stdint.h>
2
3 #define PHY_MAP_BASE (uint8_t *)0xffffc00000000000ULL
4
5 uint64_t rdtsc_wrapper() {
6     uint32_t low, high;
7     __asm__("rdtsc" : "=a"(low), "=d"(high));
8     return low | ((uint64_t)high)<<32;
9 }
10
11 void update_with_value(uint64_t value) {
12     const char *hex = "0123456789abcdef";
13     for(int i = 15; i >= 0; i --) {
14         (PHY_MAP_BASE)[0xb8000 + (i*2)] = hex[value&0xf];
15         (PHY_MAP_BASE)[0xb8000 + (i*2) + 1] = 7;
16
17         value >>= 4;
18     }   
19 }
20
21 extern void syscall_entry();
22 extern void enter_userspace();
23
24 void wrmsr_wrapper(uint32_t which, uint64_t val) {
25     __asm__("wrmsr" : : "c"(which), "a"(val & 0xffffffff), "d"(val >> 32));
26 }
27
28 void userspace() {
29     while(1) {
30         uint64_t before = rdtsc_wrapper();
31         for(int i = 0; i < 4096; i ++) __asm__("syscall");
32         uint64_t after = rdtsc_wrapper();
33         update_with_value(after-before);
34     }
35 }
36
37 void kmain(uint64_t __attribute__((unused)) *mem) {
38     for(int i = 0; i < 80*24*2; i ++) (PHY_MAP_BASE) [0xb8000 + i] = 0;
39     (PHY_MAP_BASE) [0xb8000] = 'a';
40     (PHY_MAP_BASE) [0xb8001] = 7;
41
42     wrmsr_wrapper(0xc0000082, (uint64_t)syscall_entry);
43     wrmsr_wrapper(0xc0000084, 0x200);
44     wrmsr_wrapper(0xc0000081, ((uint64_t)(0x18+3) << 48) + ((uint64_t)0x08 << 32));
45
46     enter_userspace((uint64_t)userspace);
47
48     while(1) {}
49 }