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:
parent
38ac33aa84
commit
3590dad094
sys/arm
arm
at91
econa
include
mv
s3c2xx0
xscale/ixp425
@ -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
|
||||
*/
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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_ */
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user