|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/3] xen/ppc: Set up a basic C environment
On 7/17/23 10:38 AM, Jan Beulich wrote:
> On 06.07.2023 21:04, Shawn Anastasio wrote:
>> --- a/xen/arch/ppc/include/asm/config.h
>> +++ b/xen/arch/ppc/include/asm/config.h
>> @@ -43,7 +43,7 @@
>>
>> #define SMP_CACHE_BYTES (1 << 6)
>>
>> -#define STACK_ORDER 2
>> +#define STACK_ORDER 0
>> #define STACK_SIZE (PAGE_SIZE << STACK_ORDER)
>
> In which way is this related to the change at hand? Aren't you going to
> need to undo this rather sooner than later?
I noticed the stack order being too large when I moved the stack
declaration to .c per Andrew's recommendation for v2. Since we're using
64k pages, I don't see why the stack would need to be this big. A quick
look at ARM shows they have a stack order of 3, which would yield a
stack size of just 32k.
>> --- a/xen/arch/ppc/ppc64/head.S
>> +++ b/xen/arch/ppc/ppc64/head.S
>> @@ -1,30 +1,30 @@
>> /* SPDX-License-Identifier: GPL-2.0-or-later */
>>
>> +#include <asm/asm-defns.h>
>> +
>> .section .text.header, "ax", %progbits
>>
>> ENTRY(start)
>> /*
>> - * Depending on how we were booted, the CPU could be running in either
>> - * Little Endian or Big Endian mode. The following trampoline from Linux
>> - * cleverly uses an instruction that encodes to a NOP if the CPU's
>> - * endianness matches the assumption of the assembler (LE, in our case)
>> - * or a branch to code that performs the endian switch in the other
>> case.
>> + * NOTE: argument registers (r3-r9) must be preserved until the C
>> entrypoint
>> */
>> - tdi 0, 0, 0x48 /* Reverse endian of b . + 8 */
>> - b . + 44 /* Skip trampoline if endian is good */
>> - .long 0xa600607d /* mfmsr r11 */
>> - .long 0x01006b69 /* xori r11,r11,1 */
>> - .long 0x00004039 /* li r10,0 */
>> - .long 0x6401417d /* mtmsrd r10,1 */
>> - .long 0x05009f42 /* bcl 20,31,$+4 */
>> - .long 0xa602487d /* mflr r10 */
>> - .long 0x14004a39 /* addi r10,r10,20 */
>> - .long 0xa6035a7d /* mtsrr0 r10 */
>> - .long 0xa6037b7d /* mtsrr1 r11 */
>> - .long 0x2400004c /* rfid */
>> -
>> - /* Now that the endianness is confirmed, continue */
>> -1: b 1b
>> + FIXUP_ENDIAN
>> +
>> + /* set up the TOC pointer */
>> + LOAD_IMM32(%r2, .TOC.)
>> +
>> + /* set up the initial stack */
>> + LOAD_IMM32(%r1, cpu0_boot_stack)
>
> Wouldn't this (and perhaps also .TOC.) better be calculated in a
> PC-relative manner? Or is the plan to have Xen linked to an address
> below 4Gb?
As mentioned previously, I am planning to enable the PIC code model in
my next series in order to accommodate booting on the PowerNV firmware
type which has a different load address. That patch will change the
initial TOC load to a simulated PC-relative one (pre-POWER10 doesn't
have proper PC-relative loads/stores) and the rest to TOC-relative.
>> + li %r11, 0
>> + stdu %r11, -STACK_FRAME_OVERHEAD(%r1)
>> +
>> + /* call the C entrypoint */
>> + bl start_xen
>> +
>> + /* should never return */
>> + trap
>>
>> .size start, . - start
>> .type start, %function
>> +
>> + .section .init.data, "aw", @progbits
>
> What's this good for when no data follows?
Good catch. With the stack no longer declared in head.S this is
unnecessary. Will remove in v3.
>> --- /dev/null
>> +++ b/xen/arch/ppc/setup.c
>> @@ -0,0 +1,19 @@
>> +/* SPDX-License-Identifier: GPL-2.0-or-later */
>> +#include <xen/init.h>
>> +
>> +/* Xen stack for bringing up the first CPU. */
>> +unsigned char __initdata cpu0_boot_stack[STACK_SIZE] __aligned(STACK_SIZE);
>
> This yields the entire array as zero-initialized. At which point I
> don't see a need for the store in head.S.
Okay, fair enough. Given that the array is zero-initialized the stdu
could be replaced with an `addi %r1, %r1, -STACK_FRAME_OVERHEAD`, and
the load of zero to %r11 could be deferred to the second patch in this
series where it's used in the .bss clearing loop.
That said I don't really see the harm with keeping the standard
idiomatic `stdu` for the initial stack frame setup. Other than
performance, which isn't a concern here in early setup code.
>> +/* Macro to adjust thread priority for hardware multithreading */
>> +#define HMT_very_low() asm volatile (" or %r31, %r31, %r31 ")
>
> Nit: Style. Wants to be
>
> #define HMT_very_low() asm volatile ( "or %r31, %r31, %r31" )
Will fix in v3.
> Jan
Thanks,
Shawn
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |