[PATCH] ARM: hyp-stub: Fix Thumb-2 compilation

Marc Zyngier marc.zyngier at arm.com
Thu Apr 20 10:56:50 EDT 2017


On 20/04/17 12:23, Christoffer Dall wrote:
> On Thu, Apr 20, 2017 at 11:16:20AM +0100, Marc Zyngier wrote:
>> The assembler defaults to emiting the short form of ADR, leading
>> to an out-of-range immediate. Using the wide version solves this
>> issue.
>>
>> Fixes: bc845e4fbbbb ("ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code")
>> Reported-by: Arnd Bergmann <arnd at arndb.de>
>> Signed-off-by: Marc Zyngier <marc.zyngier at arm.com>
>> ---
>>  arch/arm/kernel/hyp-stub.S | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
>> index d8523cc47a54..ec7e7377d423 100644
>> --- a/arch/arm/kernel/hyp-stub.S
>> +++ b/arch/arm/kernel/hyp-stub.S
>> @@ -125,7 +125,7 @@ ENTRY(__hyp_stub_install_secondary)
>>   * (see safe_svcmode_maskall).
>>   */
>>  	@ Now install the hypervisor stub:
>> -	adr	r7, __hyp_stub_vectors
>> +	W(adr)	r7, __hyp_stub_vectors
>>  	mcr	p15, 4, r7, c12, c0, 0	@ set hypervisor vector base (HVBAR)
>>  
>>  	@ Disable all traps, so we don't get any nasty surprise
>> -- 
>> 2.11.0
>>
> 
> This fixes the compile, but I get this when booting it on TC2:
> 
> kvm [1]: 8-bit VMID
> kvm [1]: IDMAP page: 80201000
> kvm [1]: HYP VA range: 80000000:ffffffff
> kvm [1]: Hyp mode initialized successfully
> kvm [1]: vgic-v2 at 2c004000
> kvm [1]: vgic interrupt IRQ16
> kvm [1]: virtual timer IRQ19
> Kernel panic - not syncing:
> HYP panic: UNDEF PC:802010ac CPSR:800001da
> CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.11.0-rc3+ #140
> Hardware name: ARM-Versatile Express
> [<8021c5f1>] (unwind_backtrace) from [<802199eb>] (show_stack+0xb/0xc)
> [<802199eb>] (show_stack) from [<803ccc15>] (dump_stack+0x71/0x80)
> [<803ccc15>] (dump_stack) from [<80289467>] (panic+0xbb/0x1d4)
> [<80289467>] (panic) from [<8020b1f5>]
> (_kvm_arch_hardware_disable+0x11/0x20)
> [<8020b1f5>] (_kvm_arch_hardware_disable) from [<8026c497>]
> (flush_smp_call_function_queue+0x77/0x134)
> [<8026c497>] (flush_smp_call_function_queue) from [<8021b8f9>]
> (handle_IPI+0xd9/0x150)
> [<8021b8f9>] (handle_IPI) from [<80201425>] (gic_handle_irq+0x65/0x6c)
> [<80201425>] (gic_handle_irq) from [<8021a213>] (__irq_svc+0x53/0x7c)
> Exception stack(0x80a01f18 to 0x80a01f60)
> 1f00:                                                       00000001
> 00000000
> 1f20: 80a01f70 802231c1 00000000 80a00000 00000000 80a03c80 80a03c34
> 808445d8
> 1f40: 80a01f70 80a03c88 805b31d1 80a01f68 80217ce1 80217ce2 40000033
> ffffffff
> [<8021a213>] (__irq_svc) from [<80217ce2>] (arch_cpu_idle+0x22/0x24)
> [<80217ce2>] (arch_cpu_idle) from [<8024ca89>] (do_idle+0xf9/0x158)
> [<8024ca89>] (do_idle) from [<8024ccaf>] (cpu_startup_entry+0x13/0x14)
> [<8024ccaf>] (cpu_startup_entry) from [<80800a4d>]
> (start_kernel+0x309/0x314)
> [<80800a4d>] (start_kernel) from [<80008095>] (0x80008095)
> CPU1: stopping
> CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.11.0-rc3+ #140
> Hardware name: ARM-Versatile Express
> [<8021c5f1>] (unwind_backtrace) from [<802199eb>] (show_stack+0xb/0xc)
> [<802199eb>] (show_stack) from [<803ccc15>] (dump_stack+0x71/0x80)
> [<803ccc15>] (dump_stack) from [<8021b95d>] (handle_IPI+0x13d/0x150)
> [<8021b95d>] (handle_IPI) from [<80201425>] (gic_handle_irq+0x65/0x6c)
> [<80201425>] (gic_handle_irq) from [<8021a213>] (__irq_svc+0x53/0x7c)
> Exception stack(0xeec47e20 to 0xeec47e68)
> 7e20: 00000000 ef1a96dc 80000000 80000000 80a03de4 80a03cf8 ef1b5a84
> ef1b5a80
> 7e40: 00000001 00000008 80a03de4 80845a00 00000000 eec47e70 8026c9ed
> 8026ca02
> 7e60: a0000033 ffffffff
> [<8021a213>] (__irq_svc) from [<8026ca02>]
> (smp_call_function_many+0x1aa/0x1f0)
> [<8026ca02>] (smp_call_function_many) from [<8026ca89>]
> (on_each_cpu+0x1d/0x30)
> [<8026ca89>] (on_each_cpu) from [<8020c369>] (kvm_arch_init+0x339/0x3fc)
> [<8020c369>] (kvm_arch_init) from [<80207149>] (kvm_init+0x11/0x214)
> [<80207149>] (kvm_init) from [<8020177d>] (do_one_initcall+0x2d/0x104)
> [<8020177d>] (do_one_initcall) from [<80800bed>]
> (kernel_init_freeable+0x195/0x208)
> [<80800bed>] (kernel_init_freeable) from [<805b2383>]
> (kernel_init+0x7/0xd4)
> [<805b2383>] (kernel_init) from [<80217361>] (ret_from_fork+0x11/0x30)
> SMP: failed to stop secondary CPUs
> ---[ end Kernel panic - not syncing:
> HYP panic: UNDEF PC:802010ac CPSR:800001da

Grmbl... We inadvertently switched to ARM by applying a pretty silly
correction to the target PC when branching to the stub, while the
assembler has already provided us with a valid Thumb address.

/me hates Thumb, patch incoming.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...



More information about the linux-arm-kernel mailing list