[arch][arm64] add support for 16k pages
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include <lk/main.h>
|
||||
#include <platform.h>
|
||||
#include <lk/trace.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define LOCAL_TRACE 0
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
#include <arch/defines.h>
|
||||
|
||||
#define IFTE(c,t,e) (!!(c) * (t) | !(c) * (e))
|
||||
#define IFTE(c, t, e) (!!(c) * (t) | !(c) * (e))
|
||||
#define NBITS01(n) IFTE(n, 1, 0)
|
||||
#define NBITS02(n) IFTE((n) >> 1, 1 + NBITS01((n) >> 1), NBITS01(n))
|
||||
#define NBITS04(n) IFTE((n) >> 2, 2 + NBITS02((n) >> 2), NBITS02(n))
|
||||
@@ -20,9 +20,10 @@
|
||||
#define NBITS32(n) IFTE((n) >> 16, 16 + NBITS16((n) >> 16), NBITS16(n))
|
||||
#define NBITS(n) IFTE((n) >> 32, 32 + NBITS32((n) >> 32), NBITS32(n))
|
||||
|
||||
// TODO: perhaps pass KERNEL_SIZE_SHIFT in from rules.mk and compute the size from that
|
||||
#ifndef MMU_KERNEL_SIZE_SHIFT
|
||||
#define KERNEL_ASPACE_BITS (NBITS(0xffffffffffffffff-KERNEL_ASPACE_BASE))
|
||||
#define KERNEL_BASE_BITS (NBITS(0xffffffffffffffff-KERNEL_BASE))
|
||||
#define KERNEL_ASPACE_BITS (NBITS(0xffffffffffffffff - KERNEL_ASPACE_BASE))
|
||||
#define KERNEL_BASE_BITS (NBITS(0xffffffffffffffff - KERNEL_BASE))
|
||||
#if KERNEL_BASE_BITS > KERNEL_ASPACE_BITS
|
||||
#define KERNEL_ASPACE_BITS KERNEL_BASE_BITS /* KERNEL_BASE should not be below KERNEL_ASPACE_BASE */
|
||||
#endif
|
||||
@@ -35,7 +36,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MMU_USER_SIZE_SHIFT
|
||||
#define MMU_USER_SIZE_SHIFT 48
|
||||
#define MMU_USER_SIZE_SHIFT MMU_KERNEL_SIZE_SHIFT
|
||||
#endif
|
||||
|
||||
#define MMU_KERNEL_PAGE_SIZE_SHIFT (PAGE_SIZE_SHIFT)
|
||||
@@ -116,13 +117,12 @@
|
||||
#define MMU_TCR_TG0(granule_size) BM(14, 2, (granule_size))
|
||||
#define MMU_TCR_SH0(shareability_flags) BM(12, 2, (shareability_flags))
|
||||
#define MMU_TCR_ORGN0(cache_flags) BM(10, 2, (cache_flags))
|
||||
#define MMU_TCR_IRGN0(cache_flags) BM( 8, 2, (cache_flags))
|
||||
#define MMU_TCR_EPD0 BM( 7, 1, 1)
|
||||
#define MMU_TCR_T0SZ(size) BM( 0, 6, (size))
|
||||
#define MMU_TCR_IRGN0(cache_flags) BM(8, 2, (cache_flags))
|
||||
#define MMU_TCR_EPD0 BM(7, 1, 1)
|
||||
#define MMU_TCR_T0SZ(size) BM(0, 6, (size))
|
||||
|
||||
#define MMU_MAIR_ATTR(index, attr) BM(index * 8, 8, (attr))
|
||||
|
||||
|
||||
/* L0/L1/L2/L3 descriptor types */
|
||||
#define MMU_PTE_DESCRIPTOR_INVALID BM(0, 2, 0)
|
||||
#define MMU_PTE_DESCRIPTOR_MASK BM(0, 2, 3)
|
||||
@@ -195,7 +195,7 @@
|
||||
#define MMU_MAIR_VAL (MMU_MAIR_ATTR0 | MMU_MAIR_ATTR1 | \
|
||||
MMU_MAIR_ATTR2 | MMU_MAIR_ATTR3 | \
|
||||
MMU_MAIR_ATTR4 | MMU_MAIR_ATTR5 | \
|
||||
MMU_MAIR_ATTR6 | MMU_MAIR_ATTR7 )
|
||||
MMU_MAIR_ATTR6 | MMU_MAIR_ATTR7)
|
||||
|
||||
/* Enable cached page table walks:
|
||||
* inner/outer (IRGN/ORGN): write-back + write-allocate
|
||||
@@ -245,26 +245,25 @@
|
||||
|
||||
#ifndef ASSEMBLY
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
#include <lk/compiler.h>
|
||||
#include <arch/arm64.h>
|
||||
#include <lk/compiler.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef uint64_t pte_t;
|
||||
|
||||
__BEGIN_CDECLS
|
||||
|
||||
#define ARM64_TLBI_NOADDR(op) \
|
||||
({ \
|
||||
({ \
|
||||
__asm__ volatile("tlbi " #op::); \
|
||||
ISB; \
|
||||
})
|
||||
})
|
||||
|
||||
#define ARM64_TLBI(op, val) \
|
||||
({ \
|
||||
__asm__ volatile("tlbi " #op ", %0" :: "r" (val)); \
|
||||
({ \
|
||||
__asm__ volatile("tlbi " #op ", %0" ::"r"(val)); \
|
||||
ISB; \
|
||||
})
|
||||
})
|
||||
|
||||
#define MMU_ARM64_GLOBAL_ASID (~0U)
|
||||
#define MMU_ARM64_USER_ASID (0U)
|
||||
|
||||
@@ -18,14 +18,8 @@ MODULE_SRCS += \
|
||||
$(LOCAL_DIR)/start.S \
|
||||
$(LOCAL_DIR)/cache-ops.S \
|
||||
|
||||
# $(LOCAL_DIR)/arm/start.S \
|
||||
$(LOCAL_DIR)/arm/cache.c \
|
||||
$(LOCAL_DIR)/arm/ops.S \
|
||||
$(LOCAL_DIR)/arm/faults.c \
|
||||
$(LOCAL_DIR)/arm/dcc.S
|
||||
|
||||
# if its requested we build with SMP, arm generically supports 4 cpus
|
||||
ifeq ($(WITH_SMP),1)
|
||||
# if its requested we build with SMP, default to 4 cpus
|
||||
ifeq (true,$(call TOBOOL,$(WITH_SMP)))
|
||||
SMP_MAX_CPUS ?= 4
|
||||
SMP_CPU_CLUSTER_SHIFT ?= 8
|
||||
SMP_CPU_ID_BITS ?= 24 # Ignore aff3 bits for now since they are not next to aff2
|
||||
@@ -48,15 +42,32 @@ ARCH_OPTFLAGS := -O2
|
||||
# we have a mmu and want the vmm/pmm
|
||||
WITH_KERNEL_VM ?= 1
|
||||
|
||||
ifeq ($(WITH_KERNEL_VM),1)
|
||||
ifeq (true,$(call TOBOOL,$(WITH_KERNEL_VM)))
|
||||
|
||||
MODULE_SRCS += \
|
||||
$(LOCAL_DIR)/mmu.c
|
||||
|
||||
ARM64_PAGE_SIZE ?= 4096
|
||||
|
||||
# platform/target/project is allowed to override the page size the kernel
|
||||
# and user space will run at.
|
||||
ifeq ($(ARM64_PAGE_SIZE), 4096)
|
||||
KERNEL_ASPACE_BASE ?= 0xffff000000000000
|
||||
KERNEL_ASPACE_SIZE ?= 0x0001000000000000
|
||||
USER_ASPACE_BASE ?= 0x0000000001000000
|
||||
USER_ASPACE_SIZE ?= 0x0000fffffe000000
|
||||
else ifeq ($(ARM64_PAGE_SIZE), 16384)
|
||||
GLOBAL_DEFINES += ARM64_LARGE_PAGESIZE_16K=1
|
||||
KERNEL_ASPACE_BASE ?= 0xffff800000000000
|
||||
KERNEL_ASPACE_SIZE ?= 0x0000800000000000
|
||||
USER_ASPACE_BASE ?= 0x0000000001000000
|
||||
USER_ASPACE_SIZE ?= 0x00007ffffe000000
|
||||
else ifeq ($(ARM64_PAGE_SIZE), 65536)
|
||||
GLOBAL_DEFINES += ARM64_LARGE_PAGESIZE_64K=1
|
||||
$(error fix for 64k)
|
||||
else
|
||||
$(error unsupported ARM64_PAGE_SIZE)
|
||||
endif
|
||||
|
||||
GLOBAL_DEFINES += \
|
||||
KERNEL_ASPACE_BASE=$(KERNEL_ASPACE_BASE) \
|
||||
@@ -68,17 +79,17 @@ GLOBAL_DEFINES += \
|
||||
KERNEL_BASE ?= $(KERNEL_ASPACE_BASE)
|
||||
KERNEL_LOAD_OFFSET ?= 0
|
||||
|
||||
GLOBAL_DEFINES += \
|
||||
KERNEL_BASE=$(KERNEL_BASE) \
|
||||
KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET)
|
||||
|
||||
else
|
||||
else # !WITH_KERNEL_VM
|
||||
|
||||
KERNEL_BASE ?= $(MEMBASE)
|
||||
KERNEL_LOAD_OFFSET ?= 0
|
||||
|
||||
endif
|
||||
|
||||
GLOBAL_DEFINES += \
|
||||
KERNEL_BASE=$(KERNEL_BASE) \
|
||||
KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET)
|
||||
|
||||
GLOBAL_DEFINES += \
|
||||
MEMBASE=$(MEMBASE) \
|
||||
MEMSIZE=$(MEMSIZE)
|
||||
@@ -92,7 +103,7 @@ ARCH_COMPILEFLAGS += -fno-omit-frame-pointer
|
||||
ARCH_COMPILEFLAGS_NOFLOAT := -mgeneral-regs-only
|
||||
ARCH_COMPILEFLAGS_FLOAT :=
|
||||
|
||||
ARCH_LDFLAGS += -z max-page-size=4096
|
||||
ARCH_LDFLAGS += -z max-page-size=$(ARM64_PAGE_SIZE)
|
||||
|
||||
LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) -print-libgcc-file-name)
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ SECTIONS
|
||||
__code_end = .;
|
||||
}
|
||||
|
||||
.rodata : ALIGN(4096) {
|
||||
.rodata : ALIGN(CONSTANT(MAXPAGESIZE)) {
|
||||
__rodata_start = .;
|
||||
__fault_handler_table_start = .;
|
||||
KEEP(*(.rodata.fault_handler_table))
|
||||
@@ -68,7 +68,7 @@ SECTIONS
|
||||
__rodata_end = .;
|
||||
}
|
||||
|
||||
.data : ALIGN(4096) {
|
||||
.data : ALIGN(CONSTANT(MAXPAGESIZE)) {
|
||||
/* writable data */
|
||||
__data_start_rom = .;
|
||||
/* in one segment binaries, the rom data address is on top of the ram data address */
|
||||
@@ -99,7 +99,7 @@ SECTIONS
|
||||
}
|
||||
|
||||
/* unintialized data (in same segment as writable data) */
|
||||
.bss : ALIGN(4096) {
|
||||
.bss : ALIGN(CONSTANT(MAXPAGESIZE)) {
|
||||
__bss_start = .;
|
||||
KEEP(*(.bss.prebss.*))
|
||||
. = ALIGN(8);
|
||||
@@ -112,7 +112,7 @@ SECTIONS
|
||||
}
|
||||
|
||||
/* Align the end to ensure anything after the kernel ends up on its own pages */
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||
_end = .;
|
||||
|
||||
. = %KERNEL_BASE% + %MEMSIZE%;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "io_stack.h"
|
||||
|
||||
#include <kernel/vm.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void *get_io_stack() {
|
||||
static void *io_stack = nullptr;
|
||||
|
||||
12
project/qemu-virt-arm64-16k-test.mk
Normal file
12
project/qemu-virt-arm64-16k-test.mk
Normal file
@@ -0,0 +1,12 @@
|
||||
# main project for qemu-aarch64
|
||||
MODULES += \
|
||||
app/shell \
|
||||
lib/uefi \
|
||||
|
||||
ARM64_PAGE_SIZE := 16384
|
||||
|
||||
include project/virtual/test.mk
|
||||
include project/virtual/fs.mk
|
||||
include project/virtual/minip.mk
|
||||
include project/target/qemu-virt-arm64.mk
|
||||
|
||||
@@ -22,8 +22,10 @@ esac
|
||||
|
||||
function HELP {
|
||||
echo "help:"
|
||||
echo "-p <project> : specify the project to build (default qemu-virt-arm32-test, qemu-virt-arm64-test or lm3s6965evb-test)"
|
||||
echo "-6 : 64bit arm"
|
||||
echo "-3 : cortex-m3 based platform"
|
||||
echo "-P <page size> : set the page size (default: 4K)"
|
||||
echo "-v : boot kernel at EL2"
|
||||
echo "-k : use KVM or HVF acceleration if present (only on 64bit)"
|
||||
echo "-m <memory in MB>"
|
||||
@@ -46,7 +48,7 @@ function HELP {
|
||||
DO_NET=0
|
||||
DO_NET_TAP=0
|
||||
DO_DISK=0
|
||||
DO_DISK_IMAGE=""
|
||||
DISK_IMAGE=""
|
||||
DO_64BIT=0
|
||||
DO_VIRT=0
|
||||
DO_CORTEX_M3=0
|
||||
@@ -56,12 +58,13 @@ DO_CMPCTMALLOC=0
|
||||
DO_MINIHEAP=0
|
||||
DO_V9P=0
|
||||
DO_V9P_DIR=""
|
||||
PAGE_SIZE=4096
|
||||
SMP=1
|
||||
MEMSIZE=512
|
||||
SUDO=""
|
||||
PROJECT=""
|
||||
|
||||
while getopts cd:ghkm:Mnt36vp:s:f: FLAG; do
|
||||
while getopts cd:ghkm:Mnt36vp:P:s:f: FLAG; do
|
||||
case $FLAG in
|
||||
c) DO_CMPCTMALLOC=1;;
|
||||
d) DO_DISK=1; DISK_IMAGE=$OPTARG;;
|
||||
@@ -77,6 +80,7 @@ while getopts cd:ghkm:Mnt36vp:s:f: FLAG; do
|
||||
m) MEMSIZE=$OPTARG;;
|
||||
s) SMP=$OPTARG;;
|
||||
p) PROJECT=$OPTARG;;
|
||||
P) PAGE_SIZE=$OPTARG;;
|
||||
h) HELP;;
|
||||
\?)
|
||||
echo unrecognized option
|
||||
@@ -89,7 +93,7 @@ shift $((OPTIND-1))
|
||||
# pick the appropriate qemu and project
|
||||
if [ $DO_64BIT == 1 ]; then
|
||||
QEMU="qemu-system-aarch64"
|
||||
CPU="cortex-a53"
|
||||
CPU="cortex-a76"
|
||||
MACHINE="virt"
|
||||
if [ $DO_KVM == 1 ]; then
|
||||
CPU="host"
|
||||
@@ -101,7 +105,11 @@ if [ $DO_64BIT == 1 ]; then
|
||||
elif [ $DO_VIRT == 1 ]; then
|
||||
MACHINE+=",virtualization=on"
|
||||
fi
|
||||
if [ $PAGE_SIZE == 16384 ]; then
|
||||
_PROJECT="qemu-virt-arm64-16k-test"
|
||||
else
|
||||
_PROJECT="qemu-virt-arm64-test"
|
||||
fi
|
||||
elif [ $DO_CORTEX_M3 == 1 ]; then
|
||||
QEMU="qemu-system-arm"
|
||||
CPU="cortex-m3"
|
||||
|
||||
Reference in New Issue
Block a user