Files
seL4/libsel4/sel4_arch_include/aarch64/sel4/sel4_arch/constants.h
Kent McLeod b86bce2d4b aarch64,cortex-a53,hyp: Reduce seL4_UserTop value
This ensures that no frames can be mapped that would overwrite the
currently stored VMID for the vspace.

Signed-off-by: Kent McLeod <kent@kry10.com>
2020-10-16 14:38:31 +11:00

288 lines
7.7 KiB
C

/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#ifdef HAVE_AUTOCONF
#include <autoconf.h>
#endif
#ifndef __ASSEMBLER__
/* format of an unknown syscall message */
typedef enum {
seL4_UnknownSyscall_X0,
seL4_UnknownSyscall_X1,
seL4_UnknownSyscall_X2,
seL4_UnknownSyscall_X3,
seL4_UnknownSyscall_X4,
seL4_UnknownSyscall_X5,
seL4_UnknownSyscall_X6,
seL4_UnknownSyscall_X7,
seL4_UnknownSyscall_FaultIP,
seL4_UnknownSyscall_SP,
seL4_UnknownSyscall_LR,
seL4_UnknownSyscall_SPSR,
seL4_UnknownSyscall_Syscall,
/* length of an unknown syscall message */
seL4_UnknownSyscall_Length,
SEL4_FORCE_LONG_ENUM(seL4_UnknownSyscall_Msg),
} seL4_UnknownSyscall_Msg;
/* format of a user exception message */
typedef enum {
seL4_UserException_FaultIP,
seL4_UserException_SP,
seL4_UserException_SPSR,
seL4_UserException_Number,
seL4_UserException_Code,
/* length of a user exception */
seL4_UserException_Length,
SEL4_FORCE_LONG_ENUM(seL4_UserException_Msg),
} seL4_UserException_Msg;
/* format of a vm fault message */
typedef enum {
seL4_VMFault_IP,
seL4_VMFault_Addr,
seL4_VMFault_PrefetchFault,
seL4_VMFault_FSR,
seL4_VMFault_Length,
SEL4_FORCE_LONG_ENUM(seL4_VMFault_Msg),
} seL4_VMFault_Msg;
#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
typedef enum {
seL4_VGICMaintenance_IDX,
seL4_VGICMaintenance_Length,
SEL4_FORCE_LONG_ENUM(seL4_VGICMaintenance_Msg),
} seL4_VGICMaintenance_Msg;
typedef enum {
seL4_VPPIEvent_IRQ,
SEL4_FORCE_LONG_ENUM(seL4_VPPIEvent_Msg),
} seL4_VPPIEvent_Msg;
typedef enum {
seL4_VCPUFault_HSR,
seL4_VCPUFault_Length,
SEL4_FORCE_LONG_ENUM(seL4_VCPUFault_Msg),
} seL4_VCPUFault_Msg;
typedef enum {
/* VM control registers EL1 */
seL4_VCPUReg_SCTLR = 0,
seL4_VCPUReg_TTBR0,
seL4_VCPUReg_TTBR1,
seL4_VCPUReg_TCR,
seL4_VCPUReg_MAIR,
seL4_VCPUReg_AMAIR,
seL4_VCPUReg_CIDR,
/* other system registers EL1 */
seL4_VCPUReg_ACTLR,
seL4_VCPUReg_CPACR,
/* exception handling registers EL1 */
seL4_VCPUReg_AFSR0,
seL4_VCPUReg_AFSR1,
seL4_VCPUReg_ESR,
seL4_VCPUReg_FAR,
seL4_VCPUReg_ISR,
seL4_VCPUReg_VBAR,
/* thread pointer/ID registers EL0/EL1 */
seL4_VCPUReg_TPIDR_EL1,
#if CONFIG_MAX_NUM_NODES > 1
/* Virtualisation Multiprocessor ID Register */
seL4_VCPUReg_VMPIDR_EL2,
#endif /* CONFIG_MAX_NUM_NODES > 1 */
/* general registers x0 to x30 have been saved by traps.S */
seL4_VCPUReg_SP_EL1,
seL4_VCPUReg_ELR_EL1,
seL4_VCPUReg_SPSR_EL1, // 32-bit
/* generic timer registers, to be completed */
seL4_VCPUReg_CNTV_CTL,
seL4_VCPUReg_CNTV_CVAL,
seL4_VCPUReg_CNTVOFF,
seL4_VCPUReg_CNTKCTL_EL1,
seL4_VCPUReg_Num,
} seL4_VCPUReg;
#endif /* CONFIG_ARM_HYPERVISOR_SUPPORT */
#ifdef CONFIG_KERNEL_MCS
typedef enum {
seL4_TimeoutReply_FaultIP,
seL4_TimeoutReply_SP,
seL4_TimeoutReply_SPSR_EL1,
seL4_TimeoutReply_X0,
seL4_TimeoutReply_X1,
seL4_TimeoutReply_X2,
seL4_TimeoutReply_X3,
seL4_TimeoutReply_X4,
seL4_TimeoutReply_X5,
seL4_TimeoutReply_X6,
seL4_TimeoutReply_X7,
seL4_TimeoutReply_X8,
seL4_TimeoutReply_X16,
seL4_TimeoutReply_X17,
seL4_TimeoutReply_X18,
seL4_TimeoutReply_X29,
seL4_TimeoutReply_X30,
seL4_TimeoutReply_X9,
seL4_TimeoutReply_X10,
seL4_TimeoutReply_X11,
seL4_TimeoutReply_X12,
seL4_TimeoutReply_X13,
seL4_TimeoutReply_X14,
seL4_TimeoutReply_X15,
seL4_TimeoutReply_X19,
seL4_TimeoutReply_X20,
seL4_TimeoutReply_X21,
seL4_TimeoutReply_X22,
seL4_TimeoutReply_X23,
seL4_TimeoutReply_X24,
seL4_TimeoutReply_X25,
seL4_TimeoutReply_X26,
seL4_TimeoutReply_X27,
seL4_TimeoutReply_X28,
seL4_TimeoutReply_Length,
SEL4_FORCE_LONG_ENUM(seL4_TimeoutReply_Msg)
} seL4_TimeoutReply_Msg;
typedef enum {
seL4_Timeout_Data,
seL4_Timeout_Consumed,
seL4_Timeout_Length,
SEL4_FORCE_LONG_ENUM(seL4_Timeout_Msg)
} seL4_TimeoutMsg;
#endif
#endif /* !__ASSEMBLER__ */
#define seL4_DataFault 0
#define seL4_InstructionFault 1
/* object sizes - 2^n */
#define seL4_PageBits 12
#define seL4_LargePageBits 21
#define seL4_HugePageBits 30
#define seL4_SlotBits 5
#define seL4_TCBBits 11
#define seL4_EndpointBits 4
#ifdef CONFIG_KERNEL_MCS
#define seL4_NotificationBits 6
#define seL4_ReplyBits 5
#else
#define seL4_NotificationBits 5
#endif
#define seL4_PageTableBits 12
#define seL4_PageTableEntryBits 3
#define seL4_PageTableIndexBits 9
#define seL4_PageDirBits 12
#define seL4_PageDirEntryBits 3
#define seL4_PageDirIndexBits 9
#define seL4_NumASIDPoolsBits 7
#define seL4_ASIDPoolBits 12
#define seL4_ASIDPoolIndexBits 9
#define seL4_IOPageTableBits 12
#define seL4_WordSizeBits 3
#define seL4_PUDEntryBits 3
#if defined(CONFIG_ARM_HYPERVISOR_SUPPORT) && defined (CONFIG_ARM_PA_SIZE_BITS_40)
/* for a 3 level translation, we skip the PGD */
#define seL4_PGDBits 0
#define seL4_PGDEntryBits 0
#define seL4_PGDIndexBits 0
#define seL4_PUDBits 13
#define seL4_PUDIndexBits 10
#define seL4_VSpaceBits seL4_PUDBits
#define seL4_VSpaceIndexBits seL4_PUDIndexBits
#define seL4_ARM_VSpaceObject seL4_ARM_PageUpperDirectoryObject
#else
#define seL4_PGDBits 12
#define seL4_PGDEntryBits 3
#define seL4_PGDIndexBits 9
#define seL4_PUDBits 12
#define seL4_PUDIndexBits 9
#define seL4_VSpaceBits seL4_PGDBits
#define seL4_VSpaceIndexBits seL4_PGDIndexBits
#define seL4_ARM_VSpaceObject seL4_ARM_PageGlobalDirectoryObject
#endif
#define seL4_ARM_VCPUBits 12
#define seL4_VCPUBits 12
/* word size */
#define seL4_WordBits (sizeof(seL4_Word) * 8)
/* Untyped size limits */
#define seL4_MinUntypedBits 4
#define seL4_MaxUntypedBits 47
#ifndef __ASSEMBLER__
SEL4_SIZE_SANITY(seL4_PageTableEntryBits, seL4_PageTableIndexBits, seL4_PageTableBits);
SEL4_SIZE_SANITY(seL4_PageDirEntryBits, seL4_PageDirIndexBits, seL4_PageDirBits);
SEL4_SIZE_SANITY(seL4_WordSizeBits, seL4_ASIDPoolIndexBits, seL4_ASIDPoolBits);
SEL4_SIZE_SANITY(seL4_PGDEntryBits, seL4_PGDIndexBits, seL4_PGDBits);
SEL4_SIZE_SANITY(seL4_PUDEntryBits, seL4_PUDIndexBits, seL4_PUDBits);
#endif
#ifdef CONFIG_ENABLE_BENCHMARKS
/* size of kernel log buffer in bytes */
#define seL4_LogBufferSize (LIBSEL4_BIT(20))
#endif /* CONFIG_ENABLE_BENCHMARKS */
#ifdef CONFIG_HARDWARE_DEBUG_API
#define seL4_FirstBreakpoint (0)
#define seL4_FirstDualFunctionMonitor (-1)
#define seL4_NumDualFunctionMonitors (0)
#endif
#define seL4_FastMessageRegisters 4
/* IPC buffer is 1024 bytes, giving size bits of 10 */
#define seL4_IPCBufferSizeBits 10
#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT
/* 1 slot at the end of the vspace is used to hold the VMID assigned to the vspace */
#define seL4_VSpaceReservedSlots 1
/* The userspace occupies the range 0x0 to 0xfffffffffff.
* The stage-1 translation is disabled, and the stage-2
* translation input addree size is constrained by the
* ID_AA64MMFR0_EL1.PARange which is 44 bits on TX1.
* Anything address above the range above triggers an
* address size fault.
*/
/* First address in the virtual address space that is not accessible to user level */
#if defined(CONFIG_ARM_PA_SIZE_BITS_44)
#define seL4_UserTop 0x00000fffffffffff
#elif defined(CONFIG_ARM_PA_SIZE_BITS_40)
/* Currently other definitions of seL4_UserTop already have free slots at the end and don't need to subtract for seL4_VSpaceReservedSlots.
* Each slot used requires subtracting 1GiB from the top address.
*/
#define seL4_UserTop (0x000000ffffffffff - seL4_VSpaceReservedSlots * 0x40000000)
#else
#error "Unknown physical address width"
#endif
#else
/* First address in the virtual address space that is not accessible to user level */
#define seL4_UserTop 0x00007fffffffffff
#endif