More Linux boot support. Create arm_dump_avail_init() to initialize

this array either from Linux boot data, when enabled, or in the
typical way that most ports do it.  arm_pyhs_avail_init is coming
soon since it must be a separate function.
This commit is contained in:
Warner Losh 2012-06-14 04:18:56 +00:00
parent 38ac33aa84
commit 3590dad094
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=237045
7 changed files with 54 additions and 49 deletions

View file

@ -677,6 +677,47 @@ makectx(struct trapframe *tf, struct pcb *pcb)
pcb->un_32.pcb32_sp = tf->tf_usr_sp;
}
/*
* Make a standard dump_avail array. Can't make the phys_avail
* since we need to do that after we call pmap_bootstrap, but this
* is needed before pmap_boostrap.
*
* ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
* calling pmap_bootstrap.
*/
void
arm_dump_avail_init(vm_offset_t memsize, size_t max)
{
#ifdef LINUX_BOOT_ABI
/*
* Linux boot loader passes us the actual banks of memory, so use them
* to construct the dump_avail array.
*/
if (membanks > 0)
{
int i, j;
if (max < (membanks + 1) * 2)
panic("dump_avail[%d] too small for %d banks\n",
max, membanks);
for (j = 0, i = 0; i < membanks; i++) {
dump_avail[j++] = round_page(memstart[i]);
dump_avail[j++] = trunc_page(memstart[i] + memsize[i]);
}
dump_avail[j++] = 0;
dump_avail[j++] = 0;
return;
}
#endif
if (max < 4)
panic("dump_avail too small\n");
dump_avail[0] = round_page(PHYSADDR);
dump_avail[1] = trunc_page(PHYSADDR + memsize);
dump_avail[2] = 0;
dump_avail[3] = 0;
}
/*
* Fake up a boot descriptor table
*/

View file

@ -552,19 +552,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
/*
* ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
* calling pmap_bootstrap.
*/
dump_avail[0] = PHYSADDR;
dump_avail[1] = PHYSADDR + memsize;
dump_avail[2] = 0;
dump_avail[3] = 0;
pmap_bootstrap(freemempos,
KERNVIRTADDR + 3 * memsize,
&kernel_l1pt);
arm_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);
mutex_init();

View file

@ -342,19 +342,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
/*
* ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
* calling pmap_bootstrap.
*/
dump_avail[0] = PHYSADDR;
dump_avail[1] = PHYSADDR + memsize;
dump_avail[2] = 0;
dump_avail[3] = 0;
pmap_bootstrap(freemempos,
KERNVIRTADDR + 3 * memsize,
&kernel_l1pt);
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);

View file

@ -11,6 +11,8 @@ void halt(void);
void data_abort_handler(trapframe_t *);
void prefetch_abort_handler(trapframe_t *);
void undefinedinstruction_bounce(trapframe_t *);
/* Early boot related helper functions */
struct arm_boot_params;
vm_offset_t default_parse_boot_param(struct arm_boot_params *abp);
vm_offset_t freebsd_parse_boot_param(struct arm_boot_params *abp);
@ -18,4 +20,7 @@ vm_offset_t linux_parse_boot_param(struct arm_boot_params *abp);
vm_offset_t fake_preload_metadata(struct arm_boot_params *abp);
vm_offset_t parse_boot_param(struct arm_boot_params *abp);
/* Setup standard arrays */
void arm_dump_avail_init( vm_offset_t memsize, size_t max);
#endif /* !_MACHINE_MACHDEP_H_ */

View file

@ -552,12 +552,7 @@ initarm(struct arm_boot_params *abp)
init_proc0(kernelstack.pv_va);
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
dump_avail[0] = 0;
dump_avail[1] = memsize;
dump_avail[2] = 0;
dump_avail[3] = 0;
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, pmap_bootstrap_lastaddr, &kernel_l1pt);
msgbufp = (void *)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);

View file

@ -409,18 +409,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1);
/*
* ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before
* calling pmap_bootstrap.
*/
dump_avail[0] = PHYSADDR;
dump_avail[1] = PHYSADDR + memsize;
dump_avail[2] = 0;
dump_avail[3] = 0;
pmap_bootstrap(freemempos,
KERNVIRTADDR + 3 * memsize,
&kernel_l1pt);
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, KERNVIRTADDR + 3 * memsize, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);
mutex_init();

View file

@ -446,11 +446,7 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + PAGE_SIZE;
dump_avail[0] = PHYSADDR;
dump_avail[1] = PHYSADDR + memsize;
dump_avail[2] = 0;
dump_avail[3] = 0;
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(pmap_curmaxkvaddr, 0xd0000000, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);