Use abp_physaddr for the physical address over KERNPHYSADDR. This helps us

remove the need to load the kernel at a fixed address.
This commit is contained in:
Andrew Turner 2014-02-06 20:35:33 +00:00
parent a9540a2624
commit 9e4ed33024
6 changed files with 24 additions and 19 deletions

View file

@ -788,7 +788,7 @@ makectx(struct trapframe *tf, struct pcb *pcb)
* calling pmap_bootstrap.
*/
void
arm_dump_avail_init(vm_offset_t ramsize, size_t max)
arm_dump_avail_init(vm_paddr_t physaddr, vm_offset_t ramsize, size_t max)
{
#ifdef LINUX_BOOT_ABI
/*
@ -814,8 +814,8 @@ arm_dump_avail_init(vm_offset_t ramsize, size_t max)
if (max < 4)
panic("dump_avail too small\n");
dump_avail[0] = round_page(PHYSADDR);
dump_avail[1] = trunc_page(PHYSADDR + ramsize);
dump_avail[0] = round_page(physaddr);
dump_avail[1] = trunc_page(physaddr + ramsize);
dump_avail[2] = 0;
dump_avail[3] = 0;
}
@ -901,7 +901,7 @@ linux_parse_boot_param(struct arm_boot_params *abp)
board_id = abp->abp_r1;
walker = (struct arm_lbabi_tag *)
(abp->abp_r2 + KERNVIRTADDR - KERNPHYSADDR);
(abp->abp_r2 + KERNVIRTADDR - abp->abp_physaddr);
/* xxx - Need to also look for binary device tree */
if (ATAG_TAG(walker) != ATAG_CORE)
@ -979,7 +979,7 @@ freebsd_parse_boot_param(struct arm_boot_params *abp)
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
#endif
preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
preload_addr_relocate = KERNVIRTADDR - abp->abp_physaddr;
return lastaddr;
}
#endif
@ -1081,15 +1081,15 @@ print_kenv(void)
}
static void
physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz)
physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz,
vm_offset_t kernload)
{
int i, j, cnt;
vm_offset_t phys_kernelend, kernload;
vm_offset_t phys_kernelend;
uint32_t s, e, sz;
struct mem_region *mp, *mp1;
phys_kernelend = KERNPHYSADDR + (virtual_avail - KERNVIRTADDR);
kernload = KERNPHYSADDR;
phys_kernelend = kernload + (virtual_avail - KERNVIRTADDR);
/*
* Remove kernel physical address range from avail
@ -1331,7 +1331,7 @@ initarm(struct arm_boot_params *abp)
/* Define a macro to simplify memory allocation */
#define valloc_pages(var, np) \
alloc_pages((var).pv_va, (np)); \
(var).pv_pa = (var).pv_va + (KERNPHYSADDR - KERNVIRTADDR);
(var).pv_pa = (var).pv_va + (abp->abp_physaddr - KERNVIRTADDR);
#define alloc_pages(var, np) \
(var) = freemempos; \
@ -1352,7 +1352,7 @@ initarm(struct arm_boot_params *abp)
L2_TABLE_SIZE_REAL * (i - j);
kernel_pt_table[i].pv_pa =
kernel_pt_table[i].pv_va - KERNVIRTADDR +
KERNPHYSADDR;
abp->abp_physaddr;
}
}
@ -1397,7 +1397,7 @@ initarm(struct arm_boot_params *abp)
pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE;
/* Map kernel code and data */
pmap_map_chunk(l1pagetable, KERNVIRTADDR, KERNPHYSADDR,
pmap_map_chunk(l1pagetable, KERNVIRTADDR, abp->abp_physaddr,
(((uint32_t)(lastaddr) - KERNVIRTADDR) + PAGE_MASK) & ~PAGE_MASK,
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
@ -1501,7 +1501,8 @@ initarm(struct arm_boot_params *abp)
arm_intrnames_init();
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
arm_dump_avail_init(abp->abp_physaddr, memsize,
sizeof(dump_avail) / sizeof(dump_avail[0]));
pmap_bootstrap(freemempos, &kernel_l1pt);
msgbufp = (void *)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);
@ -1510,7 +1511,7 @@ initarm(struct arm_boot_params *abp)
/*
* Prepare map of physical memory regions available to vm subsystem.
*/
physmap_init(availmem_regions, availmem_regions_sz);
physmap_init(availmem_regions, availmem_regions_sz, abp->abp_physaddr);
init_param2(physmem);
kdb_init();

View file

@ -630,7 +630,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_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0]));
arm_dump_avail_init(abp->abp_physaddr, memsize,
sizeof(dump_avail)/sizeof(dump_avail[0]));
/* Always use the 256MB of KVA we have available between the kernel and devices */
vm_max_kernel_address = KERNVIRTADDR + (256 << 20);
pmap_bootstrap(freemempos, &kernel_l1pt);

View file

@ -322,7 +322,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_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
arm_dump_avail_init(abp->abp_physaddr, memsize,
sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
pmap_bootstrap(freemempos, &kernel_l1pt);

View file

@ -72,6 +72,6 @@ void board_set_serial(uint64_t);
void board_set_revision(uint32_t);
/* Setup standard arrays */
void arm_dump_avail_init( vm_offset_t memsize, size_t max);
void arm_dump_avail_init(vm_paddr_t, vm_offset_t, size_t);
#endif /* !_MACHINE_MACHDEP_H_ */

View file

@ -384,7 +384,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_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
arm_dump_avail_init(abp->abp_physaddr, memsize,
sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
pmap_bootstrap(freemempos, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;

View file

@ -431,7 +431,8 @@ initarm(struct arm_boot_params *abp)
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_curmaxkvaddr = afterkern + PAGE_SIZE;
arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
arm_dump_avail_init(abp->abp_physaddr, memsize,
sizeof(dump_avail) / sizeof(dump_avail[0]));
vm_max_kernel_address = 0xe0000000;
pmap_bootstrap(pmap_curmaxkvaddr, &kernel_l1pt);
msgbufp = (void*)msgbufpv.pv_va;