From: Jan Kiszka <[email protected]>

Analogously to ARM, this makes the reset address of x86 CPUs definable
via jailhouse_cell_desc.cpu_reset_address. In order to keep the existing
demo inmates alive, all related config files define cpu_reset_address to
0xffff0 which was hard-coded into the hypervisor so far.

Signed-off-by: Jan Kiszka <[email protected]>
---
 configs/apic-demo.c       |  2 ++
 configs/e1000-demo.c      |  2 ++
 configs/ioapic-demo.c     |  2 ++
 configs/ivshmem-demo.c    |  2 ++
 configs/linux-x86-demo.c  |  2 ++
 configs/pci-demo.c        |  2 ++
 configs/smp-demo.c        |  2 ++
 configs/tiny-demo.c       |  2 ++
 hypervisor/arch/x86/svm.c | 21 +++++++++++++--------
 hypervisor/arch/x86/vmx.c | 22 ++++++++++++++--------
 10 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/configs/apic-demo.c b/configs/apic-demo.c
index 7f2de60a..9c8fed23 100644
--- a/configs/apic-demo.c
+++ b/configs/apic-demo.c
@@ -35,6 +35,8 @@ struct {
                .num_irqchips = 0,
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = 0,
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/e1000-demo.c b/configs/e1000-demo.c
index 59a350ff..05696ab2 100644
--- a/configs/e1000-demo.c
+++ b/configs/e1000-demo.c
@@ -38,6 +38,8 @@ struct {
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = ARRAY_SIZE(config.pci_devices),
                .num_pci_caps = ARRAY_SIZE(config.pci_caps),
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/ioapic-demo.c b/configs/ioapic-demo.c
index 4f12d12a..2a95a7d8 100644
--- a/configs/ioapic-demo.c
+++ b/configs/ioapic-demo.c
@@ -36,6 +36,8 @@ struct {
                .num_irqchips = ARRAY_SIZE(config.irqchips),
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = 0,
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/ivshmem-demo.c b/configs/ivshmem-demo.c
index 8fa991fe..745c24db 100644
--- a/configs/ivshmem-demo.c
+++ b/configs/ivshmem-demo.c
@@ -35,6 +35,8 @@ struct {
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = ARRAY_SIZE(config.pci_devices),
                .num_pci_caps = ARRAY_SIZE(config.pci_caps),
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/linux-x86-demo.c b/configs/linux-x86-demo.c
index 27c972df..e094ada5 100644
--- a/configs/linux-x86-demo.c
+++ b/configs/linux-x86-demo.c
@@ -47,6 +47,8 @@ struct {
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = ARRAY_SIZE(config.pci_devices),
                .num_pci_caps = ARRAY_SIZE(config.pci_caps),
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/pci-demo.c b/configs/pci-demo.c
index b15d4e0a..3bd9eb32 100644
--- a/configs/pci-demo.c
+++ b/configs/pci-demo.c
@@ -38,6 +38,8 @@ struct {
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = ARRAY_SIZE(config.pci_devices),
                .num_pci_caps = ARRAY_SIZE(config.pci_caps),
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/smp-demo.c b/configs/smp-demo.c
index f05f029f..f4b8db1f 100644
--- a/configs/smp-demo.c
+++ b/configs/smp-demo.c
@@ -34,6 +34,8 @@ struct {
                .num_irqchips = 0,
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = 0,
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/configs/tiny-demo.c b/configs/tiny-demo.c
index f31ac96b..69ce7393 100644
--- a/configs/tiny-demo.c
+++ b/configs/tiny-demo.c
@@ -36,6 +36,8 @@ struct {
                .num_irqchips = 0,
                .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
                .num_pci_devices = 0,
+
+               .cpu_reset_address = 0xffff0,
        },
 
        .cpus = {
diff --git a/hypervisor/arch/x86/svm.c b/hypervisor/arch/x86/svm.c
index d830f8bc..c125c0da 100644
--- a/hypervisor/arch/x86/svm.c
+++ b/hypervisor/arch/x86/svm.c
@@ -559,24 +559,29 @@ void vcpu_vendor_reset(unsigned int sipi_vector)
        };
        struct per_cpu *cpu_data = this_cpu_data();
        struct vmcb *vmcb = &cpu_data->vmcb;
-       unsigned long val;
+       unsigned long reset_addr;
 
        vmcb->cr0 = X86_CR0_NW | X86_CR0_CD | X86_CR0_ET;
        vmcb->cr3 = 0;
        vmcb->cr4 = 0;
 
        vmcb->rflags = 0x02;
+       vmcb->rsp = 0;
 
-       val = 0;
        if (sipi_vector == APIC_BSP_PSEUDO_SIPI) {
-               val = 0xfff0;
-               sipi_vector = 0xf0;
+               reset_addr = this_cell()->config->cpu_reset_address;
+
+               vmcb->rip = reset_addr & 0xffff;
+
+               vmcb->cs.selector = (reset_addr >> 4) & 0xf000;
+               vmcb->cs.base = reset_addr & ~0xffffL;
+       } else {
+               vmcb->rip = 0;
+
+               vmcb->cs.selector = sipi_vector << 8;
+               vmcb->cs.base = sipi_vector << 12;
        }
-       vmcb->rip = val;
-       vmcb->rsp = 0;
 
-       vmcb->cs.selector = sipi_vector << 8;
-       vmcb->cs.base = sipi_vector << 12;
        vmcb->cs.limit = 0xffff;
        vmcb->cs.access_rights = 0x009b;
 
diff --git a/hypervisor/arch/x86/vmx.c b/hypervisor/arch/x86/vmx.c
index 0ee944ff..a549f899 100644
--- a/hypervisor/arch/x86/vmx.c
+++ b/hypervisor/arch/x86/vmx.c
@@ -792,7 +792,7 @@ void __attribute__((noreturn)) vcpu_deactivate_vmm(void)
 
 void vcpu_vendor_reset(unsigned int sipi_vector)
 {
-       unsigned long val;
+       unsigned long reset_addr, val;
        bool ok = true;
 
        ok &= vmx_set_guest_cr(CR0_IDX, X86_CR0_NW | X86_CR0_CD | X86_CR0_ET);
@@ -803,18 +803,24 @@ void vcpu_vendor_reset(unsigned int sipi_vector)
        ok &= vmcs_write64(GUEST_RFLAGS, 0x02);
        ok &= vmcs_write64(GUEST_RSP, 0);
 
-       val = 0;
        if (sipi_vector == APIC_BSP_PSEUDO_SIPI) {
-               val = 0xfff0;
-               sipi_vector = 0xf0;
-
                /* only cleared on hard reset */
                ok &= vmcs_write64(GUEST_IA32_DEBUGCTL, 0);
+
+               reset_addr = this_cell()->config->cpu_reset_address;
+
+               ok &= vmcs_write64(GUEST_RIP, reset_addr & 0xffff);
+
+               ok &= vmcs_write16(GUEST_CS_SELECTOR,
+                                  (reset_addr >> 4) & 0xf000);
+               ok &= vmcs_write64(GUEST_CS_BASE, reset_addr & ~0xffffL);
+       } else {
+               ok &= vmcs_write64(GUEST_RIP, 0);
+
+               ok &= vmcs_write16(GUEST_CS_SELECTOR, sipi_vector << 8);
+               ok &= vmcs_write64(GUEST_CS_BASE, sipi_vector << 12);
        }
-       ok &= vmcs_write64(GUEST_RIP, val);
 
-       ok &= vmcs_write16(GUEST_CS_SELECTOR, sipi_vector << 8);
-       ok &= vmcs_write64(GUEST_CS_BASE, sipi_vector << 12);
        ok &= vmcs_write32(GUEST_CS_LIMIT, 0xffff);
        ok &= vmcs_write32(GUEST_CS_AR_BYTES, 0x0009b);
 
-- 
2.12.3

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to