|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC for-4.5 2/5] xen/arm32: Introduce lookup_processor_type
On Tue, 2014-02-11 at 20:04 +0000, Julien Grall wrote:
> Looking for a specific proc_info structure is already implemented in assembly.
> Implement lookup_processor_type to avoid duplicate code between C and
> assembly.
>
> This function searches the proc_info_list structure following the processor
> ID. If the search fail, it will return NULL, otherwise a pointer to this
> structure for the specific processor.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> xen/arch/arm/arm32/head.S | 57
> ++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 43 insertions(+), 14 deletions(-)
>
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 77f5518..68fb499 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -198,26 +198,16 @@ skip_bss:
> PRINT("- Setting up control registers -\r\n")
>
> /* Get processor specific proc info into r1 */
> - mrc CP32(r0, MIDR) /* r0 := our cpu id */
> - ldr r1, = __proc_info_start
> - add r1, r1, r10 /* r1 := paddr of table (start)
> */
> - ldr r2, = __proc_info_end
> - add r2, r2, r10 /* r2 := paddr of table (end) */
> -1: ldr r3, [r1, #PROCINFO_cpu_mask]
> - and r4, r0, r3 /* r4 := our cpu id with mask */
> - ldr r3, [r1, #PROCINFO_cpu_val] /* r3 := cpu val in current proc
> info */
> - teq r4, r3
> - beq 2f /* Match => exit, or try next
> proc info */
> - add r1, r1, #PROCINFO_sizeof
> - cmp r1, r2
> - blo 1b
> + bl __lookup_processor_type
> + teq r1, #0
> + bne 1f
> mov r4, r0
> PRINT("- Missing processor info: ")
> mov r0, r4
> bl putn
> PRINT(" -\r\n")
> b fail
> -2:
> +1:
>
> /* Jump to cpu_init */
> ldr r1, [r1, #PROCINFO_cpu_init] /* r1 := vaddr(init func) */
> @@ -545,6 +535,45 @@ putn: mov pc, lr
>
> #endif /* !CONFIG_EARLY_PRINTK */
>
> +/* This provides a C-API version of __lookup_processor_type */
> +GLOBAL(lookup_processor_type)
> + stmfd sp!, {r4, r10, lr}
> + mov r10, #0 /* r10 := offset between virt&phys */
> + bl __lookup_processor_type
> + mov r0, r1
> + ldmfd sp!, {r4, r10, pc}
> +
> +/* Read processor ID register (CP#15, CR0), and Look up in the linker-built
> + * supported processor list. Note that we can't use the absolute addresses
> for
> + * the __proc_info lists since we aren't running with the MMU on (and
> therefore,
> + * we are not in correct address space). We have to calculate the offset.
> + *
> + * r10: offset between virt&phys
> + *
> + * Returns:
> + * r0: CPUID
> + * r1: proc_info pointer
> + * Clobbers r2-r4
> + */
> +__lookup_processor_type:
> + mrc CP32(r0, MIDR) /* r0 := our cpu id */
> + ldr r1, = __proc_info_start
> + add r1, r1, r10 /* r1 := paddr of table (start)
> */
> + ldr r2, = __proc_info_end
> + add r2, r2, r10 /* r2 := paddr of table (end) */
> +1: ldr r3, [r1, #PROCINFO_cpu_mask]
> + and r4, r0, r3 /* r4 := our cpu id with mask */
> + ldr r3, [r1, #PROCINFO_cpu_val] /* r3 := cpu val in current proc
> info */
> + teq r4, r3
> + beq 2f /* Match => exit, or try next
> proc info */
> + add r1, r1, #PROCINFO_sizeof
> + cmp r1, r2
> + blo 1b
> + /* We failed to find the proc_info, return NULL */
> + mov r1, #0
> +2:
> + mov pc, lr
> +
> /*
> * Local variables:
> * mode: ASM
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |