You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 updates from Catalin Marinas: - eBPF JIT compiler for arm64 - CPU suspend backend for PSCI (firmware interface) with standard idle states defined in DT (generic idle driver to be merged via a different tree) - Support for CONFIG_DEBUG_SET_MODULE_RONX - Support for unmapped cpu-release-addr (outside kernel linear mapping) - set_arch_dma_coherent_ops() implemented and bus notifiers removed - EFI_STUB improvements when base of DRAM is occupied - Typos in KGDB macros - Clean-up to (partially) allow kernel building with LLVM - Other clean-ups (extern keyword, phys_addr_t usage) * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (51 commits) arm64: Remove unneeded extern keyword ARM64: make of_device_ids const arm64: Use phys_addr_t type for physical address aarch64: filter $x from kallsyms arm64: Use DMA_ERROR_CODE to denote failed allocation arm64: Fix typos in KGDB macros arm64: insn: Add return statements after BUG_ON() arm64: debug: don't re-enable debug exceptions on return from el1_dbg Revert "arm64: dmi: Add SMBIOS/DMI support" arm64: Implement set_arch_dma_coherent_ops() to replace bus notifiers of: amba: use of_dma_configure for AMBA devices arm64: dmi: Add SMBIOS/DMI support arm64: Correct ftrace calls to aarch64_insn_gen_branch_imm() arm64:mm: initialize max_mapnr using function set_max_mapnr setup: Move unmask of async interrupts after possible earlycon setup arm64: LLVMLinux: Fix inline arm64 assembly for use with clang arm64: pageattr: Correctly adjust unaligned start addresses net: bpf: arm64: fix module memory leak when JIT image build fails arm64: add PSCI CPU_SUSPEND based cpu_suspend support arm64: kernel: introduce cpu_init_idle CPU operation ...
This commit is contained in:
@@ -219,6 +219,12 @@ nodes to be present and contain the properties described below.
|
||||
Value type: <phandle>
|
||||
Definition: Specifies the ACC[2] node associated with this CPU.
|
||||
|
||||
- cpu-idle-states
|
||||
Usage: Optional
|
||||
Value type: <prop-encoded-array>
|
||||
Definition:
|
||||
# List of phandles to idle state nodes supported
|
||||
by this cpu [3].
|
||||
|
||||
Example 1 (dual-cluster big.LITTLE system 32-bit):
|
||||
|
||||
@@ -415,3 +421,5 @@ cpus {
|
||||
--
|
||||
[1] arm/msm/qcom,saw2.txt
|
||||
[2] arm/msm/qcom,kpss-acc.txt
|
||||
[3] ARM Linux kernel documentation - idle states bindings
|
||||
Documentation/devicetree/bindings/arm/idle-states.txt
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -50,6 +50,16 @@ Main node optional properties:
|
||||
|
||||
- migrate : Function ID for MIGRATE operation
|
||||
|
||||
Device tree nodes that require usage of PSCI CPU_SUSPEND function (ie idle
|
||||
state nodes, as per bindings in [1]) must specify the following properties:
|
||||
|
||||
- arm,psci-suspend-param
|
||||
Usage: Required for state nodes[1] if the corresponding
|
||||
idle-states node entry-method property is set
|
||||
to "psci".
|
||||
Value type: <u32>
|
||||
Definition: power_state parameter to pass to the PSCI
|
||||
suspend call.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -64,7 +74,6 @@ Case 1: PSCI v0.1 only.
|
||||
migrate = <0x95c10003>;
|
||||
};
|
||||
|
||||
|
||||
Case 2: PSCI v0.2 only
|
||||
|
||||
psci {
|
||||
@@ -88,3 +97,6 @@ Case 3: PSCI v0.2 and PSCI v0.1.
|
||||
|
||||
...
|
||||
};
|
||||
|
||||
[1] Kernel documentation - ARM idle states bindings
|
||||
Documentation/devicetree/bindings/arm/idle-states.txt
|
||||
|
||||
@@ -462,9 +462,9 @@ JIT compiler
|
||||
------------
|
||||
|
||||
The Linux kernel has a built-in BPF JIT compiler for x86_64, SPARC, PowerPC,
|
||||
ARM, MIPS and s390 and can be enabled through CONFIG_BPF_JIT. The JIT compiler
|
||||
is transparently invoked for each attached filter from user space or for
|
||||
internal kernel users if it has been previously enabled by root:
|
||||
ARM, ARM64, MIPS and s390 and can be enabled through CONFIG_BPF_JIT. The JIT
|
||||
compiler is transparently invoked for each attached filter from user space
|
||||
or for internal kernel users if it has been previously enabled by root:
|
||||
|
||||
echo 1 > /proc/sys/net/core/bpf_jit_enable
|
||||
|
||||
|
||||
+4
-3
@@ -35,6 +35,7 @@ config ARM64
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_BPF_JIT
|
||||
select HAVE_C_RECORDMCOUNT
|
||||
select HAVE_CC_STACKPROTECTOR
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
@@ -252,11 +253,11 @@ config SCHED_SMT
|
||||
places. If unsure say N here.
|
||||
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-32)"
|
||||
range 2 32
|
||||
int "Maximum number of CPUs (2-64)"
|
||||
range 2 64
|
||||
depends on SMP
|
||||
# These have to remain sorted largest to smallest
|
||||
default "8"
|
||||
default "64"
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs"
|
||||
|
||||
@@ -43,4 +43,15 @@ config ARM64_RANDOMIZE_TEXT_OFFSET
|
||||
of TEXT_OFFSET and platforms must not require a specific
|
||||
value.
|
||||
|
||||
config DEBUG_SET_MODULE_RONX
|
||||
bool "Set loadable kernel module data as NX and text as RO"
|
||||
depends on MODULES
|
||||
help
|
||||
This option helps catch unintended modifications to loadable
|
||||
kernel module's text and read-only data. It also prevents execution
|
||||
of module data. Such protection may interfere with run-time code
|
||||
patching and dynamic kernel tracing - and they might also protect
|
||||
against certain classes of kernel exploits.
|
||||
If in doubt, say "N".
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -47,6 +47,7 @@ endif
|
||||
export TEXT_OFFSET GZFLAGS
|
||||
|
||||
core-y += arch/arm64/kernel/ arch/arm64/mm/
|
||||
core-$(CONFIG_NET) += arch/arm64/net/
|
||||
core-$(CONFIG_KVM) += arch/arm64/kvm/
|
||||
core-$(CONFIG_XEN) += arch/arm64/xen/
|
||||
core-$(CONFIG_CRYPTO) += arch/arm64/crypto/
|
||||
|
||||
@@ -148,4 +148,8 @@ static inline void flush_cache_vunmap(unsigned long start, unsigned long end)
|
||||
{
|
||||
}
|
||||
|
||||
int set_memory_ro(unsigned long addr, int numpages);
|
||||
int set_memory_rw(unsigned long addr, int numpages);
|
||||
int set_memory_x(unsigned long addr, int numpages);
|
||||
int set_memory_nx(unsigned long addr, int numpages);
|
||||
#endif
|
||||
|
||||
@@ -39,6 +39,26 @@
|
||||
|
||||
extern unsigned long __icache_flags;
|
||||
|
||||
#define CCSIDR_EL1_LINESIZE_MASK 0x7
|
||||
#define CCSIDR_EL1_LINESIZE(x) ((x) & CCSIDR_EL1_LINESIZE_MASK)
|
||||
|
||||
#define CCSIDR_EL1_NUMSETS_SHIFT 13
|
||||
#define CCSIDR_EL1_NUMSETS_MASK (0x7fff << CCSIDR_EL1_NUMSETS_SHIFT)
|
||||
#define CCSIDR_EL1_NUMSETS(x) \
|
||||
(((x) & CCSIDR_EL1_NUMSETS_MASK) >> CCSIDR_EL1_NUMSETS_SHIFT)
|
||||
|
||||
extern u64 __attribute_const__ icache_get_ccsidr(void);
|
||||
|
||||
static inline int icache_get_linesize(void)
|
||||
{
|
||||
return 16 << CCSIDR_EL1_LINESIZE(icache_get_ccsidr());
|
||||
}
|
||||
|
||||
static inline int icache_get_numsets(void)
|
||||
{
|
||||
return 1 + CCSIDR_EL1_NUMSETS(icache_get_ccsidr());
|
||||
}
|
||||
|
||||
/*
|
||||
* Whilst the D-side always behaves as PIPT on AArch64, aliasing is
|
||||
* permitted in the I-cache.
|
||||
|
||||
@@ -28,6 +28,8 @@ struct device_node;
|
||||
* enable-method property.
|
||||
* @cpu_init: Reads any data necessary for a specific enable-method from the
|
||||
* devicetree, for a given cpu node and proposed logical id.
|
||||
* @cpu_init_idle: Reads any data necessary to initialize CPU idle states from
|
||||
* devicetree, for a given cpu node and proposed logical id.
|
||||
* @cpu_prepare: Early one-time preparation step for a cpu. If there is a
|
||||
* mechanism for doing so, tests whether it is possible to boot
|
||||
* the given CPU.
|
||||
@@ -47,6 +49,7 @@ struct device_node;
|
||||
struct cpu_operations {
|
||||
const char *name;
|
||||
int (*cpu_init)(struct device_node *, unsigned int);
|
||||
int (*cpu_init_idle)(struct device_node *, unsigned int);
|
||||
int (*cpu_prepare)(unsigned int);
|
||||
int (*cpu_boot)(unsigned int);
|
||||
void (*cpu_postboot)(void);
|
||||
@@ -61,7 +64,7 @@ struct cpu_operations {
|
||||
};
|
||||
|
||||
extern const struct cpu_operations *cpu_ops[NR_CPUS];
|
||||
extern int __init cpu_read_ops(struct device_node *dn, int cpu);
|
||||
extern void __init cpu_read_bootcpu_ops(void);
|
||||
int __init cpu_read_ops(struct device_node *dn, int cpu);
|
||||
void __init cpu_read_bootcpu_ops(void);
|
||||
|
||||
#endif /* ifndef __ASM_CPU_OPS_H */
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef __ASM_CPUIDLE_H
|
||||
#define __ASM_CPUIDLE_H
|
||||
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
extern int cpu_init_idle(unsigned int cpu);
|
||||
#else
|
||||
static inline int cpu_init_idle(unsigned int cpu)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -48,11 +48,13 @@
|
||||
/*
|
||||
* #imm16 values used for BRK instruction generation
|
||||
* Allowed values for kgbd are 0x400 - 0x7ff
|
||||
* 0x100: for triggering a fault on purpose (reserved)
|
||||
* 0x400: for dynamic BRK instruction
|
||||
* 0x401: for compile time BRK instruction
|
||||
*/
|
||||
#define KGDB_DYN_DGB_BRK_IMM 0x400
|
||||
#define KDBG_COMPILED_DBG_BRK_IMM 0x401
|
||||
#define FAULT_BRK_IMM 0x100
|
||||
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
||||
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
||||
|
||||
/*
|
||||
* BRK instruction encoding
|
||||
@@ -60,25 +62,31 @@
|
||||
*/
|
||||
#define AARCH64_BREAK_MON 0xd4200000
|
||||
|
||||
/*
|
||||
* BRK instruction for provoking a fault on purpose
|
||||
* Unlike kgdb, #imm16 value with unallocated handler is used for faulting.
|
||||
*/
|
||||
#define AARCH64_BREAK_FAULT (AARCH64_BREAK_MON | (FAULT_BRK_IMM << 5))
|
||||
|
||||
/*
|
||||
* Extract byte from BRK instruction
|
||||
*/
|
||||
#define KGDB_DYN_DGB_BRK_INS_BYTE(x) \
|
||||
#define KGDB_DYN_DBG_BRK_INS_BYTE(x) \
|
||||
((((AARCH64_BREAK_MON) & 0xffe0001f) >> (x * 8)) & 0xff)
|
||||
|
||||
/*
|
||||
* Extract byte from BRK #imm16
|
||||
*/
|
||||
#define KGBD_DYN_DGB_BRK_IMM_BYTE(x) \
|
||||
(((((KGDB_DYN_DGB_BRK_IMM) & 0xffff) << 5) >> (x * 8)) & 0xff)
|
||||
#define KGBD_DYN_DBG_BRK_IMM_BYTE(x) \
|
||||
(((((KGDB_DYN_DBG_BRK_IMM) & 0xffff) << 5) >> (x * 8)) & 0xff)
|
||||
|
||||
#define KGDB_DYN_DGB_BRK_BYTE(x) \
|
||||
(KGDB_DYN_DGB_BRK_INS_BYTE(x) | KGBD_DYN_DGB_BRK_IMM_BYTE(x))
|
||||
#define KGDB_DYN_DBG_BRK_BYTE(x) \
|
||||
(KGDB_DYN_DBG_BRK_INS_BYTE(x) | KGBD_DYN_DBG_BRK_IMM_BYTE(x))
|
||||
|
||||
#define KGDB_DYN_BRK_INS_BYTE0 KGDB_DYN_DGB_BRK_BYTE(0)
|
||||
#define KGDB_DYN_BRK_INS_BYTE1 KGDB_DYN_DGB_BRK_BYTE(1)
|
||||
#define KGDB_DYN_BRK_INS_BYTE2 KGDB_DYN_DGB_BRK_BYTE(2)
|
||||
#define KGDB_DYN_BRK_INS_BYTE3 KGDB_DYN_DGB_BRK_BYTE(3)
|
||||
#define KGDB_DYN_BRK_INS_BYTE0 KGDB_DYN_DBG_BRK_BYTE(0)
|
||||
#define KGDB_DYN_BRK_INS_BYTE1 KGDB_DYN_DBG_BRK_BYTE(1)
|
||||
#define KGDB_DYN_BRK_INS_BYTE2 KGDB_DYN_DBG_BRK_BYTE(2)
|
||||
#define KGDB_DYN_BRK_INS_BYTE3 KGDB_DYN_DBG_BRK_BYTE(3)
|
||||
|
||||
#define CACHE_FLUSH_IS_SAFE 1
|
||||
|
||||
|
||||
@@ -52,6 +52,13 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)
|
||||
dev->archdata.dma_ops = ops;
|
||||
}
|
||||
|
||||
static inline int set_arch_dma_coherent_ops(struct device *dev)
|
||||
{
|
||||
set_dma_ops(dev, &coherent_swiotlb_dma_ops);
|
||||
return 0;
|
||||
}
|
||||
#define set_arch_dma_coherent_ops set_arch_dma_coherent_ops
|
||||
|
||||
#include <asm-generic/dma-mapping-common.h>
|
||||
|
||||
static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* Copyright (C) 2013 Huawei Ltd.
|
||||
* Author: Jiang Liu <liuj97@gmail.com>
|
||||
*
|
||||
* Copyright (C) 2014 Zi Shen Lim <zlim.lnx@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
@@ -64,12 +66,155 @@ enum aarch64_insn_imm_type {
|
||||
AARCH64_INSN_IMM_14,
|
||||
AARCH64_INSN_IMM_12,
|
||||
AARCH64_INSN_IMM_9,
|
||||
AARCH64_INSN_IMM_7,
|
||||
AARCH64_INSN_IMM_6,
|
||||
AARCH64_INSN_IMM_S,
|
||||
AARCH64_INSN_IMM_R,
|
||||
AARCH64_INSN_IMM_MAX
|
||||
};
|
||||
|
||||
enum aarch64_insn_register_type {
|
||||
AARCH64_INSN_REGTYPE_RT,
|
||||
AARCH64_INSN_REGTYPE_RN,
|
||||
AARCH64_INSN_REGTYPE_RT2,
|
||||
AARCH64_INSN_REGTYPE_RM,
|
||||
AARCH64_INSN_REGTYPE_RD,
|
||||
AARCH64_INSN_REGTYPE_RA,
|
||||
};
|
||||
|
||||
enum aarch64_insn_register {
|
||||
AARCH64_INSN_REG_0 = 0,
|
||||
AARCH64_INSN_REG_1 = 1,
|
||||
AARCH64_INSN_REG_2 = 2,
|
||||
AARCH64_INSN_REG_3 = 3,
|
||||
AARCH64_INSN_REG_4 = 4,
|
||||
AARCH64_INSN_REG_5 = 5,
|
||||
AARCH64_INSN_REG_6 = 6,
|
||||
AARCH64_INSN_REG_7 = 7,
|
||||
AARCH64_INSN_REG_8 = 8,
|
||||
AARCH64_INSN_REG_9 = 9,
|
||||
AARCH64_INSN_REG_10 = 10,
|
||||
AARCH64_INSN_REG_11 = 11,
|
||||
AARCH64_INSN_REG_12 = 12,
|
||||
AARCH64_INSN_REG_13 = 13,
|
||||
AARCH64_INSN_REG_14 = 14,
|
||||
AARCH64_INSN_REG_15 = 15,
|
||||
AARCH64_INSN_REG_16 = 16,
|
||||
AARCH64_INSN_REG_17 = 17,
|
||||
AARCH64_INSN_REG_18 = 18,
|
||||
AARCH64_INSN_REG_19 = 19,
|
||||
AARCH64_INSN_REG_20 = 20,
|
||||
AARCH64_INSN_REG_21 = 21,
|
||||
AARCH64_INSN_REG_22 = 22,
|
||||
AARCH64_INSN_REG_23 = 23,
|
||||
AARCH64_INSN_REG_24 = 24,
|
||||
AARCH64_INSN_REG_25 = 25,
|
||||
AARCH64_INSN_REG_26 = 26,
|
||||
AARCH64_INSN_REG_27 = 27,
|
||||
AARCH64_INSN_REG_28 = 28,
|
||||
AARCH64_INSN_REG_29 = 29,
|
||||
AARCH64_INSN_REG_FP = 29, /* Frame pointer */
|
||||
AARCH64_INSN_REG_30 = 30,
|
||||
AARCH64_INSN_REG_LR = 30, /* Link register */
|
||||
AARCH64_INSN_REG_ZR = 31, /* Zero: as source register */
|
||||
AARCH64_INSN_REG_SP = 31 /* Stack pointer: as load/store base reg */
|
||||
};
|
||||
|
||||
enum aarch64_insn_variant {
|
||||
AARCH64_INSN_VARIANT_32BIT,
|
||||
AARCH64_INSN_VARIANT_64BIT
|
||||
};
|
||||
|
||||
enum aarch64_insn_condition {
|
||||
AARCH64_INSN_COND_EQ = 0x0, /* == */
|
||||
AARCH64_INSN_COND_NE = 0x1, /* != */
|
||||
AARCH64_INSN_COND_CS = 0x2, /* unsigned >= */
|
||||
AARCH64_INSN_COND_CC = 0x3, /* unsigned < */
|
||||
AARCH64_INSN_COND_MI = 0x4, /* < 0 */
|
||||
AARCH64_INSN_COND_PL = 0x5, /* >= 0 */
|
||||
AARCH64_INSN_COND_VS = 0x6, /* overflow */
|
||||
AARCH64_INSN_COND_VC = 0x7, /* no overflow */
|
||||
AARCH64_INSN_COND_HI = 0x8, /* unsigned > */
|
||||
AARCH64_INSN_COND_LS = 0x9, /* unsigned <= */
|
||||
AARCH64_INSN_COND_GE = 0xa, /* signed >= */
|
||||
AARCH64_INSN_COND_LT = 0xb, /* signed < */
|
||||
AARCH64_INSN_COND_GT = 0xc, /* signed > */
|
||||
AARCH64_INSN_COND_LE = 0xd, /* signed <= */
|
||||
AARCH64_INSN_COND_AL = 0xe, /* always */
|
||||
};
|
||||
|
||||
enum aarch64_insn_branch_type {
|
||||
AARCH64_INSN_BRANCH_NOLINK,
|
||||
AARCH64_INSN_BRANCH_LINK,
|
||||
AARCH64_INSN_BRANCH_RETURN,
|
||||
AARCH64_INSN_BRANCH_COMP_ZERO,
|
||||
AARCH64_INSN_BRANCH_COMP_NONZERO,
|
||||
};
|
||||
|
||||
enum aarch64_insn_size_type {
|
||||
AARCH64_INSN_SIZE_8,
|
||||
AARCH64_INSN_SIZE_16,
|
||||
AARCH64_INSN_SIZE_32,
|
||||
AARCH64_INSN_SIZE_64,
|
||||
};
|
||||
|
||||
enum aarch64_insn_ldst_type {
|
||||
AARCH64_INSN_LDST_LOAD_REG_OFFSET,
|
||||
AARCH64_INSN_LDST_STORE_REG_OFFSET,
|
||||
AARCH64_INSN_LDST_LOAD_PAIR_PRE_INDEX,
|
||||
AARCH64_INSN_LDST_STORE_PAIR_PRE_INDEX,
|
||||
AARCH64_INSN_LDST_LOAD_PAIR_POST_INDEX,
|
||||
AARCH64_INSN_LDST_STORE_PAIR_POST_INDEX,
|
||||
};
|
||||
|
||||
enum aarch64_insn_adsb_type {
|
||||
AARCH64_INSN_ADSB_ADD,
|
||||
AARCH64_INSN_ADSB_SUB,
|
||||
AARCH64_INSN_ADSB_ADD_SETFLAGS,
|
||||
AARCH64_INSN_ADSB_SUB_SETFLAGS
|
||||
};
|
||||
|
||||
enum aarch64_insn_movewide_type {
|
||||
AARCH64_INSN_MOVEWIDE_ZERO,
|
||||
AARCH64_INSN_MOVEWIDE_KEEP,
|
||||
AARCH64_INSN_MOVEWIDE_INVERSE
|
||||
};
|
||||
|
||||
enum aarch64_insn_bitfield_type {
|
||||
AARCH64_INSN_BITFIELD_MOVE,
|
||||
AARCH64_INSN_BITFIELD_MOVE_UNSIGNED,
|
||||
AARCH64_INSN_BITFIELD_MOVE_SIGNED
|
||||
};
|
||||
|
||||
enum aarch64_insn_data1_type {
|
||||
AARCH64_INSN_DATA1_REVERSE_16,
|
||||
AARCH64_INSN_DATA1_REVERSE_32,
|
||||
AARCH64_INSN_DATA1_REVERSE_64,
|
||||
};
|
||||
|
||||
enum aarch64_insn_data2_type {
|
||||
AARCH64_INSN_DATA2_UDIV,
|
||||
AARCH64_INSN_DATA2_SDIV,
|
||||
AARCH64_INSN_DATA2_LSLV,
|
||||
AARCH64_INSN_DATA2_LSRV,
|
||||
AARCH64_INSN_DATA2_ASRV,
|
||||
AARCH64_INSN_DATA2_RORV,
|
||||
};
|
||||
|
||||
enum aarch64_insn_data3_type {
|
||||
AARCH64_INSN_DATA3_MADD,
|
||||
AARCH64_INSN_DATA3_MSUB,
|
||||
};
|
||||
|
||||
enum aarch64_insn_logic_type {
|
||||
AARCH64_INSN_LOGIC_AND,
|
||||
AARCH64_INSN_LOGIC_BIC,
|
||||
AARCH64_INSN_LOGIC_ORR,
|
||||
AARCH64_INSN_LOGIC_ORN,
|
||||
AARCH64_INSN_LOGIC_EOR,
|
||||
AARCH64_INSN_LOGIC_EON,
|
||||
AARCH64_INSN_LOGIC_AND_SETFLAGS,
|
||||
AARCH64_INSN_LOGIC_BIC_SETFLAGS
|
||||
};
|
||||
|
||||
#define __AARCH64_INSN_FUNCS(abbr, mask, val) \
|
||||
@@ -78,13 +223,58 @@ static __always_inline bool aarch64_insn_is_##abbr(u32 code) \
|
||||
static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \
|
||||
{ return (val); }
|
||||
|
||||
__AARCH64_INSN_FUNCS(str_reg, 0x3FE0EC00, 0x38206800)
|
||||
__AARCH64_INSN_FUNCS(ldr_reg, 0x3FE0EC00, 0x38606800)
|
||||
__AARCH64_INSN_FUNCS(stp_post, 0x7FC00000, 0x28800000)
|
||||
__AARCH64_INSN_FUNCS(ldp_post, 0x7FC00000, 0x28C00000)
|
||||
__AARCH64_INSN_FUNCS(stp_pre, 0x7FC00000, 0x29800000)
|
||||
__AARCH64_INSN_FUNCS(ldp_pre, 0x7FC00000, 0x29C00000)
|
||||
__AARCH64_INSN_FUNCS(add_imm, 0x7F000000, 0x11000000)
|
||||
__AARCH64_INSN_FUNCS(adds_imm, 0x7F000000, 0x31000000)
|
||||
__AARCH64_INSN_FUNCS(sub_imm, 0x7F000000, 0x51000000)
|
||||
__AARCH64_INSN_FUNCS(subs_imm, 0x7F000000, 0x71000000)
|
||||
__AARCH64_INSN_FUNCS(movn, 0x7F800000, 0x12800000)
|
||||
__AARCH64_INSN_FUNCS(sbfm, 0x7F800000, 0x13000000)
|
||||
__AARCH64_INSN_FUNCS(bfm, 0x7F800000, 0x33000000)
|
||||
__AARCH64_INSN_FUNCS(movz, 0x7F800000, 0x52800000)
|
||||
__AARCH64_INSN_FUNCS(ubfm, 0x7F800000, 0x53000000)
|
||||
__AARCH64_INSN_FUNCS(movk, 0x7F800000, 0x72800000)
|
||||
__AARCH64_INSN_FUNCS(add, 0x7F200000, 0x0B000000)
|
||||
__AARCH64_INSN_FUNCS(adds, 0x7F200000, 0x2B000000)
|
||||
__AARCH64_INSN_FUNCS(sub, 0x7F200000, 0x4B000000)
|
||||
__AARCH64_INSN_FUNCS(subs, 0x7F200000, 0x6B000000)
|
||||
__AARCH64_INSN_FUNCS(madd, 0x7FE08000, 0x1B000000)
|
||||
__AARCH64_INSN_FUNCS(msub, 0x7FE08000, 0x1B008000)
|
||||
__AARCH64_INSN_FUNCS(udiv, 0x7FE0FC00, 0x1AC00800)
|
||||
__AARCH64_INSN_FUNCS(sdiv, 0x7FE0FC00, 0x1AC00C00)
|
||||
__AARCH64_INSN_FUNCS(lslv, 0x7FE0FC00, 0x1AC02000)
|
||||
__AARCH64_INSN_FUNCS(lsrv, 0x7FE0FC00, 0x1AC02400)
|
||||
__AARCH64_INSN_FUNCS(asrv, 0x7FE0FC00, 0x1AC02800)
|
||||
__AARCH64_INSN_FUNCS(rorv, 0x7FE0FC00, 0x1AC02C00)
|
||||
__AARCH64_INSN_FUNCS(rev16, 0x7FFFFC00, 0x5AC00400)
|
||||
__AARCH64_INSN_FUNCS(rev32, 0x7FFFFC00, 0x5AC00800)
|
||||
__AARCH64_INSN_FUNCS(rev64, 0x7FFFFC00, 0x5AC00C00)
|
||||
__AARCH64_INSN_FUNCS(and, 0x7F200000, 0x0A000000)
|
||||
__AARCH64_INSN_FUNCS(bic, 0x7F200000, 0x0A200000)
|
||||
__AARCH64_INSN_FUNCS(orr, 0x7F200000, 0x2A000000)
|
||||
__AARCH64_INSN_FUNCS(orn, 0x7F200000, 0x2A200000)
|
||||
__AARCH64_INSN_FUNCS(eor, 0x7F200000, 0x4A000000)
|
||||
__AARCH64_INSN_FUNCS(eon, 0x7F200000, 0x4A200000)
|
||||
__AARCH64_INSN_FUNCS(ands, 0x7F200000, 0x6A000000)
|
||||
__AARCH64_INSN_FUNCS(bics, 0x7F200000, 0x6A200000)
|
||||
__AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000)
|
||||
__AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000)
|
||||
__AARCH64_INSN_FUNCS(cbz, 0xFE000000, 0x34000000)
|
||||
__AARCH64_INSN_FUNCS(cbnz, 0xFE000000, 0x35000000)
|
||||
__AARCH64_INSN_FUNCS(bcond, 0xFF000010, 0x54000000)
|
||||
__AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001)
|
||||
__AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002)
|
||||
__AARCH64_INSN_FUNCS(smc, 0xFFE0001F, 0xD4000003)
|
||||
__AARCH64_INSN_FUNCS(brk, 0xFFE0001F, 0xD4200000)
|
||||
__AARCH64_INSN_FUNCS(hint, 0xFFFFF01F, 0xD503201F)
|
||||
__AARCH64_INSN_FUNCS(br, 0xFFFFFC1F, 0xD61F0000)
|
||||
__AARCH64_INSN_FUNCS(blr, 0xFFFFFC1F, 0xD63F0000)
|
||||
__AARCH64_INSN_FUNCS(ret, 0xFFFFFC1F, 0xD65F0000)
|
||||
|
||||
#undef __AARCH64_INSN_FUNCS
|
||||
|
||||
@@ -97,8 +287,67 @@ u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
|
||||
u32 insn, u64 imm);
|
||||
u32 aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr,
|
||||
enum aarch64_insn_branch_type type);
|
||||
u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr,
|
||||
enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_branch_type type);
|
||||
u32 aarch64_insn_gen_cond_branch_imm(unsigned long pc, unsigned long addr,
|
||||
enum aarch64_insn_condition cond);
|
||||
u32 aarch64_insn_gen_hint(enum aarch64_insn_hint_op op);
|
||||
u32 aarch64_insn_gen_nop(void);
|
||||
u32 aarch64_insn_gen_branch_reg(enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_branch_type type);
|
||||
u32 aarch64_insn_gen_load_store_reg(enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_register base,
|
||||
enum aarch64_insn_register offset,
|
||||
enum aarch64_insn_size_type size,
|
||||
enum aarch64_insn_ldst_type type);
|
||||
u32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1,
|
||||
enum aarch64_insn_register reg2,
|
||||
enum aarch64_insn_register base,
|
||||
int offset,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_ldst_type type);
|
||||
u32 aarch64_insn_gen_add_sub_imm(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
int imm, enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_adsb_type type);
|
||||
u32 aarch64_insn_gen_bitfield(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
int immr, int imms,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_bitfield_type type);
|
||||
u32 aarch64_insn_gen_movewide(enum aarch64_insn_register dst,
|
||||
int imm, int shift,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_movewide_type type);
|
||||
u32 aarch64_insn_gen_add_sub_shifted_reg(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
enum aarch64_insn_register reg,
|
||||
int shift,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_adsb_type type);
|
||||
u32 aarch64_insn_gen_data1(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_data1_type type);
|
||||
u32 aarch64_insn_gen_data2(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_data2_type type);
|
||||
u32 aarch64_insn_gen_data3(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
enum aarch64_insn_register reg1,
|
||||
enum aarch64_insn_register reg2,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_data3_type type);
|
||||
u32 aarch64_insn_gen_logical_shifted_reg(enum aarch64_insn_register dst,
|
||||
enum aarch64_insn_register src,
|
||||
enum aarch64_insn_register reg,
|
||||
int shift,
|
||||
enum aarch64_insn_variant variant,
|
||||
enum aarch64_insn_logic_type type);
|
||||
|
||||
bool aarch64_insn_hotpatch_safe(u32 old_insn, u32 new_insn);
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
|
||||
* (PHYS_OFFSET and PHYS_MASK taken into account).
|
||||
*/
|
||||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||
extern int valid_phys_addr_range(unsigned long addr, size_t size);
|
||||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
|
||||
extern int devmem_is_allowed(unsigned long pfn);
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
static inline void arch_kgdb_breakpoint(void)
|
||||
{
|
||||
asm ("brk %0" : : "I" (KDBG_COMPILED_DBG_BRK_IMM));
|
||||
asm ("brk %0" : : "I" (KGDB_COMPILED_DBG_BRK_IMM));
|
||||
}
|
||||
|
||||
extern void kgdb_handle_bus_error(void);
|
||||
|
||||
@@ -26,13 +26,13 @@ static inline void set_my_cpu_offset(unsigned long off)
|
||||
static inline unsigned long __my_cpu_offset(void)
|
||||
{
|
||||
unsigned long off;
|
||||
register unsigned long *sp asm ("sp");
|
||||
|
||||
/*
|
||||
* We want to allow caching the value, so avoid using volatile and
|
||||
* instead use a fake stack read to hazard against barrier().
|
||||
*/
|
||||
asm("mrs %0, tpidr_el1" : "=r" (off) : "Q" (*sp));
|
||||
asm("mrs %0, tpidr_el1" : "=r" (off) :
|
||||
"Q" (*(const unsigned long *)current_stack_pointer));
|
||||
|
||||
return off;
|
||||
}
|
||||
|
||||
@@ -149,46 +149,51 @@ extern struct page *empty_zero_page;
|
||||
#define pte_valid_not_user(pte) \
|
||||
((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
|
||||
|
||||
static inline pte_t clear_pte_bit(pte_t pte, pgprot_t prot)
|
||||
{
|
||||
pte_val(pte) &= ~pgprot_val(prot);
|
||||
return pte;
|
||||
}
|
||||
|
||||
static inline pte_t set_pte_bit(pte_t pte, pgprot_t prot)
|
||||
{
|
||||
pte_val(pte) |= pgprot_val(prot);
|
||||
return pte;
|
||||
}
|
||||
|
||||
static inline pte_t pte_wrprotect(pte_t pte)
|
||||
{
|
||||
pte_val(pte) &= ~PTE_WRITE;
|
||||
return pte;
|
||||
return clear_pte_bit(pte, __pgprot(PTE_WRITE));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkwrite(pte_t pte)
|
||||
{
|
||||
pte_val(pte) |= PTE_WRITE;
|
||||
return pte;
|
||||
return set_pte_bit(pte, __pgprot(PTE_WRITE));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkclean(pte_t pte)
|
||||
{
|
||||
pte_val(pte) &= ~PTE_DIRTY;
|
||||
return pte;
|
||||
return clear_pte_bit(pte, __pgprot(PTE_DIRTY));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkdirty(pte_t pte)
|
||||
{
|
||||
pte_val(pte) |= PTE_DIRTY;
|
||||
return pte;
|
||||
return set_pte_bit(pte, __pgprot(PTE_DIRTY));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkold(pte_t pte)
|
||||
{
|
||||
pte_val(pte) &= ~PTE_AF;
|
||||
return pte;
|
||||
return clear_pte_bit(pte, __pgprot(PTE_AF));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkyoung(pte_t pte)
|
||||
{
|
||||
pte_val(pte) |= PTE_AF;
|
||||
return pte;
|
||||
return set_pte_bit(pte, __pgprot(PTE_AF));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkspecial(pte_t pte)
|
||||
{
|
||||
pte_val(pte) |= PTE_SPECIAL;
|
||||
return pte;
|
||||
return set_pte_bit(pte, __pgprot(PTE_SPECIAL));
|
||||
}
|
||||
|
||||
static inline void set_pte(pte_t *ptep, pte_t pte)
|
||||
|
||||
@@ -32,6 +32,8 @@ extern void cpu_cache_off(void);
|
||||
extern void cpu_do_idle(void);
|
||||
extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
|
||||
extern void cpu_reset(unsigned long addr) __attribute__((noreturn));
|
||||
void cpu_soft_restart(phys_addr_t cpu_reset,
|
||||
unsigned long addr) __attribute__((noreturn));
|
||||
extern void cpu_do_suspend(struct cpu_suspend_ctx *ptr);
|
||||
extern u64 cpu_do_resume(phys_addr_t ptr, u64 idmap_ttbr);
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ struct sleep_save_sp {
|
||||
phys_addr_t save_ptr_stash_phys;
|
||||
};
|
||||
|
||||
extern int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
|
||||
extern void cpu_resume(void);
|
||||
extern int cpu_suspend(unsigned long);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user