Message ID | 20240510160602.1311352-3-romank@linux.microsoft.com |
---|---|
State | Superseded |
Headers | show |
Series | arm64/hyperv: Support Virtual Trust Level boot | expand |
Hi, kernel test robot noticed the following build errors: [auto build test ERROR on arm64/for-next/core] [also build test ERROR on arnd-asm-generic/master linus/master v6.9-rc7 next-20240510] [cannot apply to tip/x86/core] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/romank-linux-microsoft-com/arm64-hyperv-Support-DeviceTree/20240511-000917 base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core patch link: https://lore.kernel.org/r/20240510160602.1311352-3-romank%40linux.microsoft.com patch subject: [PATCH 2/6] drivers/hv: Enable VTL mode for arm64 config: i386-allmodconfig (https://download.01.org/0day-ci/archive/20240512/202405121034.fVYQIs8h-lkp@intel.com/config) compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240512/202405121034.fVYQIs8h-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202405121034.fVYQIs8h-lkp@intel.com/ All error/warnings (new ones prefixed by >>): arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_system_desc_base': >> arch/x86/hyperv/hv_vtl.c:54:28: error: 'struct ldttss_desc' has no member named 'base3'; did you mean 'base0'? 54 | return ((u64)desc->base3 << 32) | ((u64)desc->base2 << 24) | | ^~~~~ | base0 arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_ap_entry': >> arch/x86/hyperv/hv_vtl.c:66:35: error: 'secondary_startup_64' undeclared (first use in this function); did you mean 'secondary_startup_64_fn'? 66 | ((secondary_startup_64_fn)secondary_startup_64)(&boot_params, &boot_params); | ^~~~~~~~~~~~~~~~~~~~ | secondary_startup_64_fn arch/x86/hyperv/hv_vtl.c:66:35: note: each undeclared identifier is reported only once for each function it appears in arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_bringup_vcpu': >> arch/x86/hyperv/hv_vtl.c:86:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 86 | u64 rip = (u64)&hv_vtl_ap_entry; | ^ arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_system_desc_base': >> arch/x86/hyperv/hv_vtl.c:56:1: warning: control reaches end of non-void function [-Wreturn-type] 56 | } | ^ vim +54 arch/x86/hyperv/hv_vtl.c 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 51 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 52 static inline u64 hv_vtl_system_desc_base(struct ldttss_desc *desc) 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 53 { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 @54 return ((u64)desc->base3 << 32) | ((u64)desc->base2 << 24) | 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 55 (desc->base1 << 16) | desc->base0; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 @56 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 57 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 58 static inline u32 hv_vtl_system_desc_limit(struct ldttss_desc *desc) 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 59 { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 60 return ((u32)desc->limit1 << 16) | (u32)desc->limit0; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 61 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 62 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 63 typedef void (*secondary_startup_64_fn)(void*, void*); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 64 static void hv_vtl_ap_entry(void) 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 65 { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 @66 ((secondary_startup_64_fn)secondary_startup_64)(&boot_params, &boot_params); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 67 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 68 2b4b90e053a290 Saurabh Sengar 2024-03-03 69 static int hv_vtl_bringup_vcpu(u32 target_vp_index, int cpu, u64 eip_ignored) 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 70 { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 71 u64 status; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 72 int ret = 0; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 73 struct hv_enable_vp_vtl *input; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 74 unsigned long irq_flags; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 75 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 76 struct desc_ptr gdt_ptr; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 77 struct desc_ptr idt_ptr; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 78 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 79 struct ldttss_desc *tss; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 80 struct ldttss_desc *ldt; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 81 struct desc_struct *gdt; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 82 2b4b90e053a290 Saurabh Sengar 2024-03-03 83 struct task_struct *idle = idle_thread_get(cpu); 2b4b90e053a290 Saurabh Sengar 2024-03-03 84 u64 rsp = (unsigned long)idle->thread.sp; 2b4b90e053a290 Saurabh Sengar 2024-03-03 85 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 @86 u64 rip = (u64)&hv_vtl_ap_entry; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 87 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 88 native_store_gdt(&gdt_ptr); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 89 store_idt(&idt_ptr); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 90 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 91 gdt = (struct desc_struct *)((void *)(gdt_ptr.address)); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 92 tss = (struct ldttss_desc *)(gdt + GDT_ENTRY_TSS); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 93 ldt = (struct ldttss_desc *)(gdt + GDT_ENTRY_LDT); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 94 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 95 local_irq_save(irq_flags); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 96 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 97 input = *this_cpu_ptr(hyperv_pcpu_input_arg); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 98 memset(input, 0, sizeof(*input)); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 99 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 100 input->partition_id = HV_PARTITION_ID_SELF; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 101 input->vp_index = target_vp_index; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 102 input->target_vtl.target_vtl = HV_VTL_MGMT; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 103 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 104 /* 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 105 * The x86_64 Linux kernel follows the 16-bit -> 32-bit -> 64-bit 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 106 * mode transition sequence after waking up an AP with SIPI whose 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 107 * vector points to the 16-bit AP startup trampoline code. Here in 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 108 * VTL2, we can't perform that sequence as the AP has to start in 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 109 * the 64-bit mode. 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 110 * 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 111 * To make this happen, we tell the hypervisor to load a valid 64-bit 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 112 * context (most of which is just magic numbers from the CPU manual) 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 113 * so that AP jumps right to the 64-bit entry of the kernel, and the 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 114 * control registers are loaded with values that let the AP fetch the 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 115 * code and data and carry on with work it gets assigned. 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 116 */ 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 117 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 118 input->vp_context.rip = rip; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 119 input->vp_context.rsp = rsp; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 120 input->vp_context.rflags = 0x0000000000000002; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 121 input->vp_context.efer = __rdmsr(MSR_EFER); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 122 input->vp_context.cr0 = native_read_cr0(); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 123 input->vp_context.cr3 = __native_read_cr3(); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 124 input->vp_context.cr4 = native_read_cr4(); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 125 input->vp_context.msr_cr_pat = __rdmsr(MSR_IA32_CR_PAT); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 126 input->vp_context.idtr.limit = idt_ptr.size; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 127 input->vp_context.idtr.base = idt_ptr.address; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 128 input->vp_context.gdtr.limit = gdt_ptr.size; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 129 input->vp_context.gdtr.base = gdt_ptr.address; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 130 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 131 /* Non-system desc (64bit), long, code, present */ 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 132 input->vp_context.cs.selector = __KERNEL_CS; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 133 input->vp_context.cs.base = 0; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 134 input->vp_context.cs.limit = 0xffffffff; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 135 input->vp_context.cs.attributes = 0xa09b; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 136 /* Non-system desc (64bit), data, present, granularity, default */ 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 137 input->vp_context.ss.selector = __KERNEL_DS; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 138 input->vp_context.ss.base = 0; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 139 input->vp_context.ss.limit = 0xffffffff; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 140 input->vp_context.ss.attributes = 0xc093; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 141 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 142 /* System desc (128bit), present, LDT */ 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 143 input->vp_context.ldtr.selector = GDT_ENTRY_LDT * 8; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 144 input->vp_context.ldtr.base = hv_vtl_system_desc_base(ldt); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 145 input->vp_context.ldtr.limit = hv_vtl_system_desc_limit(ldt); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 146 input->vp_context.ldtr.attributes = 0x82; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 147 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 148 /* System desc (128bit), present, TSS, 0x8b - busy, 0x89 -- default */ 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 149 input->vp_context.tr.selector = GDT_ENTRY_TSS * 8; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 150 input->vp_context.tr.base = hv_vtl_system_desc_base(tss); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 151 input->vp_context.tr.limit = hv_vtl_system_desc_limit(tss); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 152 input->vp_context.tr.attributes = 0x8b; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 153 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 154 status = hv_do_hypercall(HVCALL_ENABLE_VP_VTL, input, NULL); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 155 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 156 if (!hv_result_success(status) && 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 157 hv_result(status) != HV_STATUS_VTL_ALREADY_ENABLED) { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 158 pr_err("HVCALL_ENABLE_VP_VTL failed for VP : %d ! [Err: %#llx\n]", 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 159 target_vp_index, status); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 160 ret = -EINVAL; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 161 goto free_lock; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 162 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 163 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 164 status = hv_do_hypercall(HVCALL_START_VP, input, NULL); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 165 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 166 if (!hv_result_success(status)) { 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 167 pr_err("HVCALL_START_VP failed for VP : %d ! [Err: %#llx]\n", 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 168 target_vp_index, status); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 169 ret = -EINVAL; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 170 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 171 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 172 free_lock: 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 173 local_irq_restore(irq_flags); 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 174 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 175 return ret; 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 176 } 3be1bc2fe9d2e4 Saurabh Sengar 2023-04-10 177
On Fri, May 10, 2024 at 09:05:01AM -0700, romank@linux.microsoft.com wrote: > From: Roman Kisel <romank@linux.microsoft.com> > > This change removes dependency on ACPI when buidling the hv drivers to > allow Virtual Trust Level boot with DeviceTree. > > Signed-off-by: Roman Kisel <romank@linux.microsoft.com> > --- > drivers/hv/Kconfig | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig > index 862c47b191af..a5cd1365e248 100644 > --- a/drivers/hv/Kconfig > +++ b/drivers/hv/Kconfig > @@ -5,7 +5,7 @@ menu "Microsoft Hyper-V guest support" > config HYPERV > tristate "Microsoft Hyper-V client drivers" > depends on (X86 && X86_LOCAL_APIC && HYPERVISOR_GUEST) \ > - || (ACPI && ARM64 && !CPU_BIG_ENDIAN) > + || (ARM64 && !CPU_BIG_ENDIAN) > select PARAVIRT > select X86_HV_CALLBACK_VECTOR if X86 > select OF_EARLY_FLATTREE if OF > @@ -15,7 +15,7 @@ config HYPERV > > config HYPERV_VTL_MODE > bool "Enable Linux to boot in VTL context" > - depends on X86_64 && HYPERV > + depends on HYPERV As Ktest bot pointed out, this change broke the build. Thanks, Wei. > depends on SMP > default n > help > @@ -31,7 +31,7 @@ config HYPERV_VTL_MODE > > Select this option to build a Linux kernel to run at a VTL other than > the normal VTL0, which currently is only VTL2. This option > - initializes the x86 platform for VTL2, and adds the ability to boot > + initializes the kernel to run in VTL2, and adds the ability to boot > secondary CPUs directly into 64-bit context as required for VTLs other > than 0. A kernel built with this option must run at VTL2, and will > not run as a normal guest. > -- > 2.45.0 >
On 5/15/2024 12:43 AM, Wei Liu wrote: > On Fri, May 10, 2024 at 09:05:01AM -0700, romank@linux.microsoft.com wrote: >> From: Roman Kisel <romank@linux.microsoft.com> >> >> This change removes dependency on ACPI when buidling the hv drivers to >> allow Virtual Trust Level boot with DeviceTree. >> >> Signed-off-by: Roman Kisel <romank@linux.microsoft.com> >> --- >> drivers/hv/Kconfig | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig >> index 862c47b191af..a5cd1365e248 100644 >> --- a/drivers/hv/Kconfig >> +++ b/drivers/hv/Kconfig >> @@ -5,7 +5,7 @@ menu "Microsoft Hyper-V guest support" >> config HYPERV >> tristate "Microsoft Hyper-V client drivers" >> depends on (X86 && X86_LOCAL_APIC && HYPERVISOR_GUEST) \ >> - || (ACPI && ARM64 && !CPU_BIG_ENDIAN) >> + || (ARM64 && !CPU_BIG_ENDIAN) >> select PARAVIRT >> select X86_HV_CALLBACK_VECTOR if X86 >> select OF_EARLY_FLATTREE if OF >> @@ -15,7 +15,7 @@ config HYPERV >> >> config HYPERV_VTL_MODE >> bool "Enable Linux to boot in VTL context" >> - depends on X86_64 && HYPERV >> + depends on HYPERV > > As Ktest bot pointed out, this change broke the build. > Appreciate your help! I've sent out v2 with the base commit set, and so far, robots have been fine with it :) I haven't noticed an alert of a broken build due to this change. > Thanks, > Wei. > >> depends on SMP >> default n >> help >> @@ -31,7 +31,7 @@ config HYPERV_VTL_MODE >> >> Select this option to build a Linux kernel to run at a VTL other than >> the normal VTL0, which currently is only VTL2. This option >> - initializes the x86 platform for VTL2, and adds the ability to boot >> + initializes the kernel to run in VTL2, and adds the ability to boot >> secondary CPUs directly into 64-bit context as required for VTLs other >> than 0. A kernel built with this option must run at VTL2, and will >> not run as a normal guest. >> -- >> 2.45.0 >>
diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig index 862c47b191af..a5cd1365e248 100644 --- a/drivers/hv/Kconfig +++ b/drivers/hv/Kconfig @@ -5,7 +5,7 @@ menu "Microsoft Hyper-V guest support" config HYPERV tristate "Microsoft Hyper-V client drivers" depends on (X86 && X86_LOCAL_APIC && HYPERVISOR_GUEST) \ - || (ACPI && ARM64 && !CPU_BIG_ENDIAN) + || (ARM64 && !CPU_BIG_ENDIAN) select PARAVIRT select X86_HV_CALLBACK_VECTOR if X86 select OF_EARLY_FLATTREE if OF @@ -15,7 +15,7 @@ config HYPERV config HYPERV_VTL_MODE bool "Enable Linux to boot in VTL context" - depends on X86_64 && HYPERV + depends on HYPERV depends on SMP default n help @@ -31,7 +31,7 @@ config HYPERV_VTL_MODE Select this option to build a Linux kernel to run at a VTL other than the normal VTL0, which currently is only VTL2. This option - initializes the x86 platform for VTL2, and adds the ability to boot + initializes the kernel to run in VTL2, and adds the ability to boot secondary CPUs directly into 64-bit context as required for VTLs other than 0. A kernel built with this option must run at VTL2, and will not run as a normal guest.