diff options
author | Warner Losh <imp@FreeBSD.org> | 2012-06-03 18:34:32 +0000 |
---|---|---|
committer | Warner Losh <imp@FreeBSD.org> | 2012-06-03 18:34:32 +0000 |
commit | 4623180919a7ea01d0ffb3a8575c5d9681d15d92 (patch) | |
tree | c99100ae7a1197ca9409b753c1ce05764784164e /sys | |
parent | 2faa5be555e15e3cc597ddd8806fcc429dd5fe90 (diff) | |
download | src-4623180919a7ea01d0ffb3a8575c5d9681d15d92.tar.gz src-4623180919a7ea01d0ffb3a8575c5d9681d15d92.zip |
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.
Notes
Notes:
svn path=/head/; revision=236524
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arm/arm/locore.S | 50 | ||||
-rw-r--r-- | sys/arm/at91/at91_machdep.c | 7 | ||||
-rw-r--r-- | sys/arm/econa/econa_machdep.c | 8 | ||||
-rw-r--r-- | sys/arm/include/cpu.h | 20 | ||||
-rw-r--r-- | sys/arm/mv/mv_machdep.c | 4 | ||||
-rw-r--r-- | sys/arm/s3c2xx0/s3c24x0_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/sa11x0/assabet_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/xscale/i80321/ep80219_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/xscale/i80321/iq31244_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/xscale/i8134x/crb_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/xscale/ixp425/avila_machdep.c | 2 | ||||
-rw-r--r-- | sys/arm/xscale/pxa/pxa_machdep.c | 2 |
12 files changed, 56 insertions, 47 deletions
diff --git a/sys/arm/arm/locore.S b/sys/arm/arm/locore.S index af2e3cfe3995..b6e049e57261 100644 --- a/sys/arm/arm/locore.S +++ b/sys/arm/arm/locore.S @@ -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 */ diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c index 7b165a83ddc2..1f0d8a79f537 100644 --- a/sys/arm/at91/at91_machdep.c +++ b/sys/arm/at91/at91_machdep.c @@ -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)); diff --git a/sys/arm/econa/econa_machdep.c b/sys/arm/econa/econa_machdep.c index 0262446cf65d..411cb97d6351 100644 --- a/sys/arm/econa/econa_machdep.c +++ b/sys/arm/econa/econa_machdep.c @@ -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_devmap[] = { 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(); diff --git a/sys/arm/include/cpu.h b/sys/arm/include/cpu.h index f9e94592973d..9dae977c27fc 100644 --- a/sys/arm/include/cpu.h +++ b/sys/arm/include/cpu.h @@ -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 */ diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c index 1e3f343d0db1..2f2d628faa1c 100644 --- a/sys/arm/mv/mv_machdep.c +++ b/sys/arm/mv/mv_machdep.c @@ -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; diff --git a/sys/arm/s3c2xx0/s3c24x0_machdep.c b/sys/arm/s3c2xx0/s3c24x0_machdep.c index 31ae74c96a52..af4eaf916621 100644 --- a/sys/arm/s3c2xx0/s3c24x0_machdep.c +++ b/sys/arm/s3c2xx0/s3c24x0_machdep.c @@ -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; diff --git a/sys/arm/sa11x0/assabet_machdep.c b/sys/arm/sa11x0/assabet_machdep.c index 61c50564bf4e..ee93f84a37fb 100644 --- a/sys/arm/sa11x0/assabet_machdep.c +++ b/sys/arm/sa11x0/assabet_machdep.c @@ -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; diff --git a/sys/arm/xscale/i80321/ep80219_machdep.c b/sys/arm/xscale/i80321/ep80219_machdep.c index 49305c5915b6..e0cfeed58dc6 100644 --- a/sys/arm/xscale/i80321/ep80219_machdep.c +++ b/sys/arm/xscale/i80321/ep80219_machdep.c @@ -181,7 +181,7 @@ static const struct pmap_devmap ep80219_devmap[] = { 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; diff --git a/sys/arm/xscale/i80321/iq31244_machdep.c b/sys/arm/xscale/i80321/iq31244_machdep.c index 15b143da9a00..d5e7549fa282 100644 --- a/sys/arm/xscale/i80321/iq31244_machdep.c +++ b/sys/arm/xscale/i80321/iq31244_machdep.c @@ -182,7 +182,7 @@ static const struct pmap_devmap iq80321_devmap[] = { 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; diff --git a/sys/arm/xscale/i8134x/crb_machdep.c b/sys/arm/xscale/i8134x/crb_machdep.c index b368c1988c7a..cb0cefc471c1 100644 --- a/sys/arm/xscale/i8134x/crb_machdep.c +++ b/sys/arm/xscale/i8134x/crb_machdep.c @@ -178,7 +178,7 @@ static const struct pmap_devmap iq81342_devmap[] = { 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; diff --git a/sys/arm/xscale/ixp425/avila_machdep.c b/sys/arm/xscale/ixp425/avila_machdep.c index a047964aebfe..01a770dc3e49 100644 --- a/sys/arm/xscale/ixp425/avila_machdep.c +++ b/sys/arm/xscale/ixp425/avila_machdep.c @@ -225,7 +225,7 @@ static const struct pmap_devmap ixp435_devmap[] = { 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) diff --git a/sys/arm/xscale/pxa/pxa_machdep.c b/sys/arm/xscale/pxa/pxa_machdep.c index d2dc106a27f0..56e140273acb 100644 --- a/sys/arm/xscale/pxa/pxa_machdep.c +++ b/sys/arm/xscale/pxa/pxa_machdep.c @@ -162,7 +162,7 @@ static const struct pmap_devmap pxa_devmap[] = { 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; |