Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jun 2012 18:34:32 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r236524 - in head/sys/arm: arm at91 econa include mv s3c2xx0 sa11x0 xscale/i80321 xscale/i8134x xscale/ixp425 xscale/pxa
Message-ID:  <201206031834.q53IYWGB077633@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Sun Jun  3 18:34:32 2012
New Revision: 236524
URL: http://svn.freebsd.org/changeset/base/236524

Log:
  Minor rearrangement of the locore <-> initarm interface.  Pass in a
  structure with the first 4 registers to allow a wider range of boot
  loaders to work.  Future commits will make use of this to centralize
  support for the different loaders.

Modified:
  head/sys/arm/arm/locore.S
  head/sys/arm/at91/at91_machdep.c
  head/sys/arm/econa/econa_machdep.c
  head/sys/arm/include/cpu.h
  head/sys/arm/mv/mv_machdep.c
  head/sys/arm/s3c2xx0/s3c24x0_machdep.c
  head/sys/arm/sa11x0/assabet_machdep.c
  head/sys/arm/xscale/i80321/ep80219_machdep.c
  head/sys/arm/xscale/i80321/iq31244_machdep.c
  head/sys/arm/xscale/i8134x/crb_machdep.c
  head/sys/arm/xscale/ixp425/avila_machdep.c
  head/sys/arm/xscale/pxa/pxa_machdep.c

Modified: head/sys/arm/arm/locore.S
==============================================================================
--- head/sys/arm/arm/locore.S	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/arm/locore.S	Sun Jun  3 18:34:32 2012	(r236524)
@@ -37,6 +37,7 @@
 #include <machine/asm.h>
 #include <machine/armreg.h>
 #include <machine/pte.h>
+
 __FBSDID("$FreeBSD$");
 
 /* What size should this really be ? It is only used by initarm() */
@@ -61,22 +62,25 @@ __FBSDID("$FreeBSD$");
 .globl physaddr
 .set physaddr,PHYSADDR
 
-ENTRY_NP(btext)
-
 /*
- * On entry:
- *	r0 - metadata pointer or 0
+ * On entry for FreeBSD boot ABI:
+ *	r0 - metadata pointer or 0 (boothowto on AT91's boot2)
  *	r1 - if (r0 == 0) then metadata pointer
+ * On entry for Linux boot ABI:
+ *	r0 - 0
+ *	r1 - machine type (passed as arg2 to initarm)
+ *	r2 - Pointer to a tagged list or dtb image (phys addr) (passed as arg1 initarm)
+ *
+ * For both types of boot we gather up the args, put them in a struct arm_boot_params
+ * structure and pass that to initarm.
  */
+ENTRY_NP(btext)
 ASENTRY_NP(_start)
+	mov	r9, r0		/* 0 or boot mode from boot2 */
+	mov	r8, r1		/* Save Machine type */
+	mov	ip, r2		/* Save meta data */
+	mov	fp, r3		/* Future expantion */
 
-	/* Move metadata ptr to r12 (ip) */
-	mov	ip, r0
-	ldr	r0, =0
-	cmp	ip, r0
-	bne	1f
-	mov	ip, r1
-1:
 	/* Make sure interrupts are disabled. */
 	mrs	r7, cpsr
 	orr	r7, r7, #(I32_bit|F32_bit)
@@ -91,25 +95,25 @@ ASENTRY_NP(_start)
 	 */
 	mrc     p15, 0, r2, c1, c0, 0
 	ands	r2, r2, #CPU_CONTROL_MMU_ENABLE
-	ldreq	r8, =PHYSADDR
-	ldrne	r8, =LOADERRAMADDR
-	cmp	r7, r8
+	ldreq	r6, =PHYSADDR
+	ldrne	r6, =LOADERRAMADDR
+	cmp	r7, r6
 	bls 	flash_lower
 	cmp	r7, pc
 	bhi	from_ram
 	b	do_copy
 	
 flash_lower:
-	cmp	r8, pc
+	cmp	r6, pc
 	bls	from_ram
 do_copy:
-	ldr	r9, =KERNBASE
+	ldr	r7, =KERNBASE
 	adr	r1, _start
 	ldr	r0, Lreal_start
 	ldr	r2, Lend
 	sub	r2, r2, r0
-	sub	r0, r0, r9
-	add	r0, r0, r8
+	sub	r0, r0, r7
+	add	r0, r0, r6
 	mov	r4, r0
 	bl	memcpy
 	ldr	r0, Lram_offset
@@ -186,8 +190,14 @@ mmu_done:
 	ldr	pc, .Lvirt_done
 
 virt_done:
-	mov	r0, ip			/* Load argument: metadata ptr */
-
+	mov	r1, #20			/* loader info size is 20 bytes also second arg */
+	subs	sp, sp, r1		/* allocate arm_boot_params struct on stack */
+	mov	r0, sp			/* loader info pointer is first arg */
+	str	r1, [r0]		/* Store length of loader info */
+	str	r9, [r0, #4]		/* Store r0 from boot loader */
+	str	r8, [r0, #8]		/* Store r1 from boot loader */
+	str	ip, [r0, #12]		/* store r2 from boot loader */
+	str	fp, [r0, #16]		/* store r3 from boot loader */
 	mov	fp, #0			/* trace back starts here */
 	bl	_C_LABEL(initarm)	/* Off we go */
 

Modified: head/sys/arm/at91/at91_machdep.c
==============================================================================
--- head/sys/arm/at91/at91_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/at91/at91_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -132,9 +132,6 @@ struct pv_addr undstack;
 struct pv_addr abtstack;
 struct pv_addr kernelstack;
 
-static void *boot_arg1;
-static void *boot_arg2;
-
 static struct trapframe proc0_tf;
 
 /* Static device mappings. */
@@ -236,7 +233,7 @@ at91_ramsize(void)
 }
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	struct pv_addr  dpcpu;
@@ -247,8 +244,6 @@ initarm(void *arg, void *arg2)
 	uint32_t memsize;
 	vm_offset_t lastaddr;
 
-	boot_arg1 = arg;
-	boot_arg2 = arg2;
 	set_cpufuncs();
 	lastaddr = fake_preload_metadata();
 	pcpu_init(pcpup, 0, sizeof(struct pcpu));

Modified: head/sys/arm/econa/econa_machdep.c
==============================================================================
--- head/sys/arm/econa/econa_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/econa/econa_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -123,9 +123,6 @@ struct pv_addr undstack;
 struct pv_addr abtstack;
 struct pv_addr kernelstack;
 
-static void *boot_arg1;
-static void *boot_arg2;
-
 static struct trapframe proc0_tf;
 
 /* Static device mappings. */
@@ -186,7 +183,7 @@ static const struct pmap_devmap econa_de
 
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	volatile uint32_t * ddr = (uint32_t *)0x4000000C;
@@ -198,9 +195,6 @@ initarm(void *arg, void *arg2)
 	uint32_t memsize;
 	int mem_info;
 
-
-	boot_arg1 = arg;
-	boot_arg2 = arg2;
 	boothowto = RB_VERBOSE;
 
 	set_cpufuncs();

Modified: head/sys/arm/include/cpu.h
==============================================================================
--- head/sys/arm/include/cpu.h	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/include/cpu.h	Sun Jun  3 18:34:32 2012	(r236524)
@@ -6,8 +6,8 @@
 
 #include <machine/armreg.h>
 
-void    cpu_halt(void);
-void    swi_vm(void *);
+void	cpu_halt(void);
+void	swi_vm(void *);
 
 #ifdef _KERNEL
 static __inline uint64_t
@@ -25,8 +25,8 @@ get_cyclecount(void)
 
 #define TRAPF_PC(tfp)		((tfp)->tf_pc)
 
-#define cpu_getstack(td)        ((td)->td_frame->tf_usr_sp)
-#define cpu_setstack(td, sp)    ((td)->td_frame->tf_usr_sp = (sp))
+#define cpu_getstack(td)	((td)->td_frame->tf_usr_sp)
+#define cpu_setstack(td, sp)	((td)->td_frame->tf_usr_sp = (sp))
 #define cpu_spinwait()		/* nothing */
 
 #define ARM_NVEC		8
@@ -34,12 +34,20 @@ get_cyclecount(void)
 
 extern vm_offset_t vector_page;
 
+struct arm_boot_params {
+	register_t	abp_size;	/* Size of this structure */
+	register_t	abp_r0;		/* r0 from the boot loader */
+	register_t	abp_r1;		/* r1 from the boot loader */
+	register_t	abp_r2;		/* r2 from the boot loader */
+	register_t	abp_r3;		/* r3 from the boot loader */
+};
+
 void	arm_vector_init(vm_offset_t, int);
 void	fork_trampoline(void);
 void	identify_arm_cpu(void);
-void	*initarm(void *, void *);
+void	*initarm(struct arm_boot_params *);
 
 extern char btext[];
 extern char etext[];
-int badaddr_read (void *, size_t, void *);
+int badaddr_read(void *, size_t, void *);
 #endif /* !MACHINE_CPU_H */

Modified: head/sys/arm/mv/mv_machdep.c
==============================================================================
--- head/sys/arm/mv/mv_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/mv/mv_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -306,16 +306,18 @@ physmap_init(void)
 }
 
 void *
-initarm(void *mdp, void *unused __unused)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr kernel_l1pt;
 	struct pv_addr dpcpu;
 	vm_offset_t dtbp, freemempos, l2_start, lastaddr;
 	uint32_t memsize, l2size;
 	void *kmdp;
+	void *mdp;
 	u_int l1pagetable;
 	int i = 0, j = 0, err_devmap = 0;
 
+	mdp = (void *)abp->abp_r0;
 	kmdp = NULL;
 	lastaddr = 0;
 	memsize = 0;

Modified: head/sys/arm/s3c2xx0/s3c24x0_machdep.c
==============================================================================
--- head/sys/arm/s3c2xx0/s3c24x0_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/s3c2xx0/s3c24x0_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -234,7 +234,7 @@ bus_dma_get_range_nb(void)
 }
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr	kernel_l1pt;
 	int loop;

Modified: head/sys/arm/sa11x0/assabet_machdep.c
==============================================================================
--- head/sys/arm/sa11x0/assabet_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/sa11x0/assabet_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -201,7 +201,7 @@ cpu_reset()
 #define CPU_SA110_CACHE_CLEAN_SIZE (0x4000 * 2)
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pcpu *pc;
 	struct pv_addr  kernel_l1pt;

Modified: head/sys/arm/xscale/i80321/ep80219_machdep.c
==============================================================================
--- head/sys/arm/xscale/i80321/ep80219_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/xscale/i80321/ep80219_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -181,7 +181,7 @@ static const struct pmap_devmap ep80219_
 extern vm_offset_t xscale_cache_clean_addr;
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	struct pv_addr  dpcpu;

Modified: head/sys/arm/xscale/i80321/iq31244_machdep.c
==============================================================================
--- head/sys/arm/xscale/i80321/iq31244_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/xscale/i80321/iq31244_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -182,7 +182,7 @@ static const struct pmap_devmap iq80321_
 extern vm_offset_t xscale_cache_clean_addr;
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	struct pv_addr  dpcpu;

Modified: head/sys/arm/xscale/i8134x/crb_machdep.c
==============================================================================
--- head/sys/arm/xscale/i8134x/crb_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/xscale/i8134x/crb_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -178,7 +178,7 @@ static const struct pmap_devmap iq81342_
 extern vm_offset_t xscale_cache_clean_addr;
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	struct pv_addr  dpcpu;

Modified: head/sys/arm/xscale/ixp425/avila_machdep.c
==============================================================================
--- head/sys/arm/xscale/ixp425/avila_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/xscale/ixp425/avila_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -225,7 +225,7 @@ static const struct pmap_devmap ixp435_d
 extern vm_offset_t xscale_cache_clean_addr;
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 #define	next_chunk2(a,b)	(((a) + (b)) &~ ((b)-1))
 #define	next_page(a)		next_chunk2(a,PAGE_SIZE)

Modified: head/sys/arm/xscale/pxa/pxa_machdep.c
==============================================================================
--- head/sys/arm/xscale/pxa/pxa_machdep.c	Sun Jun  3 18:16:17 2012	(r236523)
+++ head/sys/arm/xscale/pxa/pxa_machdep.c	Sun Jun  3 18:34:32 2012	(r236524)
@@ -162,7 +162,7 @@ static const struct pmap_devmap pxa_devm
 extern vm_offset_t xscale_cache_clean_addr;
 
 void *
-initarm(void *arg, void *arg2)
+initarm(struct arm_boot_params *abp)
 {
 	struct pv_addr  kernel_l1pt;
 	struct pv_addr  dpcpu;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206031834.q53IYWGB077633>