Author: imp Date: Thu Jun 14 04:18:56 2012 New Revision: 237045 URL: http://svn.freebsd.org/changeset/base/237045
Log: 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. Modified: head/sys/arm/arm/machdep.c head/sys/arm/at91/at91_machdep.c head/sys/arm/econa/econa_machdep.c head/sys/arm/include/machdep.h head/sys/arm/mv/mv_machdep.c head/sys/arm/s3c2xx0/s3c24x0_machdep.c head/sys/arm/xscale/ixp425/avila_machdep.c Modified: head/sys/arm/arm/machdep.c ============================================================================== --- head/sys/arm/arm/machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/arm/machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -678,6 +678,47 @@ makectx(struct trapframe *tf, struct pcb } /* + * 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 */ vm_offset_t Modified: head/sys/arm/at91/at91_machdep.c ============================================================================== --- head/sys/arm/at91/at91_machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/at91/at91_machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -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(); Modified: head/sys/arm/econa/econa_machdep.c ============================================================================== --- head/sys/arm/econa/econa_machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/econa/econa_machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -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); Modified: head/sys/arm/include/machdep.h ============================================================================== --- head/sys/arm/include/machdep.h Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/include/machdep.h Thu Jun 14 04:18:56 2012 (r237045) @@ -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(struc 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_ */ Modified: head/sys/arm/mv/mv_machdep.c ============================================================================== --- head/sys/arm/mv/mv_machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/mv/mv_machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -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); Modified: head/sys/arm/s3c2xx0/s3c24x0_machdep.c ============================================================================== --- head/sys/arm/s3c2xx0/s3c24x0_machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/s3c2xx0/s3c24x0_machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -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(); Modified: head/sys/arm/xscale/ixp425/avila_machdep.c ============================================================================== --- head/sys/arm/xscale/ixp425/avila_machdep.c Thu Jun 14 04:16:16 2012 (r237044) +++ head/sys/arm/xscale/ixp425/avila_machdep.c Thu Jun 14 04:18:56 2012 (r237045) @@ -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); _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"