From 6bf4fd3340e4b02a0e2c40e9fde6b13c32333d55 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Thu, 26 Nov 2015 14:19:34 +0100 Subject: [PATCH] nova: 64-bit guest support Issue #1791 --- .../base-nova/include/nova/syscall-generic.h | 115 ++++++++++++++---- repos/base-nova/ports/nova.hash | 2 +- repos/base-nova/ports/nova.port | 2 +- repos/ports/ports/seoul.hash | 2 +- repos/ports/ports/seoul.port | 4 +- 5 files changed, 95 insertions(+), 30 deletions(-) diff --git a/repos/base-nova/include/nova/syscall-generic.h b/repos/base-nova/include/nova/syscall-generic.h index 1d2714c65..711761933 100644 --- a/repos/base-nova/include/nova/syscall-generic.h +++ b/repos/base-nova/include/nova/syscall-generic.h @@ -208,32 +208,35 @@ namespace Nova { public: enum { - ACDB = 1U << 0, /* eax, ecx, edx, ebx */ - EBSD = 1U << 1, /* ebp, esi, edi */ - ESP = 1U << 2, - EIP = 1U << 3, - EFL = 1U << 4, /* eflags */ - ESDS = 1U << 5, - FSGS = 1U << 6, - CSSS = 1U << 7, - TR = 1U << 8, - LDTR = 1U << 9, - GDTR = 1U << 10, - IDTR = 1U << 11, - CR = 1U << 12, - DR = 1U << 13, /* DR7 */ - SYS = 1U << 14, /* Sysenter MSRs CS, ESP, EIP */ - QUAL = 1U << 15, /* exit qualification */ - CTRL = 1U << 16, /* execution controls */ - INJ = 1U << 17, /* injection info */ - STA = 1U << 18, /* interruptibility state */ - TSC = 1U << 19, /* time-stamp counter */ - EFER = 1U << 20, /* EFER MSR */ - PDPTE = 1U << 21, /* PDPTE0 .. PDPTE3 */ - FPU = 1U << 31, /* FPU state */ + ACDB = 1U << 0, /* eax, ecx, edx, ebx */ + EBSD = 1U << 1, /* ebp, esi, edi */ + ESP = 1U << 2, + EIP = 1U << 3, + EFL = 1U << 4, /* eflags */ + ESDS = 1U << 5, + FSGS = 1U << 6, + CSSS = 1U << 7, + TR = 1U << 8, + LDTR = 1U << 9, + GDTR = 1U << 10, + IDTR = 1U << 11, + CR = 1U << 12, + DR = 1U << 13, /* DR7 */ + SYS = 1U << 14, /* Sysenter MSRs CS, ESP, EIP */ + QUAL = 1U << 15, /* exit qualification */ + CTRL = 1U << 16, /* execution controls */ + INJ = 1U << 17, /* injection info */ + STA = 1U << 18, /* interruptibility state */ + TSC = 1U << 19, /* time-stamp counter */ + EFER = 1U << 20, /* EFER MSR */ + PDPTE = 1U << 21, /* PDPTE0 .. PDPTE3 */ + R8_R15 = 1U << 22, /* R8 .. R15 */ + SYSCALL_SWAPGS = 1U << 23, /* SYSCALL and SWAPGS MSRs */ + TPR = 1U << 24, /* TPR and TPR threshold */ + FPU = 1U << 31, /* FPU state */ IRQ = EFL | STA | INJ | TSC, - ALL = 0x000fffff & ~CTRL, + ALL = (0x000fffff & ~CTRL) | EFER | R8_R15 | SYSCALL_SWAPGS | TPR, }; Mtd(mword_t value) : _value(value) { } @@ -475,6 +478,12 @@ namespace Nova { mword_t pdpte[4]; #ifdef __x86_64__ mword_t cr8, efer; + unsigned long long star; + unsigned long long lstar; + unsigned long long fmask; + unsigned long long kernel_gs_base; + unsigned tpr; + unsigned tpr_threshold; #endif mword_t dr7, sysenter_cs, sysenter_sp, sysenter_ip; @@ -505,11 +514,67 @@ namespace Nova { }; #ifdef __x86_64__ + inline mword_t read_r8() { return r8; } + inline void write_r8(mword_t value) { r8 = value; } + inline mword_t read_r9() { return r9; } + inline void write_r9(mword_t value) { r9 = value; } + inline mword_t read_r10() { return r10; } + inline void write_r10(mword_t value) { r10 = value; } + inline mword_t read_r11() { return r11; } + inline void write_r11(mword_t value) { r11 = value; } + inline mword_t read_r12() { return r12; } + inline void write_r12(mword_t value) { r12 = value; } + inline mword_t read_r13() { return r13; } + inline void write_r13(mword_t value) { r13 = value; } + inline mword_t read_r14() { return r14; } + inline void write_r14(mword_t value) { r14 = value; } + inline mword_t read_r15() { return r15; } + inline void write_r15(mword_t value) { r15 = value; } inline mword_t read_efer() { return efer; } - inline void write_efer(mword_t e) { efer = e; } + inline void write_efer(mword_t value) { efer = value; } + inline mword_t read_star() { return star; } + inline void write_star(mword_t value) { star = value; } + inline mword_t read_lstar() { return lstar; } + inline void write_lstar(mword_t value) { lstar = value; } + inline mword_t read_fmask() { return fmask; } + inline void write_fmask(mword_t value) { fmask = value; } + inline mword_t read_kernel_gs_base() { return kernel_gs_base; } + inline void write_kernel_gs_base(mword_t value) { kernel_gs_base = value; } + inline uint32_t read_tpr() { return tpr; } + inline void write_tpr(uint32_t value) { tpr = value; } + inline uint32_t read_tpr_threshold() { return tpr_threshold; } + inline void write_tpr_threshold(uint32_t value) { tpr_threshold = value; } #else + inline mword_t read_r8() { return 0UL; } + inline void write_r8(mword_t) { } + inline mword_t read_r9() { return 0UL; } + inline void write_r9(mword_t) { } + inline mword_t read_r10() { return 0UL; } + inline void write_r10(mword_t) { } + inline mword_t read_r11() { return 0UL; } + inline void write_r11(mword_t) { } + inline mword_t read_r12() { return 0UL; } + inline void write_r12(mword_t) { } + inline mword_t read_r13() { return 0UL; } + inline void write_r13(mword_t) { } + inline mword_t read_r14() { return 0UL; } + inline void write_r14(mword_t) { } + inline mword_t read_r15() { return 0UL; } + inline void write_r15(mword_t) { } inline mword_t read_efer() { return 0UL; } inline void write_efer(mword_t) { } + inline mword_t read_star() { return 0UL; } + inline void write_star(mword_t) { } + inline mword_t read_lstar() { return 0UL; } + inline void write_lstar(mword_t) { } + inline mword_t read_fmask() { return 0UL; } + inline void write_fmask(mword_t) { } + inline mword_t read_kernel_gs_base() { return 0UL; } + inline void write_kernel_gs_base(mword_t) { } + inline uint32_t read_tpr() { return 0; } + inline void write_tpr(uint32_t) { } + inline uint32_t read_tpr_threshold() { return 0; } + inline void write_tpr_threshold(uint32_t) { } #endif /** diff --git a/repos/base-nova/ports/nova.hash b/repos/base-nova/ports/nova.hash index 0b617fe0d..cdf561061 100644 --- a/repos/base-nova/ports/nova.hash +++ b/repos/base-nova/ports/nova.hash @@ -1 +1 @@ -71d690621c7ccb59f1feac867257e52b038fcf3b +e08cc27e2cfe25ed72395cd5c245ff7bf460b900 diff --git a/repos/base-nova/ports/nova.port b/repos/base-nova/ports/nova.port index 659eb2b6b..5380989e0 100644 --- a/repos/base-nova/ports/nova.port +++ b/repos/base-nova/ports/nova.port @@ -4,7 +4,7 @@ DOWNLOADS := nova.git # r9 branch - use r9_debug for more verbose kernel messages URL(nova) := https://github.com/alex-ab/NOVA.git -REV(nova) := 1f37f260e0b1d9f9bc40e8b1e67297647a0fe819 +REV(nova) := 7c0c451d3de1a4645e8fadde1fdbebb3203c1f8d DIR(nova) := src/kernel/nova PATCHES := $(wildcard $(REP_DIR)/patches/*.patch) diff --git a/repos/ports/ports/seoul.hash b/repos/ports/ports/seoul.hash index 536326522..e510bee10 100644 --- a/repos/ports/ports/seoul.hash +++ b/repos/ports/ports/seoul.hash @@ -1 +1 @@ -ac479be8608aa7923053f4f12f05de533209b848 +e6e6d4f8b6e3ee3d7c6389b23493e3c5d647e7df diff --git a/repos/ports/ports/seoul.port b/repos/ports/ports/seoul.port index f9fbd020f..dd2451856 100644 --- a/repos/ports/ports/seoul.port +++ b/repos/ports/ports/seoul.port @@ -3,8 +3,8 @@ VERSION := git DOWNLOADS := seoul.git URL(seoul) := https://github.com/alex-ab/seoul.git -# branch genode_15_08 -REV(seoul) := 2861f495ddcbf714c8b7944ce1c39985a164348c +# branch genode_15_11 +REV(seoul) := 31c07e2b61e67732dbb115561665ebb3415a49a7 DIR(seoul) := src/app/seoul #