Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Aug 2012 00:15:33 +0000 (UTC)
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r239117 - user/jceel/soc2012_armv6/sys/arm/arm
Message-ID:  <201208070015.q770FXp8099101@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jceel
Date: Tue Aug  7 00:15:33 2012
New Revision: 239117
URL: http://svn.freebsd.org/changeset/base/239117

Log:
  Add support for high/low vector addresses in arm_mmu_init().

Modified:
  user/jceel/soc2012_armv6/sys/arm/arm/machdep.c

Modified: user/jceel/soc2012_armv6/sys/arm/arm/machdep.c
==============================================================================
--- user/jceel/soc2012_armv6/sys/arm/arm/machdep.c	Mon Aug  6 23:46:17 2012	(r239116)
+++ user/jceel/soc2012_armv6/sys/arm/arm/machdep.c	Tue Aug  7 00:15:33 2012	(r239117)
@@ -151,7 +151,8 @@ extern vm_offset_t ksym_start, ksym_end;
 
 static void arm_valloc_pages(struct pv_addr *, size_t, size_t);
 static void arm_process_devmap(struct pmap_devmap *);
-static void arm_bootstrap_pagetables(uint32_t, struct pv_addr *, struct pv_addr *);
+static void arm_bootstrap_pagetables(uint32_t, struct pv_addr *,
+    struct pv_addr *, int);
 
 void
 sendsig(catcher, ksi, mask)
@@ -822,15 +823,18 @@ arm_valloc_pages(struct pv_addr *result,
 }
 
 static void
-arm_bootstrap_pagetables(uint32_t memsize, struct pv_addr *vectors, struct pv_addr *l1pt)
+arm_bootstrap_pagetables(uint32_t memsize, struct pv_addr *vectors, struct pv_addr *l1pt, int high_vectors)
 {
 	struct pv_addr *l2pt = arm_bootstrap_l2pt;
+	vm_offset_t vectors_va;
 	vm_offset_t l2_start;
 	vm_offset_t pagetables_size = 0;
 	int l2_needed;
 	int l2_devmap;
 	int i, j;
 
+	vectors_va = high_vectors ? ARM_VECTORS_HIGH : ARM_VECTORS_LOW;
+
 	/* Allocate L1 pagetable */
 	arm_valloc_pages(l1pt, L1_TABLE_SIZE / PAGE_SIZE, L1_TABLE_SIZE / PAGE_SIZE);
 	pagetables_size += L1_TABLE_SIZE;
@@ -881,8 +885,8 @@ arm_bootstrap_pagetables(uint32_t memsiz
 	}
 
 	/* Link and map vectors page */
-	pmap_link_l2pt(l1pt->pv_va, ARM_VECTORS_HIGH, &l2pt[l2_needed - 1]);
-	pmap_map_entry(l1pt->pv_va, ARM_VECTORS_HIGH, vectors->pv_pa,
+	pmap_link_l2pt(l1pt->pv_va, vectors_va, &l2pt[l2_needed - 1]);
+	pmap_map_entry(l1pt->pv_va, vectors_va, vectors->pv_pa,
 	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE, PTE_CACHE);
 	
 	/* Map kernel and structures */
@@ -1005,7 +1009,7 @@ arm_mmu_init(uint32_t memsize, uint32_t 
 	arm_process_devmap(arm_pmap_devmap);
 
 	/* Construct bootstrap pagetables */
-	arm_bootstrap_pagetables(memsize, &systempage, &pagetable);
+	arm_bootstrap_pagetables(memsize, &systempage, &pagetable, high_vectors);
 	pmap_devmap_bootstrap(pagetable.pv_va, arm_pmap_devmap);
 	
 	edebugf("L1 table pa=0x%x va=0x%x\n", pagetable.pv_pa, pagetable.pv_va);
@@ -1053,7 +1057,8 @@ arm_mmu_init(uint32_t memsize, uint32_t 
 	undefined_init();
 
 	init_proc0(kernelstack.pv_va);
-	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
+	arm_vector_init(high_vectors ? ARM_VECTORS_HIGH : ARM_VECTORS_LOW,
+	    ARM_VEC_ALL);
 
 	dump_avail[0] = 0;
 	dump_avail[1] = memsize;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208070015.q770FXp8099101>