From nobody Mon Jul 24 16:58:46 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4R8mZv0sVxz4ndc2; Mon, 24 Jul 2023 16:58:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4R8mZv05g1z4GRg; Mon, 24 Jul 2023 16:58:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690217927; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zewiVbmSYgRv7zqY6tuykJsv9bZUviCT0wZytmti0c8=; b=J7JH6j10DhkP4JA1tz+C7azIqf5d59q3NdxwDunfkHnuRY9fs+TjNJOXklS/uxQmB7I+v1 q0dUm7FudmTt+9Nrn86y9lpxjK6RlH/pwkeCkG5xhArJRKZz+V4vVpcHMUJhsF9MoNj1Dp vaKwYI8sFBzreFdVo/Do0GEhLgI5+Wys2uUKKPu8GlIYgSWK4QzVMFNXkns1QeXesWZi/g UImnYB71iOxlTgu4OVwiIhv63U/m/GVw0YbA1pLVkwViV7kh/9ndhwOdLW9FNcX4lSF0BA ACdIL/h6DmwA/2A+m1nDAIVy9tEak/QD6eedeLJmX07HLU+pkn/yVQw1sUjgmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690217927; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zewiVbmSYgRv7zqY6tuykJsv9bZUviCT0wZytmti0c8=; b=g4HejEAIgtkvLQ4U7LE9so021W2pXz7qgsugVdbTfsFtN9bmok8gYOxL+E0clbCIWTJ4FE GkcLip9lNufdkw5sKjxsoq1cy3jmP7xsc44zjL/kQuDudX0AVHoGTachksnl4OLuymY8VM CX0j/UcI517aZMYsU++qeNw1FyfotbbqfOZZTF3X6L85htfOsTq3Mz00+S7aUvQSGn7aZa tqfWvX75tPgxeNktp43M17shRSbbczSZQiwFgdh2sYWAm6P9711/mUyb9sPBkDU/k1r8kx ulvEgsFskP9xU7PMADJpQT+nnEZofhO9VWbadMORemigu/XZ367VnKt28aYUwQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1690217927; a=rsa-sha256; cv=none; b=JhrrROC4zOcKAjJk8Vtu9jY4rYWZkOWYXKyhSnOT6r4UysQbgucJQSoJyrVCSVjnutyC4q udD7PxOL6ZIEEB13M6SZiLwqBnnJhZSSpUAw7XXSQdkJYAyA69m/AMGllEMW9KrYCi/tYM BG54zJGRMdYJszhFwjAiYZcQRxB2JfAz5HqNunW4OGLb4vOFlfXTYngy4Su93KwJtYayzO T2UveiCq9pjlgzcohLhZFyy9EO4uRA6W3wt+VyFhLJ4cLxYtZdzkVh5yJrfyyNtBcPiC2c YrOfp02MCq2ozTevkTiO9c/N5T+ETR/1PEZeW5gIG5plMJras3pkwsi78kUcUw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4R8mZt5qNtzQZC; Mon, 24 Jul 2023 16:58:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36OGwkRN096706; Mon, 24 Jul 2023 16:58:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36OGwkhM096705; Mon, 24 Jul 2023 16:58:46 GMT (envelope-from git) Date: Mon, 24 Jul 2023 16:58:46 GMT Message-Id: <202307241658.36OGwkhM096705@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 1e7dfc94ccf6 - main - arm: Move contents of pmap-v6.h into pmap.h List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 1e7dfc94ccf62a877bcb812edb18d121acafd5d2 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=1e7dfc94ccf62a877bcb812edb18d121acafd5d2 commit 1e7dfc94ccf62a877bcb812edb18d121acafd5d2 Author: Andrew Turner AuthorDate: 2023-07-24 16:58:15 +0000 Commit: Andrew Turner CommitDate: 2023-07-24 16:58:15 +0000 arm: Move contents of pmap-v6.h into pmap.h Previously we had an armv4/v5 and armv6/v7 copy of the pmap header. As we have removed armv4/v5 support we can now merge the armv6/v7 code into pmap.h Reviewed by: imp Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D41138 --- sys/arm/include/pmap-v6.h | 167 ---------------------------------------------- sys/arm/include/pmap.h | 137 +++++++++++++++++++++++++++++++++++-- 2 files changed, 133 insertions(+), 171 deletions(-) diff --git a/sys/arm/include/pmap-v6.h b/sys/arm/include/pmap-v6.h deleted file mode 100644 index f7499e82e0d2..000000000000 --- a/sys/arm/include/pmap-v6.h +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * Copyright 2014 Svatopluk Kraus - * Copyright 2014 Michal Meloun - * Copyright (c) 1991 Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department and William Jolitz of UUNET Technologies Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The ARM version of this file was more or less based on the i386 version, - * which has the following provenance... - * - * Derived from hp300 version by Mike Hibler, this version by William - * Jolitz uses a recursive map [a pde points to the page directory] to - * map the page tables using the pagetables themselves. This is done to - * reduce the impact on kernel virtual memory for lots of sparse address - * space, and to reduce the cost of memory to each process. - * - * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 - * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 - * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30 - * - * $FreeBSD$ - */ - -#ifndef _MACHINE_PMAP_V6_H_ -#define _MACHINE_PMAP_V6_H_ - -#include -#include -#include -#include -#include - -typedef uint32_t pt1_entry_t; /* L1 table entry */ -typedef uint32_t pt2_entry_t; /* L2 table entry */ -typedef uint32_t ttb_entry_t; /* TTB entry */ - -#ifdef _KERNEL - -#if 0 -#define PMAP_PTE_NOCACHE // Use uncached page tables -#endif - -/* - * (1) During pmap bootstrap, physical pages for L2 page tables are - * allocated in advance which are used for KVA continuous mapping - * starting from KERNBASE. This makes things more simple. - * (2) During vm subsystem initialization, only vm subsystem itself can - * allocate physical memory safely. As pmap_map() is called during - * this initialization, we must be prepared for that and have some - * preallocated physical pages for L2 page tables. - * - * Note that some more pages for L2 page tables are preallocated too - * for mappings laying above VM_MAX_KERNEL_ADDRESS. - */ -#ifndef NKPT2PG -/* - * The optimal way is to define this in board configuration as - * definition here must be safe enough. It means really big. - * - * 1 GB KVA <=> 256 kernel L2 page table pages - * - * From real platforms: - * 1 GB physical memory <=> 10 pages is enough - * 2 GB physical memory <=> 21 pages is enough - */ -#define NKPT2PG 32 -#endif -#endif /* _KERNEL */ - -/* - * Pmap stuff - */ -struct md_page { - TAILQ_HEAD(,pv_entry) pv_list; - uint16_t pt2_wirecount[4]; - vm_memattr_t pat_mode; -}; - -struct pmap { - struct mtx pm_mtx; - pt1_entry_t *pm_pt1; /* KVA of pt1 */ - pt2_entry_t *pm_pt2tab; /* KVA of pt2 pages table */ - TAILQ_HEAD(,pv_chunk) pm_pvchunk; /* list of mappings in pmap */ - cpuset_t pm_active; /* active on cpus */ - struct pmap_statistics pm_stats; /* pmap statictics */ - LIST_ENTRY(pmap) pm_list; /* List of all pmaps */ -}; - -typedef struct pmap *pmap_t; - -#ifdef _KERNEL -extern struct pmap kernel_pmap_store; -#define kernel_pmap (&kernel_pmap_store) - -#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) -#define PMAP_LOCK_ASSERT(pmap, type) \ - mtx_assert(&(pmap)->pm_mtx, (type)) -#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) -#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ - NULL, MTX_DEF | MTX_DUPOK) -#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) -#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) -#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) -#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) - -extern ttb_entry_t pmap_kern_ttb; /* TTB for kernel pmap */ - -#define pmap_page_get_memattr(m) ((m)->md.pat_mode) - -/* - * Only the following functions or macros may be used before pmap_bootstrap() - * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and - * vtopte2(). - */ -void pmap_bootstrap(vm_offset_t); -void pmap_kenter(vm_offset_t, vm_paddr_t); -void pmap_kremove(vm_offset_t); -boolean_t pmap_page_is_mapped(vm_page_t); -bool pmap_ps_enabled(pmap_t pmap); - -void pmap_tlb_flush(pmap_t, vm_offset_t); -void pmap_tlb_flush_range(pmap_t, vm_offset_t, vm_size_t); - -vm_paddr_t pmap_dump_kextract(vm_offset_t, pt2_entry_t *); - -int pmap_fault(pmap_t, vm_offset_t, uint32_t, int, bool); - -void pmap_set_tex(void); - -/* - * Pre-bootstrap epoch functions set. - */ -void pmap_bootstrap_prepare(vm_paddr_t); -vm_paddr_t pmap_preboot_get_pages(u_int); -void pmap_preboot_map_pages(vm_paddr_t, vm_offset_t, u_int); -vm_offset_t pmap_preboot_reserve_pages(u_int); -vm_offset_t pmap_preboot_get_vpages(u_int); -void pmap_preboot_map_attr(vm_paddr_t, vm_offset_t, vm_size_t, vm_prot_t, - vm_memattr_t); -void pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr); - -#endif /* _KERNEL */ -#endif /* !_MACHINE_PMAP_V6_H_ */ diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h index b701478eed04..90568919b54a 100644 --- a/sys/arm/include/pmap.h +++ b/sys/arm/include/pmap.h @@ -1,10 +1,15 @@ /*- * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2016 Svatopluk Kraus - * Copyright (c) 2016 Michal Meloun + * Copyright (c) 2014,2016 Svatopluk Kraus + * Copyright (c) 2014,2016 Michal Meloun + * Copyright (c) 1991 Regents of the University of California. * All rights reserved. * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department and William Jolitz of UUNET Technologies Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -26,16 +31,140 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * The ARM version of this file was more or less based on the i386 version, + * which has the following provenance... + * + * Derived from hp300 version by Mike Hibler, this version by William + * Jolitz uses a recursive map [a pde points to the page directory] to + * map the page tables using the pagetables themselves. This is done to + * reduce the impact on kernel virtual memory for lots of sparse address + * space, and to reduce the cost of memory to each process. + * + * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 + * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 + * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30 + * * $FreeBSD$ */ #ifndef _MACHINE_PMAP_H_ #define _MACHINE_PMAP_H_ -#include +#include +#include +#include +#include +#include +#include + +typedef uint32_t pt1_entry_t; /* L1 table entry */ +typedef uint32_t pt2_entry_t; /* L2 table entry */ +typedef uint32_t ttb_entry_t; /* TTB entry */ #ifdef _KERNEL -#include + +#if 0 +#define PMAP_PTE_NOCACHE // Use uncached page tables +#endif + +/* + * (1) During pmap bootstrap, physical pages for L2 page tables are + * allocated in advance which are used for KVA continuous mapping + * starting from KERNBASE. This makes things more simple. + * (2) During vm subsystem initialization, only vm subsystem itself can + * allocate physical memory safely. As pmap_map() is called during + * this initialization, we must be prepared for that and have some + * preallocated physical pages for L2 page tables. + * + * Note that some more pages for L2 page tables are preallocated too + * for mappings laying above VM_MAX_KERNEL_ADDRESS. + */ +#ifndef NKPT2PG +/* + * The optimal way is to define this in board configuration as + * definition here must be safe enough. It means really big. + * + * 1 GB KVA <=> 256 kernel L2 page table pages + * + * From real platforms: + * 1 GB physical memory <=> 10 pages is enough + * 2 GB physical memory <=> 21 pages is enough + */ +#define NKPT2PG 32 +#endif +#endif /* _KERNEL */ + +/* + * Pmap stuff + */ +struct md_page { + TAILQ_HEAD(,pv_entry) pv_list; + uint16_t pt2_wirecount[4]; + vm_memattr_t pat_mode; +}; + +struct pmap { + struct mtx pm_mtx; + pt1_entry_t *pm_pt1; /* KVA of pt1 */ + pt2_entry_t *pm_pt2tab; /* KVA of pt2 pages table */ + TAILQ_HEAD(,pv_chunk) pm_pvchunk; /* list of mappings in pmap */ + cpuset_t pm_active; /* active on cpus */ + struct pmap_statistics pm_stats; /* pmap statictics */ + LIST_ENTRY(pmap) pm_list; /* List of all pmaps */ +}; + +typedef struct pmap *pmap_t; + +#ifdef _KERNEL +extern struct pmap kernel_pmap_store; +#define kernel_pmap (&kernel_pmap_store) + +#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) +#define PMAP_LOCK_ASSERT(pmap, type) \ + mtx_assert(&(pmap)->pm_mtx, (type)) +#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) +#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ + NULL, MTX_DEF | MTX_DUPOK) +#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) +#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) +#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) +#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) + +extern ttb_entry_t pmap_kern_ttb; /* TTB for kernel pmap */ + +#define pmap_page_get_memattr(m) ((m)->md.pat_mode) + +/* + * Only the following functions or macros may be used before pmap_bootstrap() + * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and + * vtopte2(). + */ +void pmap_bootstrap(vm_offset_t); +void pmap_kenter(vm_offset_t, vm_paddr_t); +void pmap_kremove(vm_offset_t); +boolean_t pmap_page_is_mapped(vm_page_t); +bool pmap_ps_enabled(pmap_t pmap); + +void pmap_tlb_flush(pmap_t, vm_offset_t); +void pmap_tlb_flush_range(pmap_t, vm_offset_t, vm_size_t); + +vm_paddr_t pmap_dump_kextract(vm_offset_t, pt2_entry_t *); + +int pmap_fault(pmap_t, vm_offset_t, uint32_t, int, bool); + +void pmap_set_tex(void); + +/* + * Pre-bootstrap epoch functions set. + */ +void pmap_bootstrap_prepare(vm_paddr_t); +vm_paddr_t pmap_preboot_get_pages(u_int); +void pmap_preboot_map_pages(vm_paddr_t, vm_offset_t, u_int); +vm_offset_t pmap_preboot_reserve_pages(u_int); +vm_offset_t pmap_preboot_get_vpages(u_int); +void pmap_preboot_map_attr(vm_paddr_t, vm_offset_t, vm_size_t, vm_prot_t, + vm_memattr_t); +void pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr); extern char *_tmppt; /* poor name! */