On 2017-10-29 09:51, Schild, Henning wrote:
> Looks like the configuration generator needs updating as well.

Actually no: We do not evaluate cpu_reset_address over root cells.
That's why the patch only changes non-root cell configs.

Jan

> 
> Sent from a phone
> 
> -----Original Message-----
> *From:* Jan Kiszka [[email protected]]
> *Received:* Sonntag, 22 Okt. 2017, 14:36
> *To:* Jailhouse [[email protected]]
> *Subject:* [PATCH 2/2] x86, configs: Make CPU reset address configurable
> 
> 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.

-- 
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