Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2606 | ||
|---|---|---|---|
| Line 50... | Line 50... | ||
| 50 | /* Enable SYSCALL/SYSRET */ |
50 | /* Enable SYSCALL/SYSRET */ |
| 51 | set_efer_flag(AMD_SCE_FLAG); |
51 | set_efer_flag(AMD_SCE_FLAG); |
| 52 | 52 | ||
| 53 | /* Setup syscall entry address */ |
53 | /* Setup syscall entry address */ |
| 54 | 54 | ||
| 55 | /* This is _mess_ - the 64-bit CS is argument+16, |
55 | /* This is _mess_ - the 64-bit CS is argument + 16, |
| 56 | * the SS is argument+8. The order is: |
56 | * the SS is argument + 8. The order is: |
| 57 | * +0(KDATA_DES), +8(UDATA_DES), +16(UTEXT_DES) |
57 | * +0(KDATA_DES), +8(UDATA_DES), +16(UTEXT_DES) |
| 58 | */ |
58 | */ |
| 59 | write_msr(AMD_MSR_STAR, |
59 | write_msr(AMD_MSR_STAR, |
| 60 | ((uint64_t)(gdtselector(KDATA_DES) | PL_USER)<<48) \ |
60 | ((uint64_t)(gdtselector(KDATA_DES) | PL_USER) << 48) | |
| 61 | | ((uint64_t)(gdtselector(KTEXT_DES) | PL_KERNEL)<<32)); |
61 | ((uint64_t)(gdtselector(KTEXT_DES) | PL_KERNEL) << 32)); |
| 62 | write_msr(AMD_MSR_LSTAR, (uint64_t)syscall_entry); |
62 | write_msr(AMD_MSR_LSTAR, (uint64_t)syscall_entry); |
| 63 | /* Mask RFLAGS on syscall |
63 | /* Mask RFLAGS on syscall |
| 64 | * - disable interrupts, until we exchange the stack register |
64 | * - disable interrupts, until we exchange the stack register |
| 65 | * (mask the IE bit) |
65 | * (mask the IE bit) |
| 66 | */ |
66 | */ |