From owner-svn-src-projects@FreeBSD.ORG Tue Aug 5 08:30:08 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 61485F1F for ; Tue, 5 Aug 2014 08:30:08 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 37967249E for ; Tue, 5 Aug 2014 08:30:08 +0000 (UTC) Received: from andrew (uid 1231) (envelope-from andrew@FreeBSD.org) id 5b68 by svn.freebsd.org (DragonFly Mail Agent v0.9+); Tue, 05 Aug 2014 08:30:08 +0000 From: Andrew Turner Date: Tue, 5 Aug 2014 08:30:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r269573 - projects/arm64/sys/arm64/arm64 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <53e09610.5b68.7acae36e@svn.freebsd.org> X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Aug 2014 08:30:08 -0000 Author: andrew Date: Tue Aug 5 08:30:07 2014 New Revision: 269573 URL: http://svnweb.freebsd.org/changeset/base/269573 Log: Reserve the devmap kva and make sure it has l3 tables allocated. Modified: projects/arm64/sys/arm64/arm64/pmap.c Modified: projects/arm64/sys/arm64/arm64/pmap.c ============================================================================== --- projects/arm64/sys/arm64/arm64/pmap.c Tue Aug 5 08:29:24 2014 (r269572) +++ projects/arm64/sys/arm64/arm64/pmap.c Tue Aug 5 08:30:07 2014 (r269573) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -212,6 +213,36 @@ pmap_bootstrap_l2(vm_offset_t l1pt, vm_o return l2pt; } +static vm_offset_t +pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start) +{ + vm_offset_t l2pt, l3pt; + vm_paddr_t pa; + pd_entry_t *l2; + u_int l2_slot; + + KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address")); + + l2 = pmap_l2(kernel_pmap, va); + l2 = (pd_entry_t *)((uintptr_t)l2 & ~(PAGE_SIZE - 1)); + l2pt = (vm_offset_t)l2; + l2_slot = pmap_l2_index(va); + l3pt = l3_start; + + for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) { + KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index")); + + pa = pmap_early_vtophys(l1pt, l3pt); + l2[l2_slot] = (pa & ~Ln_TABLE_MASK) | ATTR_AF | L2_TABLE; + l3pt += PAGE_SIZE; + } + + /* Clean the L2 page table */ + memset((void *)l3_start, 0, l3pt - l3_start); + + return l3pt; +} + void pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen) { @@ -333,6 +364,9 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd freemempos = roundup2(freemempos, PAGE_SIZE); /* Create the l2 tables up to VM_MAX_KERNEL_ADDRESS */ 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); /* Flush the cache and tlb to ensure the new entries are valid */ /* TODO: Flush the cache, we are relying on it being off */ @@ -353,7 +387,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd dpcpu_init((void *)dpcpu, 0); virtual_avail = roundup2(freemempos, L1_SIZE); - virtual_end = VM_MAX_KERNEL_ADDRESS; + virtual_end = arm_devmap_lastaddr() & ~L1_OFFSET; kernel_vm_end = virtual_avail; pa = pmap_early_vtophys(l1pt, freemempos);