mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch 'for-next/poe' into for-next/core
* for-next/poe: (31 commits) arm64: pkeys: remove redundant WARN kselftest/arm64: Add test case for POR_EL0 signal frame records kselftest/arm64: parse POE_MAGIC in a signal frame kselftest/arm64: add HWCAP test for FEAT_S1POE selftests: mm: make protection_keys test work on arm64 selftests: mm: move fpregs printing kselftest/arm64: move get_header() arm64: add Permission Overlay Extension Kconfig arm64: enable PKEY support for CPUs with S1POE arm64: enable POE and PIE to coexist arm64/ptrace: add support for FEAT_POE arm64: add POE signal support arm64: implement PKEYS support arm64: add pte_access_permitted_no_overlay() arm64: handle PKEY/POE faults arm64: mask out POIndex when modifying a PTE arm64: convert protection key into vm_flags and pgprot values arm64: add POIndex defines arm64: re-order MTE VM_ flags arm64: enable the Permission Overlay Extension for EL0 ...
This commit is contained in:
@@ -365,6 +365,8 @@ HWCAP2_SME_SF8DP2
|
||||
HWCAP2_SME_SF8DP4
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
|
||||
|
||||
HWCAP2_POE
|
||||
Functionality implied by ID_AA64MMFR3_EL1.S1POE == 0b0001.
|
||||
|
||||
4. Unused AT_HWCAP bits
|
||||
-----------------------
|
||||
|
||||
@@ -2138,6 +2138,29 @@ config ARM64_EPAN
|
||||
if the cpu does not implement the feature.
|
||||
endmenu # "ARMv8.7 architectural features"
|
||||
|
||||
menu "ARMv8.9 architectural features"
|
||||
|
||||
config ARM64_POE
|
||||
prompt "Permission Overlay Extension"
|
||||
def_bool y
|
||||
select ARCH_USES_HIGH_VMA_FLAGS
|
||||
select ARCH_HAS_PKEYS
|
||||
help
|
||||
The Permission Overlay Extension is used to implement Memory
|
||||
Protection Keys. Memory Protection Keys provides a mechanism for
|
||||
enforcing page-based protections, but without requiring modification
|
||||
of the page tables when an application changes protection domains.
|
||||
|
||||
For details, see Documentation/core-api/protection-keys.rst
|
||||
|
||||
If unsure, say y.
|
||||
|
||||
config ARCH_PKEY_BITS
|
||||
int
|
||||
default 3
|
||||
|
||||
endmenu # "ARMv8.9 architectural features"
|
||||
|
||||
config ARM64_SVE
|
||||
bool "ARM Scalable Vector Extension support"
|
||||
default y
|
||||
|
||||
@@ -832,6 +832,12 @@ static inline bool system_supports_lpa2(void)
|
||||
return cpus_have_final_cap(ARM64_HAS_LPA2);
|
||||
}
|
||||
|
||||
static inline bool system_supports_poe(void)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_ARM64_POE) &&
|
||||
alternative_has_cap_unlikely(ARM64_HAS_S1POE);
|
||||
}
|
||||
|
||||
int do_emulate_mrs(struct pt_regs *regs, u32 sys_reg, u32 rt);
|
||||
bool try_emulate_mrs(struct pt_regs *regs, u32 isn);
|
||||
|
||||
|
||||
@@ -192,6 +192,14 @@
|
||||
orr x0, x0, #HFGxTR_EL2_nPIRE0_EL1
|
||||
|
||||
.Lskip_pie_fgt_\@:
|
||||
mrs_s x1, SYS_ID_AA64MMFR3_EL1
|
||||
ubfx x1, x1, #ID_AA64MMFR3_EL1_S1POE_SHIFT, #4
|
||||
cbz x1, .Lskip_poe_fgt_\@
|
||||
|
||||
/* Disable trapping of POR_EL0 */
|
||||
orr x0, x0, #HFGxTR_EL2_nPOR_EL0
|
||||
|
||||
.Lskip_poe_fgt_\@:
|
||||
msr_s SYS_HFGRTR_EL2, x0
|
||||
msr_s SYS_HFGWTR_EL2, x0
|
||||
msr_s SYS_HFGITR_EL2, xzr
|
||||
|
||||
@@ -157,6 +157,7 @@
|
||||
#define KERNEL_HWCAP_SME_SF8FMA __khwcap2_feature(SME_SF8FMA)
|
||||
#define KERNEL_HWCAP_SME_SF8DP4 __khwcap2_feature(SME_SF8DP4)
|
||||
#define KERNEL_HWCAP_SME_SF8DP2 __khwcap2_feature(SME_SF8DP2)
|
||||
#define KERNEL_HWCAP_POE __khwcap2_feature(POE)
|
||||
|
||||
/*
|
||||
* This yields a mask that user programs can use to figure out what
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <asm/hyp_image.h>
|
||||
#include <asm/insn.h>
|
||||
#include <asm/virt.h>
|
||||
#include <asm/sysreg.h>
|
||||
|
||||
#define ARM_EXIT_WITH_SERROR_BIT 31
|
||||
#define ARM_EXCEPTION_CODE(x) ((x) & ~(1U << ARM_EXIT_WITH_SERROR_BIT))
|
||||
@@ -259,7 +260,7 @@ extern u64 __kvm_get_mdcr_el2(void);
|
||||
asm volatile( \
|
||||
" mrs %1, spsr_el2\n" \
|
||||
" mrs %2, elr_el2\n" \
|
||||
"1: at "at_op", %3\n" \
|
||||
"1: " __msr_s(at_op, "%3") "\n" \
|
||||
" isb\n" \
|
||||
" b 9f\n" \
|
||||
"2: msr spsr_el2, %1\n" \
|
||||
|
||||
@@ -446,6 +446,8 @@ enum vcpu_sysreg {
|
||||
GCR_EL1, /* Tag Control Register */
|
||||
TFSRE0_EL1, /* Tag Fault Status Register (EL0) */
|
||||
|
||||
POR_EL0, /* Permission Overlay Register 0 (EL0) */
|
||||
|
||||
/* 32bit specific registers. */
|
||||
DACR32_EL2, /* Domain Access Control Register */
|
||||
IFSR32_EL2, /* Instruction Fault Status Register */
|
||||
@@ -517,6 +519,8 @@ enum vcpu_sysreg {
|
||||
VNCR(PIR_EL1), /* Permission Indirection Register 1 (EL1) */
|
||||
VNCR(PIRE0_EL1), /* Permission Indirection Register 0 (EL1) */
|
||||
|
||||
VNCR(POR_EL1), /* Permission Overlay Register 1 (EL1) */
|
||||
|
||||
VNCR(HFGRTR_EL2),
|
||||
VNCR(HFGWTR_EL2),
|
||||
VNCR(HFGITR_EL2),
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <uapi/asm/mman.h>
|
||||
|
||||
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||
unsigned long pkey __always_unused)
|
||||
unsigned long pkey)
|
||||
{
|
||||
unsigned long ret = 0;
|
||||
|
||||
@@ -17,6 +17,14 @@ static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||
if (system_supports_mte() && (prot & PROT_MTE))
|
||||
ret |= VM_MTE;
|
||||
|
||||
#ifdef CONFIG_ARCH_HAS_PKEYS
|
||||
if (system_supports_poe()) {
|
||||
ret |= pkey & BIT(0) ? VM_PKEY_BIT0 : 0;
|
||||
ret |= pkey & BIT(1) ? VM_PKEY_BIT1 : 0;
|
||||
ret |= pkey & BIT(2) ? VM_PKEY_BIT2 : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
|
||||
|
||||
@@ -25,6 +25,7 @@ typedef struct {
|
||||
refcount_t pinned;
|
||||
void *vdso;
|
||||
unsigned long flags;
|
||||
u8 pkey_allocation_map;
|
||||
} mm_context_t;
|
||||
|
||||
/*
|
||||
|
||||
@@ -15,12 +15,12 @@
|
||||
#include <linux/sched/hotplug.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/pgtable.h>
|
||||
#include <linux/pkeys.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/daifflags.h>
|
||||
#include <asm/proc-fns.h>
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/sysreg.h>
|
||||
#include <asm/tlbflush.h>
|
||||
@@ -175,9 +175,36 @@ init_new_context(struct task_struct *tsk, struct mm_struct *mm)
|
||||
{
|
||||
atomic64_set(&mm->context.id, 0);
|
||||
refcount_set(&mm->context.pinned, 0);
|
||||
|
||||
/* pkey 0 is the default, so always reserve it. */
|
||||
mm->context.pkey_allocation_map = BIT(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void arch_dup_pkeys(struct mm_struct *oldmm,
|
||||
struct mm_struct *mm)
|
||||
{
|
||||
/* Duplicate the oldmm pkey state in mm: */
|
||||
mm->context.pkey_allocation_map = oldmm->context.pkey_allocation_map;
|
||||
}
|
||||
|
||||
static inline int arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
|
||||
{
|
||||
arch_dup_pkeys(oldmm, mm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void arch_exit_mmap(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void arch_unmap(struct mm_struct *mm,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
||||
static inline void update_saved_ttbr0(struct task_struct *tsk,
|
||||
struct mm_struct *mm)
|
||||
@@ -267,6 +294,23 @@ static inline unsigned long mm_untag_mask(struct mm_struct *mm)
|
||||
return -1UL >> 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only enforce protection keys on the current process, because there is no
|
||||
* user context to access POR_EL0 for another address space.
|
||||
*/
|
||||
static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
|
||||
bool write, bool execute, bool foreign)
|
||||
{
|
||||
if (!system_supports_poe())
|
||||
return true;
|
||||
|
||||
/* allow access if the VMA is not one from this process */
|
||||
if (foreign || vma_is_foreign(vma))
|
||||
return true;
|
||||
|
||||
return por_el0_allows_pkey(vma_pkey(vma), write, execute);
|
||||
}
|
||||
|
||||
#include <asm-generic/mmu_context.h>
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
@@ -198,6 +198,16 @@
|
||||
#define PTE_PI_IDX_2 53 /* PXN */
|
||||
#define PTE_PI_IDX_3 54 /* UXN */
|
||||
|
||||
/*
|
||||
* POIndex[2:0] encoding (Permission Overlay Extension)
|
||||
*/
|
||||
#define PTE_PO_IDX_0 (_AT(pteval_t, 1) << 60)
|
||||
#define PTE_PO_IDX_1 (_AT(pteval_t, 1) << 61)
|
||||
#define PTE_PO_IDX_2 (_AT(pteval_t, 1) << 62)
|
||||
|
||||
#define PTE_PO_IDX_MASK GENMASK_ULL(62, 60)
|
||||
|
||||
|
||||
/*
|
||||
* Memory Attribute override for Stage-2 (MemAttr[3:0])
|
||||
*/
|
||||
|
||||
@@ -154,10 +154,10 @@ static inline bool __pure lpa2_is_enabled(void)
|
||||
|
||||
#define PIE_E0 ( \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_EXECONLY), PIE_X_O) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY_EXEC), PIE_RX) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED_EXEC), PIE_RWX) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY), PIE_R) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED), PIE_RW))
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY_EXEC), PIE_RX_O) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED_EXEC), PIE_RWX_O) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_READONLY), PIE_R_O) | \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_SHARED), PIE_RW_O))
|
||||
|
||||
#define PIE_E1 ( \
|
||||
PIRx_ELx_PERM(pte_pi_index(_PAGE_EXECONLY), PIE_NONE_O) | \
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
#include <asm/cmpxchg.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/por.h>
|
||||
#include <linux/mmdebug.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -149,6 +150,24 @@ static inline pteval_t __phys_to_pte_val(phys_addr_t phys)
|
||||
#define pte_accessible(mm, pte) \
|
||||
(mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid(pte))
|
||||
|
||||
static inline bool por_el0_allows_pkey(u8 pkey, bool write, bool execute)
|
||||
{
|
||||
u64 por;
|
||||
|
||||
if (!system_supports_poe())
|
||||
return true;
|
||||
|
||||
por = read_sysreg_s(SYS_POR_EL0);
|
||||
|
||||
if (write)
|
||||
return por_elx_allows_write(por, pkey);
|
||||
|
||||
if (execute)
|
||||
return por_elx_allows_exec(por, pkey);
|
||||
|
||||
return por_elx_allows_read(por, pkey);
|
||||
}
|
||||
|
||||
/*
|
||||
* p??_access_permitted() is true for valid user mappings (PTE_USER
|
||||
* bit set, subject to the write permission check). For execute-only
|
||||
@@ -156,8 +175,11 @@ static inline pteval_t __phys_to_pte_val(phys_addr_t phys)
|
||||
* not set) must return false. PROT_NONE mappings do not have the
|
||||
* PTE_VALID bit set.
|
||||
*/
|
||||
#define pte_access_permitted(pte, write) \
|
||||
#define pte_access_permitted_no_overlay(pte, write) \
|
||||
(((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER)) && (!(write) || pte_write(pte)))
|
||||
#define pte_access_permitted(pte, write) \
|
||||
(pte_access_permitted_no_overlay(pte, write) && \
|
||||
por_el0_allows_pkey(FIELD_GET(PTE_PO_IDX_MASK, pte_val(pte)), write, false))
|
||||
#define pmd_access_permitted(pmd, write) \
|
||||
(pte_access_permitted(pmd_pte(pmd), (write)))
|
||||
#define pud_access_permitted(pud, write) \
|
||||
@@ -373,10 +395,11 @@ static inline void __sync_cache_and_tags(pte_t pte, unsigned int nr_pages)
|
||||
/*
|
||||
* If the PTE would provide user space access to the tags associated
|
||||
* with it then ensure that the MTE tags are synchronised. Although
|
||||
* pte_access_permitted() returns false for exec only mappings, they
|
||||
* don't expose tags (instruction fetches don't check tags).
|
||||
* pte_access_permitted_no_overlay() returns false for exec only
|
||||
* mappings, they don't expose tags (instruction fetches don't check
|
||||
* tags).
|
||||
*/
|
||||
if (system_supports_mte() && pte_access_permitted(pte, false) &&
|
||||
if (system_supports_mte() && pte_access_permitted_no_overlay(pte, false) &&
|
||||
!pte_special(pte) && pte_tagged(pte))
|
||||
mte_sync_tags(pte, nr_pages);
|
||||
}
|
||||
@@ -1103,7 +1126,8 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||
*/
|
||||
const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY |
|
||||
PTE_PRESENT_INVALID | PTE_VALID | PTE_WRITE |
|
||||
PTE_GP | PTE_ATTRINDX_MASK;
|
||||
PTE_GP | PTE_ATTRINDX_MASK | PTE_PO_IDX_MASK;
|
||||
|
||||
/* preserve the hardware dirty information */
|
||||
if (pte_hw_dirty(pte))
|
||||
pte = set_pte_bit(pte, __pgprot(PTE_DIRTY));
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Arm Ltd.
|
||||
*
|
||||
* Based on arch/x86/include/asm/pkeys.h
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARM64_PKEYS_H
|
||||
#define _ASM_ARM64_PKEYS_H
|
||||
|
||||
#define ARCH_VM_PKEY_FLAGS (VM_PKEY_BIT0 | VM_PKEY_BIT1 | VM_PKEY_BIT2)
|
||||
|
||||
#define arch_max_pkey() 8
|
||||
|
||||
int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||
unsigned long init_val);
|
||||
|
||||
static inline bool arch_pkeys_enabled(void)
|
||||
{
|
||||
return system_supports_poe();
|
||||
}
|
||||
|
||||
static inline int vma_pkey(struct vm_area_struct *vma)
|
||||
{
|
||||
return (vma->vm_flags & ARCH_VM_PKEY_FLAGS) >> VM_PKEY_SHIFT;
|
||||
}
|
||||
|
||||
static inline int arch_override_mprotect_pkey(struct vm_area_struct *vma,
|
||||
int prot, int pkey)
|
||||
{
|
||||
if (pkey != -1)
|
||||
return pkey;
|
||||
|
||||
return vma_pkey(vma);
|
||||
}
|
||||
|
||||
static inline int execute_only_pkey(struct mm_struct *mm)
|
||||
{
|
||||
// Execute-only mappings are handled by EPAN/FEAT_PAN3.
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define mm_pkey_allocation_map(mm) (mm)->context.pkey_allocation_map
|
||||
#define mm_set_pkey_allocated(mm, pkey) do { \
|
||||
mm_pkey_allocation_map(mm) |= (1U << pkey); \
|
||||
} while (0)
|
||||
#define mm_set_pkey_free(mm, pkey) do { \
|
||||
mm_pkey_allocation_map(mm) &= ~(1U << pkey); \
|
||||
} while (0)
|
||||
|
||||
static inline bool mm_pkey_is_allocated(struct mm_struct *mm, int pkey)
|
||||
{
|
||||
/*
|
||||
* "Allocated" pkeys are those that have been returned
|
||||
* from pkey_alloc() or pkey 0 which is allocated
|
||||
* implicitly when the mm is created.
|
||||
*/
|
||||
if (pkey < 0 || pkey >= arch_max_pkey())
|
||||
return false;
|
||||
|
||||
return mm_pkey_allocation_map(mm) & (1U << pkey);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a positive, 3-bit key on success, or -1 on failure.
|
||||
*/
|
||||
static inline int mm_pkey_alloc(struct mm_struct *mm)
|
||||
{
|
||||
/*
|
||||
* Note: this is the one and only place we make sure
|
||||
* that the pkey is valid as far as the hardware is
|
||||
* concerned. The rest of the kernel trusts that
|
||||
* only good, valid pkeys come out of here.
|
||||
*/
|
||||
u8 all_pkeys_mask = GENMASK(arch_max_pkey() - 1, 0);
|
||||
int ret;
|
||||
|
||||
if (!arch_pkeys_enabled())
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Are we out of pkeys? We must handle this specially
|
||||
* because ffz() behavior is undefined if there are no
|
||||
* zeros.
|
||||
*/
|
||||
if (mm_pkey_allocation_map(mm) == all_pkeys_mask)
|
||||
return -1;
|
||||
|
||||
ret = ffz(mm_pkey_allocation_map(mm));
|
||||
|
||||
mm_set_pkey_allocated(mm, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int mm_pkey_free(struct mm_struct *mm, int pkey)
|
||||
{
|
||||
if (!mm_pkey_is_allocated(mm, pkey))
|
||||
return -EINVAL;
|
||||
|
||||
mm_set_pkey_free(mm, pkey);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_ARM64_PKEYS_H */
|
||||
@@ -0,0 +1,33 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Arm Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARM64_POR_H
|
||||
#define _ASM_ARM64_POR_H
|
||||
|
||||
#define POR_BITS_PER_PKEY 4
|
||||
#define POR_ELx_IDX(por_elx, idx) (((por_elx) >> ((idx) * POR_BITS_PER_PKEY)) & 0xf)
|
||||
|
||||
static inline bool por_elx_allows_read(u64 por, u8 pkey)
|
||||
{
|
||||
u8 perm = POR_ELx_IDX(por, pkey);
|
||||
|
||||
return perm & POE_R;
|
||||
}
|
||||
|
||||
static inline bool por_elx_allows_write(u64 por, u8 pkey)
|
||||
{
|
||||
u8 perm = POR_ELx_IDX(por, pkey);
|
||||
|
||||
return perm & POE_W;
|
||||
}
|
||||
|
||||
static inline bool por_elx_allows_exec(u64 por, u8 pkey)
|
||||
{
|
||||
u8 perm = POR_ELx_IDX(por, pkey);
|
||||
|
||||
return perm & POE_X;
|
||||
}
|
||||
|
||||
#endif /* _ASM_ARM64_POR_H */
|
||||
@@ -184,6 +184,7 @@ struct thread_struct {
|
||||
u64 sctlr_user;
|
||||
u64 svcr;
|
||||
u64 tpidr2_el0;
|
||||
u64 por_el0;
|
||||
};
|
||||
|
||||
static inline unsigned int thread_get_vl(struct thread_struct *thread,
|
||||
|
||||
@@ -1076,6 +1076,9 @@
|
||||
#define POE_RXW UL(0x7)
|
||||
#define POE_MASK UL(0xf)
|
||||
|
||||
/* Initial value for Permission Overlay Extension for EL0 */
|
||||
#define POR_EL0_INIT POE_RXW
|
||||
|
||||
#define ARM64_FEATURE_FIELD_BITS 4
|
||||
|
||||
/* Defined for compatibility only, do not add new users. */
|
||||
|
||||
@@ -25,6 +25,7 @@ try_emulate_armv8_deprecated(struct pt_regs *regs, u32 insn)
|
||||
void force_signal_inject(int signal, int code, unsigned long address, unsigned long err);
|
||||
void arm64_notify_segfault(unsigned long addr);
|
||||
void arm64_force_sig_fault(int signo, int code, unsigned long far, const char *str);
|
||||
void arm64_force_sig_fault_pkey(unsigned long far, const char *str, int pkey);
|
||||
void arm64_force_sig_mceerr(int code, unsigned long far, short lsb, const char *str);
|
||||
void arm64_force_sig_ptrace_errno_trap(int errno, unsigned long far, const char *str);
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
#define VNCR_PIRE0_EL1 0x290
|
||||
#define VNCR_PIRE0_EL2 0x298
|
||||
#define VNCR_PIR_EL1 0x2A0
|
||||
#define VNCR_POR_EL1 0x2A8
|
||||
#define VNCR_ICH_LR0_EL2 0x400
|
||||
#define VNCR_ICH_LR1_EL2 0x408
|
||||
#define VNCR_ICH_LR2_EL2 0x410
|
||||
|
||||
@@ -122,5 +122,6 @@
|
||||
#define HWCAP2_SME_SF8FMA (1UL << 60)
|
||||
#define HWCAP2_SME_SF8DP4 (1UL << 61)
|
||||
#define HWCAP2_SME_SF8DP2 (1UL << 62)
|
||||
#define HWCAP2_POE (1UL << 63)
|
||||
|
||||
#endif /* _UAPI__ASM_HWCAP_H */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user