diff mbox series

x86/trampoline: Change type of trampoline_phys to uint32_t

Message ID 20241111104902.985611-1-andrew.cooper3@citrix.com (mailing list archive)
State New
Headers show
Series x86/trampoline: Change type of trampoline_phys to uint32_t | expand

Commit Message

Andrew Cooper Nov. 11, 2024, 10:49 a.m. UTC
As now documented, this variable holds a page aligned value less than 1M.

However, head.S fills it using 4-byte stores, and reloc_trampoline() is
compiled for both 32bit and 64bit, where unsigned long is a different size.

This happens to work because of the range of the value, but switch to uint32_t
to make it explicit.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Frediano Ziglio <frediano.ziglio@cloud.com>

Bloat-o-meter reports a marginal code-gen improvement:

  add/remove: 0/0 grow/shrink: 5/7 up/down: 26/-85 (-59)
  Function                                     old     new   delta
  enter_state_helper.cold                     1091    1100      +9
  __start_xen                                 8827    8835      +8
  __cpu_up.cold                                199     204      +5
  intel_unlock_cpuid_leaves                    102     104      +2
  acpi_enter_sleep_state                       397     399      +2
  efi_arch_memory_setup                        538     537      -1
  arch_init_memory                             632     631      -1
  trampoline_phys                                8       4      -4
  do_platform_op                              5439    5431      -8
  compat_platform_op                          5450    5442      -8
  reloc_trampoline64                           137     122     -15
  __cpu_up                                    1513    1465     -48
---
 xen/arch/x86/boot/reloc-trampoline.c  | 2 +-
 xen/arch/x86/efi/efi-boot.h           | 2 +-
 xen/arch/x86/include/asm/trampoline.h | 2 +-
 xen/arch/x86/smpboot.c                | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

Comments

Jan Beulich Nov. 11, 2024, 12:14 p.m. UTC | #1
On 11.11.2024 11:49, Andrew Cooper wrote:
> As now documented, this variable holds a page aligned value less than 1M.
> 
> However, head.S fills it using 4-byte stores, and reloc_trampoline() is
> compiled for both 32bit and 64bit, where unsigned long is a different size.
> 
> This happens to work because of the range of the value, but switch to uint32_t
> to make it explicit.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Acked-by: Jan Beulich <jbeulich@suse.com>
noting that ...

> --- a/xen/arch/x86/boot/reloc-trampoline.c
> +++ b/xen/arch/x86/boot/reloc-trampoline.c
> @@ -15,7 +15,7 @@ void reloc_trampoline64(void)
>  #error Unknown architecture
>  #endif
>  {
> -    unsigned long phys = trampoline_phys;
> +    uint32_t phys = trampoline_phys;
>      const int32_t *trampoline_ptr;

... this change shouldn't really be needed (but is okay-ish to have).

Jan
diff mbox series

Patch

diff --git a/xen/arch/x86/boot/reloc-trampoline.c b/xen/arch/x86/boot/reloc-trampoline.c
index 0a74c1e75a4c..d5548eb08f85 100644
--- a/xen/arch/x86/boot/reloc-trampoline.c
+++ b/xen/arch/x86/boot/reloc-trampoline.c
@@ -15,7 +15,7 @@  void reloc_trampoline64(void)
 #error Unknown architecture
 #endif
 {
-    unsigned long phys = trampoline_phys;
+    uint32_t phys = trampoline_phys;
     const int32_t *trampoline_ptr;
 
     /*
diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
index 3133985c88f8..7930b7c73892 100644
--- a/xen/arch/x86/efi/efi-boot.h
+++ b/xen/arch/x86/efi/efi-boot.h
@@ -235,7 +235,7 @@  static void __init noreturn efi_arch_post_exit_boot(void)
     u64 cr4 = XEN_MINIMAL_CR4 & ~X86_CR4_PGE, efer;
 
     efi_arch_relocate_image(__XEN_VIRT_START - xen_phys_start);
-    memcpy((void *)trampoline_phys, trampoline_start, cfg.size);
+    memcpy(_p(trampoline_phys), trampoline_start, cfg.size);
 
     /*
      * We're in physical mode right now (i.e. identity map), so a regular
diff --git a/xen/arch/x86/include/asm/trampoline.h b/xen/arch/x86/include/asm/trampoline.h
index 838c2f0b6fcd..8c1e0b48c2c9 100644
--- a/xen/arch/x86/include/asm/trampoline.h
+++ b/xen/arch/x86/include/asm/trampoline.h
@@ -52,7 +52,7 @@  extern char trampoline_start[], trampoline_end[];
  * the 1M boundary (as the trampoline contains 16-bit code), and must be 4k
  * aligned (SIPI requirement for APs).
  */
-extern unsigned long trampoline_phys;
+extern uint32_t trampoline_phys;
 
 /*
  * Calculate the physical address of a symbol in the trampoline.
diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
index 9e79c1a6d6e6..7f0f57bb8ffe 100644
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -39,7 +39,7 @@ 
 #include <irq_vectors.h>
 #include <mach_apic.h>
 
-unsigned long __read_mostly trampoline_phys;
+uint32_t __ro_after_init trampoline_phys;
 enum ap_boot_method __read_mostly ap_boot_method = AP_BOOT_NORMAL;
 
 /* representing HT siblings of each logical CPU */