|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] xen/arm32: Introduce lookup_processor_type
commit db996100025b879ec7a10875671c06cbe76922f4
Author: Julien Grall <julien.grall@xxxxxxxxxx>
AuthorDate: Wed Mar 5 12:46:23 2014 +0800
Commit: Ian Campbell <ian.campbell@xxxxxxxxxx>
CommitDate: Fri Mar 14 14:56:23 2014 +0000
xen/arm32: Introduce lookup_processor_type
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>
Reviewed-by: Tim Deegan <tim@xxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
xen/arch/arm/arm32/head.S | 57 ++++++++++++++++++++++++++++++++++-----------
1 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index e889596..72cda34 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 /* !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
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |