All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alejandro Vallejo" <alejandro.vallejo@cloud.com>
To: "Teddy Astie" <teddy.astie@vates.tech>, <xen-devel@lists.xenproject.org>
Cc: "Jan Beulich" <jbeulich@suse.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>,
	"Paul Durrant" <paul@xen.org>
Subject: Re: [XEN PATCH] x86/hvm: Use constants for x86 modes
Date: Thu, 31 Oct 2024 14:51:53 +0000	[thread overview]
Message-ID: <D5A2R6GG6WP3.15A2Z1QLB1KFJ@cloud.com> (raw)
In-Reply-To: <0ffcb0031eaa095b5864735d2f9edbe1d374e009.1730380434.git.teddy.astie@vates.tech>

On Thu Oct 31, 2024 at 1:27 PM GMT, Teddy Astie wrote:
> In many places of x86 HVM code, constants integer are used to indicate in what mode is
> running the CPU (real, v86, 16-bits, 32-bits, 64-bits). However, these constants are
> are written directly as integer which hides the actual meaning of these modes.

Ew. Good riddance. Just a couple of nits...

>
> This patch introduces X86_MODE_* macros and replace those occurences with it.
>
> Signed-off-by Teddy Astie <teddy.astie@vates.tech>
> ---
> I am not sure of other places that uses these integer constants.
> ---
>  xen/arch/x86/hvm/emulate.c           | 16 ++++++++--------
>  xen/arch/x86/hvm/hypercall.c         | 13 +++++++------
>  xen/arch/x86/hvm/viridian/viridian.c |  9 +++++----
>  xen/arch/x86/hvm/vmx/vmx.c           |  9 +++++----
>  xen/arch/x86/hvm/vmx/vvmx.c          |  5 +++--
>  xen/arch/x86/include/asm/hvm/hvm.h   |  6 ++++++
>  6 files changed, 34 insertions(+), 24 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
> index ecf83795fa..60a7c15bdc 100644
> --- a/xen/arch/x86/hvm/emulate.c
> +++ b/xen/arch/x86/hvm/emulate.c
> @@ -2433,14 +2433,14 @@ static void cf_check hvmemul_put_fpu(
>
>          switch ( mode )
>          {
> -        case 8:
> +        case X86_MODE_64BIT:
>              fpu_ctxt->fip.addr = aux->ip;
>              if ( dval )
>                  fpu_ctxt->fdp.addr = aux->dp;
>              fpu_ctxt->x[FPU_WORD_SIZE_OFFSET] = 8;
>              break;
>
> -        case 4: case 2:
> +        case X86_MODE_32BIT: case X86_MODE_16BIT:
                               ^
                               |
nit: Good time to add newline here...

>              fpu_ctxt->fip.offs = aux->ip;
>              fpu_ctxt->fip.sel  = aux->cs;
>              if ( dval )
> @@ -2451,7 +2451,7 @@ static void cf_check hvmemul_put_fpu(
>              fpu_ctxt->x[FPU_WORD_SIZE_OFFSET] = mode;
>              break;
>
> -        case 0: case 1:
> +        case X86_MODE_REAL: case X86_MODE_V86:
                              ^
                              |
          +-------------------+
          |
... and here.

>              fpu_ctxt->fip.addr = aux->ip | (aux->cs << 4);
>              if ( dval )
>                  fpu_ctxt->fdp.addr = aux->dp | (aux->ds << 4);
> @@ -2952,11 +2952,11 @@ static const char *guest_x86_mode_to_str(int mode)
>  {
>      switch ( mode )
>      {
> -    case 0:  return "Real";
> -    case 1:  return "v86";
> -    case 2:  return "16bit";
> -    case 4:  return "32bit";
> -    case 8:  return "64bit";
> +    case X86_MODE_REAL:  return "Real";
> +    case X86_MODE_V86:  return "v86";
> +    case X86_MODE_16BIT:  return "16bit";
> +    case X86_MODE_32BIT:  return "32bit";
> +    case X86_MODE_64BIT:  return "64bit";
>      default: return "Unknown";
>      }
>  }
> diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> index 81883c8d4f..e0e9bcd22d 100644
> --- a/xen/arch/x86/hvm/hypercall.c
> +++ b/xen/arch/x86/hvm/hypercall.c
> @@ -11,6 +11,7 @@
>  #include <xen/ioreq.h>
>  #include <xen/nospec.h>
>
> +#include <asm/hvm/hvm.h>
>  #include <asm/hvm/emulate.h>
>  #include <asm/hvm/support.h>
>  #include <asm/hvm/viridian.h>
> @@ -112,23 +113,23 @@ int hvm_hypercall(struct cpu_user_regs *regs)
>
>      switch ( mode )
>      {
> -    case 8:
> +    case X86_MODE_64BIT:
>          eax = regs->rax;
>          fallthrough;
> -    case 4:
> -    case 2:
> +    case X86_MODE_32BIT:
> +    case X86_MODE_16BIT:
>          if ( currd->arch.monitor.guest_request_userspace_enabled &&
>              eax == __HYPERVISOR_hvm_op &&
> -            (mode == 8 ? regs->rdi : regs->ebx) == HVMOP_guest_request_vm_event )
> +            (mode == X86_MODE_64BIT ? regs->rdi : regs->ebx) == HVMOP_guest_request_vm_event )
>              break;
>
>          if ( likely(!hvm_get_cpl(curr)) )
>              break;
>          fallthrough;
> -    default:
> +    case X86_MODE_V86:
>          regs->rax = -EPERM;
>          return HVM_HCALL_completed;
> -    case 0:
> +    case X86_MODE_REAL:
>          break;
>      }
>
> diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c
> index 21480d9ee7..0e3b824bf0 100644
> --- a/xen/arch/x86/hvm/viridian/viridian.c
> +++ b/xen/arch/x86/hvm/viridian/viridian.c
> @@ -16,6 +16,7 @@
>  #include <asm/paging.h>
>  #include <asm/p2m.h>
>  #include <asm/apic.h>
> +#include <asm/hvm/hvm.h>
>  #include <public/sched.h>
>  #include <public/hvm/hvm_op.h>
>
> @@ -933,13 +934,13 @@ int viridian_hypercall(struct cpu_user_regs *regs)
>
>      switch ( mode )
>      {
> -    case 8:
> +    case X86_MODE_64BIT:
>          input.raw = regs->rcx;
>          input_params_gpa = regs->rdx;
>          output_params_gpa = regs->r8;
>          break;
>
> -    case 4:
> +    case X86_MODE_32BIT:
>          input.raw = (regs->rdx << 32) | regs->eax;
>          input_params_gpa = (regs->rbx << 32) | regs->ecx;
>          output_params_gpa = (regs->rdi << 32) | regs->esi;
> @@ -1038,11 +1039,11 @@ int viridian_hypercall(struct cpu_user_regs *regs)
>
>      switch ( mode )
>      {
> -    case 8:
> +    case X86_MODE_64BIT:
>          regs->rax = output.raw;
>          break;
>
> -    case 4:
> +    case X86_MODE_32BIT:
>          regs->rdx = output.raw >> 32;
>          regs->rax = (uint32_t)output.raw;
>          break;
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index 12f8a66458..b77f135a2d 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -886,14 +886,15 @@ int cf_check vmx_guest_x86_mode(struct vcpu *v)
>      unsigned long cs_ar_bytes;
>
>      if ( unlikely(!(v->arch.hvm.guest_cr[0] & X86_CR0_PE)) )
> -        return 0;
> +        return X86_MODE_REAL;
>      if ( unlikely(guest_cpu_user_regs()->eflags & X86_EFLAGS_VM) )
> -        return 1;
> +        return X86_MODE_V86;
>      __vmread(GUEST_CS_AR_BYTES, &cs_ar_bytes);
>      if ( hvm_long_mode_active(v) &&
>           likely(cs_ar_bytes & X86_SEG_AR_CS_LM_ACTIVE) )
> -        return 8;
> -    return (likely(cs_ar_bytes & X86_SEG_AR_DEF_OP_SIZE) ? 4 : 2);
> +        return X86_MODE_64BIT;
> +    return (likely(cs_ar_bytes & X86_SEG_AR_DEF_OP_SIZE)
> +            ? X86_MODE_32BIT : X86_MODE_16BIT);
>  }
>
>  static void vmx_save_dr(struct vcpu *v)
> diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
> index c05e0e9326..5032fc3a45 100644
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -411,7 +411,7 @@ static int decode_vmx_inst(struct cpu_user_regs *regs,
>      }
>      else
>      {
> -        bool mode_64bit = (vmx_guest_x86_mode(v) == 8);
> +        bool mode_64bit = (vmx_guest_x86_mode(v) == X86_MODE_64BIT);
>
>          decode->type = VMX_INST_MEMREG_TYPE_MEMORY;
>
> @@ -2073,7 +2073,8 @@ int nvmx_handle_vmx_insn(struct cpu_user_regs *regs, unsigned int exit_reason)
>
>      if ( !(curr->arch.hvm.guest_cr[4] & X86_CR4_VMXE) ||
>           !nestedhvm_enabled(curr->domain) ||
> -         (vmx_guest_x86_mode(curr) < (hvm_long_mode_active(curr) ? 8 : 2)) ||
> +         (vmx_guest_x86_mode(curr) < (hvm_long_mode_active(curr) ? X86_MODE_64BIT
> +                                                                 : X86_MODE_16BIT)) ||
>           (exit_reason != EXIT_REASON_VMXON && !nvmx_vcpu_in_vmx(curr)) )
>      {
>          hvm_inject_hw_exception(X86_EXC_UD, X86_EVENT_NO_EC);
> diff --git a/xen/arch/x86/include/asm/hvm/hvm.h b/xen/arch/x86/include/asm/hvm/hvm.h
> index dd7d4872b5..29ae23617e 100644
> --- a/xen/arch/x86/include/asm/hvm/hvm.h
> +++ b/xen/arch/x86/include/asm/hvm/hvm.h
> @@ -26,6 +26,12 @@ extern bool opt_hvm_fep;
>  #define opt_hvm_fep 0
>  #endif
>
> +#define X86_MODE_REAL  0
> +#define X86_MODE_V86   1
> +#define X86_MODE_16BIT 2
> +#define X86_MODE_32BIT 4
> +#define X86_MODE_64BIT 8
> +
>  /* Interrupt acknowledgement sources. */
>  enum hvm_intsrc {
>      hvm_intsrc_none,
> --
> 2.45.2
>
>
>
> Teddy Astie | Vates XCP-ng Intern
>
> XCP-ng & Xen Orchestra - Vates solutions
>
> web: https://vates.tech

Cheers,
Alejandro



      parent reply	other threads:[~2024-10-31 14:52 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-31 13:27 [XEN PATCH] x86/hvm: Use constants for x86 modes Teddy Astie
2024-10-31 14:13 ` Andrew Cooper
2024-10-31 14:17   ` Jan Beulich
2024-10-31 14:21 ` Jan Beulich
2024-10-31 14:51 ` Alejandro Vallejo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D5A2R6GG6WP3.15A2Z1QLB1KFJ@cloud.com \
    --to=alejandro.vallejo@cloud.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=paul@xen.org \
    --cc=roger.pau@citrix.com \
    --cc=teddy.astie@vates.tech \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.