svn commit: r269657 - in projects/arm64/sys: arm/arm arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Thu Aug 7 07:41:53 UTC 2014
Author: andrew
Date: Thu Aug 7 07:41:51 2014
New Revision: 269657
URL: http://svnweb.freebsd.org/changeset/base/269657
Log:
Reserve a 2MiB block of memory for devmap so we don't need to add the
early boot ranges. This should reduce the need for early platform
dependent code.
Modified:
projects/arm64/sys/arm/arm/devmap.c
projects/arm64/sys/arm64/arm64/machdep.c
projects/arm64/sys/arm64/arm64/pmap.c
Modified: projects/arm64/sys/arm/arm/devmap.c
==============================================================================
--- projects/arm64/sys/arm/arm/devmap.c Thu Aug 7 05:47:53 2014 (r269656)
+++ projects/arm64/sys/arm/arm/devmap.c Thu Aug 7 07:41:51 2014 (r269657)
@@ -57,6 +57,8 @@ static struct arm_devmap_entry akva_devm
static u_int akva_devmap_idx;
static vm_offset_t akva_devmap_vaddr = VM_MAX_KERNEL_ADDRESS;
+extern int early_boot;
+
#if 0
/*
* Print the contents of the static mapping table using the provided printf-like
@@ -275,8 +277,14 @@ pmap_mapdev(vm_offset_t pa, vm_size_t si
offset = pa & PAGE_MASK;
pa = trunc_page(pa);
size = round_page(size + offset);
-
- va = kva_alloc(size);
+
+ if (early_boot) {
+ akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size);
+ va = akva_devmap_vaddr;
+ KASSERT(va >= VM_MAX_KERNEL_ADDRESS - L2_SIZE,
+ ("Too many early devmap mappings"));
+ } else
+ va = kva_alloc(size);
if (!va)
panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
Modified: projects/arm64/sys/arm64/arm64/machdep.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/machdep.c Thu Aug 7 05:47:53 2014 (r269656)
+++ projects/arm64/sys/arm64/arm64/machdep.c Thu Aug 7 07:41:51 2014 (r269657)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/buf.h>
#include <sys/bus.h>
+#include <sys/cons.h>
#include <sys/cpu.h>
#include <sys/efi.h>
#include <sys/imgact.h>
@@ -56,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_pager.h>
#include <machine/cpu.h>
+#include <machine/devmap.h>
#include <machine/machdep.h>
#include <machine/metadata.h>
#include <machine/pcb.h>
@@ -73,6 +75,7 @@ static struct trapframe proc0_tf;
vm_paddr_t phys_avail[PHYS_AVAIL_SIZE];
+int early_boot = 1;
int cold = 1;
long realmem = 0;
@@ -563,11 +566,16 @@ initarm(struct arm64_bootparams *abp)
pmap_bootstrap(abp->kern_l1pt, KERNBASE - abp->kern_delta,
lastaddr - KERNBASE);
+ arm_devmap_bootstrap(0, NULL);
+
+ cninit();
+
init_proc0(abp->kern_stack);
mutex_init();
init_param2(physmem);
kdb_init();
+ early_boot = 0;
printf("End initarm\n");
}
Modified: projects/arm64/sys/arm64/arm64/pmap.c
==============================================================================
--- projects/arm64/sys/arm64/arm64/pmap.c Thu Aug 7 05:47:53 2014 (r269656)
+++ projects/arm64/sys/arm64/arm64/pmap.c Thu Aug 7 07:41:51 2014 (r269657)
@@ -366,7 +366,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
freemempos = pmap_bootstrap_l2(l1pt, va, freemempos);
/* And the l3 tables for the early devmap */
freemempos = pmap_bootstrap_l3(l1pt,
- arm_devmap_lastaddr() & ~L2_OFFSET, freemempos);
+ VM_MAX_KERNEL_ADDRESS - L2_SIZE, freemempos);
/* Flush the cache and tlb to ensure the new entries are valid */
/* TODO: Flush the cache, we are relying on it being off */
@@ -387,7 +387,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd
dpcpu_init((void *)dpcpu, 0);
virtual_avail = roundup2(freemempos, L1_SIZE);
- virtual_end = arm_devmap_lastaddr() & ~L1_OFFSET;
+ virtual_end = VM_MAX_KERNEL_ADDRESS - L2_SIZE;
kernel_vm_end = virtual_avail;
pa = pmap_early_vtophys(l1pt, freemempos);
More information about the svn-src-projects
mailing list