mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 02:34:01 +08:00
ARM updates for 5.13-rc1:
- Fix BSS size calculation for LLVM - Improve robustness of kernel entry around v7_invalidate_l1 - Fix and update kprobes assembly - Correct breakpoint overflow handler check - Pause function graph tracer when suspending a CPU - Switch to generic syscallhdr.sh and syscalltbl.sh - Remove now unused set_kernel_text_r[wo] functions - Updates for ptdump (__init marking and using DEFINE_SHOW_ATTRIBUTE) - Fix for interrupted SMC (secure) calls - Remove Compaq Personal Server platform -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEuNNh8scc2k/wOAE+9OeQG+StrGQFAmCSzKIACgkQ9OeQG+St rGTXkw/+ImAw8ji/zROy64ZDoV9OlnscnMSysjzadNnc8trwlPx9kupW9+YSQ9UE EUIDD2HEFgI1yxV4fQ+z/aHy0+aX9ViJy0+0zGN6/6R7+upSOoeKuEZFWE31wdgc IeQxRIo/kvW0SMt3GNbA7GAw+cIJD7W8iPXzxBLr4Rvn6hxNthvzFRD35L8Azbvo HE0V4+0r7ZRyzSdEjoWG7Bo3a7HMEiMlVdYwBtFYFewI7eyabbgmBnAu2/Qf7+lV O3WU27uhFJKBc0tdM0a0eQbT7RqnH6ALPJRUKY9Ecv1S01R5aPy9pUSwmCWt7A1I 59lCrJPy5tpiqQEt/vT7fYBWxCylnQJO+tRGAqyAcUMpYOhPQ7dtzLI6QmTKxnKx Ib4DgA1/5BS3jHul5WcM00Ew9ey0zEmVWBy64rO9sL7sFWzFHyy6WHJJgldjMoMO +gdG+FcgmNwdealrw0WKkh2hVqSk8Vlh7LO+CBb8ta4OIjiUNhUV/+sh7/dHNoed fQI0UPw0kiqTUEPOMqsVf0hmJFdrD1ayYjZc56tpaBtpf87AcoEcwnMZlUiAeFfD W5eMFezd9uDvEP1igunL6tmyZgqiLWmNtS1IJcJ+8kF8M0DO+i9yW2UFeeqJGjjE dj1EpbyuV/Js2Tr+Pqwydi5d7ZHJCT3AVKtWYQ6UE6VGqn6DJOg= =nDJd -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm Pull ARM updates from Russell King: - Fix BSS size calculation for LLVM - Improve robustness of kernel entry around v7_invalidate_l1 - Fix and update kprobes assembly - Correct breakpoint overflow handler check - Pause function graph tracer when suspending a CPU - Switch to generic syscallhdr.sh and syscalltbl.sh - Remove now unused set_kernel_text_r[wo] functions - Updates for ptdump (__init marking and using DEFINE_SHOW_ATTRIBUTE) - Fix for interrupted SMC (secure) calls - Remove Compaq Personal Server platform * tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: ARM: footbridge: remove personal server platform ARM: 9075/1: kernel: Fix interrupted SMC calls ARM: 9074/1: ptdump: convert to DEFINE_SHOW_ATTRIBUTE ARM: 9073/1: ptdump: add __init section marker to three functions ARM: 9072/1: mm: remove set_kernel_text_r[ow]() ARM: 9067/1: syscalls: switch to generic syscallhdr.sh ARM: 9068/1: syscalls: switch to generic syscalltbl.sh ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend() ARM: 9064/1: hw_breakpoint: Do not directly check the event's overflow_handler hook ARM: 9062/1: kprobes: rewrite test-arm.c in UAL ARM: 9061/1: kprobes: fix UNPREDICTABLE warnings ARM: 9060/1: kexec: Remove unused kexec_reinit callback ARM: 9059/1: cache-v7: get rid of mini-stack ARM: 9058/1: cache-v7: refactor v7_invalidate_l1 to avoid clobbering r5/r6 ARM: 9057/1: cache-v7: add missing ISB after cache level selection ARM: 9056/1: decompressor: fix BSS size calculation for LLVM ld.lld
This commit is contained in:
commit
322a3b843d
@ -118,8 +118,8 @@ asflags-y := -DZIMAGE
|
||||
|
||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||
KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \
|
||||
sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
|
||||
-e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
|
||||
sed -n -e 's/^\([^ ]*\) [ABD] __bss_start$$/-0x\1/p' \
|
||||
-e 's/^\([^ ]*\) [ABD] __bss_stop$$/+0x\1/p') )) )
|
||||
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
|
||||
# Supply ZRELADDR to the decompressor via a linker symbol.
|
||||
ifneq ($(CONFIG_AUTO_ZRELADDR),y)
|
||||
|
@ -7,7 +7,6 @@ CONFIG_EXPERT=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_ARCH_FOOTBRIDGE=y
|
||||
CONFIG_ARCH_CATS=y
|
||||
CONFIG_ARCH_PERSONAL_SERVER=y
|
||||
CONFIG_ARCH_EBSA285_HOST=y
|
||||
CONFIG_ARCH_NETWINDER=y
|
||||
CONFIG_LEDS=y
|
||||
|
@ -56,9 +56,6 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
|
||||
}
|
||||
}
|
||||
|
||||
/* Function pointer to optional machine-specific reinitialization */
|
||||
extern void (*kexec_reinit)(void);
|
||||
|
||||
static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
|
||||
{
|
||||
return phys_to_idmap(phys);
|
||||
|
@ -150,21 +150,6 @@ extern unsigned long vectors_base;
|
||||
*/
|
||||
#define PLAT_PHYS_OFFSET UL(CONFIG_PHYS_OFFSET)
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
/*
|
||||
* When referencing data in RAM from the XIP region in a relative manner
|
||||
* with the MMU off, we need the relative offset between the two physical
|
||||
* addresses. The macro below achieves this, which is:
|
||||
* __pa(v_data) - __xip_pa(v_text)
|
||||
*/
|
||||
#define PHYS_RELATIVE(v_data, v_text) \
|
||||
(((v_data) - PAGE_OFFSET + PLAT_PHYS_OFFSET) - \
|
||||
((v_text) - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) + \
|
||||
CONFIG_XIP_PHYS_ADDR))
|
||||
#else
|
||||
#define PHYS_RELATIVE(v_data, v_text) ((v_data) - (v_text))
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
|
@ -18,12 +18,4 @@ static inline int set_memory_x(unsigned long addr, int numpages) { return 0; }
|
||||
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||
void set_kernel_text_rw(void);
|
||||
void set_kernel_text_ro(void);
|
||||
#else
|
||||
static inline void set_kernel_text_rw(void) { }
|
||||
static inline void set_kernel_text_ro(void) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -1,6 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
generated-y += unistd-common.h
|
||||
generated-y += unistd-oabi.h
|
||||
generated-y += unistd-eabi.h
|
||||
generic-y += kvm_para.h
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <asm/unistd-oabi.h>
|
||||
#endif
|
||||
|
||||
#include <asm/unistd-common.h>
|
||||
#define __NR_sync_file_range2 __NR_arm_sync_file_range
|
||||
|
||||
/*
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <linux/kbuild.h>
|
||||
#include <linux/arm-smccc.h>
|
||||
#include "signal.h"
|
||||
|
||||
/*
|
||||
@ -148,6 +149,8 @@ int main(void)
|
||||
DEFINE(SLEEP_SAVE_SP_PHYS, offsetof(struct sleep_save_sp, save_ptr_stash_phys));
|
||||
DEFINE(SLEEP_SAVE_SP_VIRT, offsetof(struct sleep_save_sp, save_ptr_stash));
|
||||
#endif
|
||||
DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id));
|
||||
DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state));
|
||||
BLANK();
|
||||
DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL);
|
||||
DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE);
|
||||
|
@ -344,20 +344,19 @@ ENTRY(\sym)
|
||||
.size \sym, . - \sym
|
||||
.endm
|
||||
|
||||
#define NATIVE(nr, func) syscall nr, func
|
||||
#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)
|
||||
#define __SYSCALL(nr, func) syscall nr, func
|
||||
|
||||
/*
|
||||
* This is the syscall table declaration for native ABI syscalls.
|
||||
* With EABI a couple syscalls are obsolete and defined as sys_ni_syscall.
|
||||
*/
|
||||
syscall_table_start sys_call_table
|
||||
#define COMPAT(nr, native, compat) syscall nr, native
|
||||
#ifdef CONFIG_AEABI
|
||||
#include <calls-eabi.S>
|
||||
#else
|
||||
#include <calls-oabi.S>
|
||||
#endif
|
||||
#undef COMPAT
|
||||
syscall_table_end sys_call_table
|
||||
|
||||
/*============================================================================
|
||||
@ -455,7 +454,8 @@ ENDPROC(sys_oabi_readahead)
|
||||
* using the compatibility syscall entries.
|
||||
*/
|
||||
syscall_table_start sys_oabi_call_table
|
||||
#define COMPAT(nr, native, compat) syscall nr, compat
|
||||
#undef __SYSCALL_WITH_COMPAT
|
||||
#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat)
|
||||
#include <calls-oabi.S>
|
||||
syscall_table_end sys_oabi_call_table
|
||||
|
||||
|
@ -886,7 +886,7 @@ static void breakpoint_handler(unsigned long unknown, struct pt_regs *regs)
|
||||
info->trigger = addr;
|
||||
pr_debug("breakpoint fired: address = 0x%x\n", addr);
|
||||
perf_bp_event(bp, regs);
|
||||
if (!bp->overflow_handler)
|
||||
if (is_default_overflow_handler(bp))
|
||||
enable_single_step(bp, addr);
|
||||
goto unlock;
|
||||
}
|
||||
|
@ -147,11 +147,6 @@ void machine_crash_shutdown(struct pt_regs *regs)
|
||||
pr_info("Loading crashdump kernel...\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Function pointer to optional machine-specific reinitialization
|
||||
*/
|
||||
void (*kexec_reinit)(void);
|
||||
|
||||
void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list, reboot_entry_phys;
|
||||
@ -187,9 +182,6 @@ void machine_kexec(struct kimage *image)
|
||||
|
||||
pr_info("Bye!\n");
|
||||
|
||||
if (kexec_reinit)
|
||||
kexec_reinit();
|
||||
|
||||
soft_restart(reboot_entry_phys);
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,9 @@
|
||||
* Copyright (c) 2015, Linaro Limited
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/arm-smccc.h>
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/opcodes-sec.h>
|
||||
#include <asm/opcodes-virt.h>
|
||||
#include <asm/unwind.h>
|
||||
@ -27,7 +29,14 @@ UNWIND( .fnstart)
|
||||
UNWIND( .save {r4-r7})
|
||||
ldm r12, {r4-r7}
|
||||
\instr
|
||||
pop {r4-r7}
|
||||
ldr r4, [sp, #36]
|
||||
cmp r4, #0
|
||||
beq 1f // No quirk structure
|
||||
ldr r5, [r4, #ARM_SMCCC_QUIRK_ID_OFFS]
|
||||
cmp r5, #ARM_SMCCC_QUIRK_QCOM_A6
|
||||
bne 1f // No quirk present
|
||||
str r6, [r4, #ARM_SMCCC_QUIRK_STATE_OFFS]
|
||||
1: pop {r4-r7}
|
||||
ldr r12, [sp, #(4 * 4)]
|
||||
stm r12, {r0-r3}
|
||||
bx lr
|
||||
|
@ -1,4 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mm_types.h>
|
||||
@ -25,6 +26,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
||||
if (!idmap_pgd)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Function graph tracer state gets incosistent when the kernel
|
||||
* calls functions that never return (aka suspend finishers) hence
|
||||
* disable graph tracing during their execution.
|
||||
*/
|
||||
pause_graph_tracing();
|
||||
|
||||
/*
|
||||
* Provide a temporary page table with an identity mapping for
|
||||
* the MMU-enable code, required for resuming. On successful
|
||||
@ -32,6 +40,9 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
||||
* back to the correct page tables.
|
||||
*/
|
||||
ret = __cpu_suspend(arg, fn, __mpidr);
|
||||
|
||||
unpause_graph_tracing();
|
||||
|
||||
if (ret == 0) {
|
||||
cpu_switch_mm(mm->pgd, mm);
|
||||
local_flush_bp_all();
|
||||
@ -45,7 +56,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
||||
int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
|
||||
{
|
||||
u32 __mpidr = cpu_logical_map(smp_processor_id());
|
||||
return __cpu_suspend(arg, fn, __mpidr);
|
||||
int ret;
|
||||
|
||||
pause_graph_tracing();
|
||||
ret = __cpu_suspend(arg, fn, __mpidr);
|
||||
unpause_graph_tracing();
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define idmap_pgd NULL
|
||||
#endif
|
||||
|
@ -16,27 +16,6 @@ config ARCH_CATS
|
||||
|
||||
Saying N will reduce the size of the Footbridge kernel.
|
||||
|
||||
config ARCH_PERSONAL_SERVER
|
||||
bool "Compaq Personal Server"
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select FORCE_PCI
|
||||
help
|
||||
Say Y here if you intend to run this kernel on the Compaq
|
||||
Personal Server.
|
||||
|
||||
Saying N will reduce the size of the Footbridge kernel.
|
||||
|
||||
The Compaq Personal Server is not available for purchase.
|
||||
There are no product plans beyond the current research
|
||||
prototypes at this time. Information is available at:
|
||||
|
||||
<http://www.crl.hpl.hp.com/projects/personalserver/>
|
||||
|
||||
If you have any questions or comments about the Compaq Personal
|
||||
Server, send e-mail to <skiff@crl.dec.com>.
|
||||
|
||||
config ARCH_EBSA285_ADDIN
|
||||
bool "EBSA285 (addin mode)"
|
||||
select ARCH_EBSA285
|
||||
|
@ -11,12 +11,10 @@ pci-y += dc21285.o
|
||||
pci-$(CONFIG_ARCH_CATS) += cats-pci.o
|
||||
pci-$(CONFIG_ARCH_EBSA285_HOST) += ebsa285-pci.o
|
||||
pci-$(CONFIG_ARCH_NETWINDER) += netwinder-pci.o
|
||||
pci-$(CONFIG_ARCH_PERSONAL_SERVER) += personal-pci.o
|
||||
|
||||
obj-$(CONFIG_ARCH_CATS) += cats-hw.o isa-timer.o
|
||||
obj-$(CONFIG_ARCH_EBSA285) += ebsa285.o dc21285-timer.o
|
||||
obj-$(CONFIG_ARCH_NETWINDER) += netwinder-hw.o isa-timer.o
|
||||
obj-$(CONFIG_ARCH_PERSONAL_SERVER) += personal.o dc21285-timer.o
|
||||
|
||||
obj-$(CONFIG_PCI) +=$(pci-y)
|
||||
|
||||
|
@ -1,57 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* linux/arch/arm/mach-footbridge/personal-pci.c
|
||||
*
|
||||
* PCI bios-type initialisation for PCI machines
|
||||
*
|
||||
* Bits taken from various places.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static int irqmap_personal_server[] = {
|
||||
IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0,
|
||||
IRQ_DOORBELLHOST, IRQ_DMA1, IRQ_DMA2, IRQ_PCI
|
||||
};
|
||||
|
||||
static int personal_server_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
unsigned char line;
|
||||
|
||||
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line);
|
||||
|
||||
if (line > 0x40 && line <= 0x5f) {
|
||||
/* line corresponds to the bit controlling this interrupt
|
||||
* in the footbridge. Ignore the first 8 interrupt bits,
|
||||
* look up the rest in the map. IN0 is bit number 8
|
||||
*/
|
||||
return irqmap_personal_server[(line & 0x1f) - 8];
|
||||
} else if (line == 0) {
|
||||
/* no interrupt */
|
||||
return 0;
|
||||
} else
|
||||
return irqmap_personal_server[(line - 1) & 3];
|
||||
}
|
||||
|
||||
static struct hw_pci personal_server_pci __initdata = {
|
||||
.map_irq = personal_server_map_irq,
|
||||
.nr_controllers = 1,
|
||||
.ops = &dc21285_ops,
|
||||
.setup = dc21285_setup,
|
||||
.preinit = dc21285_preinit,
|
||||
.postinit = dc21285_postinit,
|
||||
};
|
||||
|
||||
static int __init personal_pci_init(void)
|
||||
{
|
||||
if (machine_is_personal_server())
|
||||
pci_common_init(&personal_server_pci);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(personal_pci_init);
|
@ -1,25 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* linux/arch/arm/mach-footbridge/personal.c
|
||||
*
|
||||
* Personal server (Skiff) machine fixup
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/hardware/dec21285.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer")
|
||||
/* Maintainer: Jamey Hicks / George France */
|
||||
.atag_offset = 0x100,
|
||||
.map_io = footbridge_map_io,
|
||||
.init_irq = footbridge_init_irq,
|
||||
.init_time = footbridge_timer_init,
|
||||
.restart = footbridge_restart,
|
||||
MACHINE_END
|
||||
|
@ -33,41 +33,41 @@ icache_size:
|
||||
* processor. We fix this by performing an invalidate, rather than a
|
||||
* clean + invalidate, before jumping into the kernel.
|
||||
*
|
||||
* This function is cloned from arch/arm/mach-tegra/headsmp.S, and needs
|
||||
* to be called for both secondary cores startup and primary core resume
|
||||
* procedures.
|
||||
* This function needs to be called for both secondary cores startup and
|
||||
* primary core resume procedures.
|
||||
*/
|
||||
ENTRY(v7_invalidate_l1)
|
||||
mov r0, #0
|
||||
mcr p15, 2, r0, c0, c0, 0
|
||||
mrc p15, 1, r0, c0, c0, 0
|
||||
mov r0, #0
|
||||
mcr p15, 2, r0, c0, c0, 0 @ select L1 data cache in CSSELR
|
||||
isb
|
||||
mrc p15, 1, r0, c0, c0, 0 @ read cache geometry from CCSIDR
|
||||
|
||||
movw r1, #0x7fff
|
||||
and r2, r1, r0, lsr #13
|
||||
movw r3, #0x3ff
|
||||
and r3, r3, r0, lsr #3 @ 'Associativity' in CCSIDR[12:3]
|
||||
clz r1, r3 @ WayShift
|
||||
mov r2, #1
|
||||
mov r3, r3, lsl r1 @ NumWays-1 shifted into bits [31:...]
|
||||
movs r1, r2, lsl r1 @ #1 shifted left by same amount
|
||||
moveq r1, #1 @ r1 needs value > 0 even if only 1 way
|
||||
|
||||
movw r1, #0x3ff
|
||||
and r2, r0, #0x7
|
||||
add r2, r2, #4 @ SetShift
|
||||
|
||||
and r3, r1, r0, lsr #3 @ NumWays - 1
|
||||
add r2, r2, #1 @ NumSets
|
||||
1: movw ip, #0x7fff
|
||||
and r0, ip, r0, lsr #13 @ 'NumSets' in CCSIDR[27:13]
|
||||
|
||||
and r0, r0, #0x7
|
||||
add r0, r0, #4 @ SetShift
|
||||
|
||||
clz r1, r3 @ WayShift
|
||||
add r4, r3, #1 @ NumWays
|
||||
1: sub r2, r2, #1 @ NumSets--
|
||||
mov r3, r4 @ Temp = NumWays
|
||||
2: subs r3, r3, #1 @ Temp--
|
||||
mov r5, r3, lsl r1
|
||||
mov r6, r2, lsl r0
|
||||
orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
|
||||
mcr p15, 0, r5, c7, c6, 2
|
||||
bgt 2b
|
||||
cmp r2, #0
|
||||
bgt 1b
|
||||
dsb st
|
||||
isb
|
||||
ret lr
|
||||
2: mov ip, r0, lsl r2 @ NumSet << SetShift
|
||||
orr ip, ip, r3 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
|
||||
mcr p15, 0, ip, c7, c6, 2
|
||||
subs r0, r0, #1 @ Set--
|
||||
bpl 2b
|
||||
subs r3, r3, r1 @ Way--
|
||||
bcc 3f
|
||||
mrc p15, 1, r0, c0, c0, 0 @ re-read cache geometry from CCSIDR
|
||||
b 1b
|
||||
3: dsb st
|
||||
isb
|
||||
ret lr
|
||||
ENDPROC(v7_invalidate_l1)
|
||||
|
||||
/*
|
||||
|
@ -420,7 +420,7 @@ void ptdump_walk_pgd(struct seq_file *m, struct ptdump_info *info)
|
||||
note_page(&st, 0, 0, 0, NULL);
|
||||
}
|
||||
|
||||
static void ptdump_initialize(void)
|
||||
static void __init ptdump_initialize(void)
|
||||
{
|
||||
unsigned i, j;
|
||||
|
||||
@ -466,7 +466,7 @@ void ptdump_check_wx(void)
|
||||
pr_info("Checked W+X mappings: passed, no W+X pages found\n");
|
||||
}
|
||||
|
||||
static int ptdump_init(void)
|
||||
static int __init ptdump_init(void)
|
||||
{
|
||||
ptdump_initialize();
|
||||
ptdump_debugfs_register(&kernel_ptdump_info, "kernel_page_tables");
|
||||
|
@ -489,33 +489,12 @@ static int __mark_rodata_ro(void *unused)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kernel_set_to_readonly __read_mostly;
|
||||
|
||||
void mark_rodata_ro(void)
|
||||
{
|
||||
kernel_set_to_readonly = 1;
|
||||
stop_machine(__mark_rodata_ro, NULL, NULL);
|
||||
debug_checkwx();
|
||||
}
|
||||
|
||||
void set_kernel_text_rw(void)
|
||||
{
|
||||
if (!kernel_set_to_readonly)
|
||||
return;
|
||||
|
||||
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), false,
|
||||
current->active_mm);
|
||||
}
|
||||
|
||||
void set_kernel_text_ro(void)
|
||||
{
|
||||
if (!kernel_set_to_readonly)
|
||||
return;
|
||||
|
||||
set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true,
|
||||
current->active_mm);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void fix_kernmem_perms(void) { }
|
||||
#endif /* CONFIG_STRICT_KERNEL_RWX */
|
||||
|
@ -256,6 +256,20 @@ ENDPROC(cpu_pj4b_do_resume)
|
||||
|
||||
#endif
|
||||
|
||||
@
|
||||
@ Invoke the v7_invalidate_l1() function, which adheres to the AAPCS
|
||||
@ rules, and so it may corrupt registers that we need to preserve.
|
||||
@
|
||||
.macro do_invalidate_l1
|
||||
mov r6, r1
|
||||
mov r7, r2
|
||||
mov r10, lr
|
||||
bl v7_invalidate_l1 @ corrupts {r0-r3, ip, lr}
|
||||
mov r1, r6
|
||||
mov r2, r7
|
||||
mov lr, r10
|
||||
.endm
|
||||
|
||||
/*
|
||||
* __v7_setup
|
||||
*
|
||||
@ -277,6 +291,7 @@ __v7_ca5mp_setup:
|
||||
__v7_ca9mp_setup:
|
||||
__v7_cr7mp_setup:
|
||||
__v7_cr8mp_setup:
|
||||
do_invalidate_l1
|
||||
mov r10, #(1 << 0) @ Cache/TLB ops broadcasting
|
||||
b 1f
|
||||
__v7_ca7mp_setup:
|
||||
@ -284,13 +299,9 @@ __v7_ca12mp_setup:
|
||||
__v7_ca15mp_setup:
|
||||
__v7_b15mp_setup:
|
||||
__v7_ca17mp_setup:
|
||||
do_invalidate_l1
|
||||
mov r10, #0
|
||||
1: adr r0, __v7_setup_stack_ptr
|
||||
ldr r12, [r0]
|
||||
add r12, r12, r0 @ the local stack
|
||||
stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
|
||||
bl v7_invalidate_l1
|
||||
ldmia r12, {r1-r6, lr}
|
||||
1:
|
||||
#ifdef CONFIG_SMP
|
||||
orr r10, r10, #(1 << 6) @ Enable SMP/nAMP mode
|
||||
ALT_SMP(mrc p15, 0, r0, c1, c0, 1)
|
||||
@ -471,12 +482,7 @@ __v7_pj4b_setup:
|
||||
#endif /* CONFIG_CPU_PJ4B */
|
||||
|
||||
__v7_setup:
|
||||
adr r0, __v7_setup_stack_ptr
|
||||
ldr r12, [r0]
|
||||
add r12, r12, r0 @ the local stack
|
||||
stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6
|
||||
bl v7_invalidate_l1
|
||||
ldmia r12, {r1-r6, lr}
|
||||
do_invalidate_l1
|
||||
|
||||
__v7_setup_cont:
|
||||
and r0, r9, #0xff000000 @ ARM?
|
||||
@ -548,17 +554,8 @@ __errata_finish:
|
||||
orr r0, r0, r6 @ set them
|
||||
THUMB( orr r0, r0, #1 << 30 ) @ Thumb exceptions
|
||||
ret lr @ return to head.S:__ret
|
||||
|
||||
.align 2
|
||||
__v7_setup_stack_ptr:
|
||||
.word PHYS_RELATIVE(__v7_setup_stack, .)
|
||||
ENDPROC(__v7_setup)
|
||||
|
||||
.bss
|
||||
.align 2
|
||||
__v7_setup_stack:
|
||||
.space 4 * 7 @ 7 registers
|
||||
|
||||
__INITDATA
|
||||
|
||||
.weak cpu_v7_bugs_init
|
||||
|
@ -11,20 +11,9 @@ static int ptdump_show(struct seq_file *m, void *v)
|
||||
ptdump_walk_pgd(m, info);
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(ptdump);
|
||||
|
||||
static int ptdump_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, ptdump_show, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations ptdump_fops = {
|
||||
.open = ptdump_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
void ptdump_debugfs_register(struct ptdump_info *info, const char *name)
|
||||
void __init ptdump_debugfs_register(struct ptdump_info *info, const char *name)
|
||||
{
|
||||
debugfs_create_file(name, 0400, NULL, info, &ptdump_fops);
|
||||
}
|
||||
|
@ -55,25 +55,25 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_GROUP("Data-processing (register), (register-shifted register), (immediate)")
|
||||
|
||||
#define _DATA_PROCESSING_DNM(op,s,val) \
|
||||
TEST_RR( op "eq" s " r0, r",1, VAL1,", r",2, val, "") \
|
||||
TEST_RR( op "ne" s " r1, r",1, VAL1,", r",2, val, ", lsl #3") \
|
||||
TEST_RR( op "cs" s " r2, r",3, VAL1,", r",2, val, ", lsr #4") \
|
||||
TEST_RR( op "cc" s " r3, r",3, VAL1,", r",2, val, ", asr #5") \
|
||||
TEST_RR( op "mi" s " r4, r",5, VAL1,", r",2, N(val),", asr #6") \
|
||||
TEST_RR( op "pl" s " r5, r",5, VAL1,", r",2, val, ", ror #7") \
|
||||
TEST_RR( op "vs" s " r6, r",7, VAL1,", r",2, val, ", rrx") \
|
||||
TEST_R( op "vc" s " r6, r",7, VAL1,", pc, lsl #3") \
|
||||
TEST_R( op "vc" s " r6, r",7, VAL1,", sp, lsr #4") \
|
||||
TEST_R( op "vc" s " r6, pc, r",7, VAL1,", asr #5") \
|
||||
TEST_R( op "vc" s " r6, sp, r",7, VAL1,", ror #6") \
|
||||
TEST_RRR( op "hi" s " r8, r",9, VAL1,", r",14,val, ", lsl r",0, 3,"")\
|
||||
TEST_RRR( op "ls" s " r9, r",9, VAL1,", r",14,val, ", lsr r",7, 4,"")\
|
||||
TEST_RRR( op "ge" s " r10, r",11,VAL1,", r",14,val, ", asr r",7, 5,"")\
|
||||
TEST_RRR( op "lt" s " r11, r",11,VAL1,", r",14,N(val),", asr r",7, 6,"")\
|
||||
TEST_RR( op "gt" s " r12, r13" ", r",14,val, ", ror r",14,7,"")\
|
||||
TEST_RR( op "le" s " r14, r",0, val, ", r13" ", lsl r",14,8,"")\
|
||||
TEST_R( op "eq" s " r0, r",11,VAL1,", #0xf5") \
|
||||
TEST_R( op "ne" s " r11, r",0, VAL1,", #0xf5000000") \
|
||||
TEST_RR( op s "eq r0, r",1, VAL1,", r",2, val, "") \
|
||||
TEST_RR( op s "ne r1, r",1, VAL1,", r",2, val, ", lsl #3") \
|
||||
TEST_RR( op s "cs r2, r",3, VAL1,", r",2, val, ", lsr #4") \
|
||||
TEST_RR( op s "cc r3, r",3, VAL1,", r",2, val, ", asr #5") \
|
||||
TEST_RR( op s "mi r4, r",5, VAL1,", r",2, N(val),", asr #6") \
|
||||
TEST_RR( op s "pl r5, r",5, VAL1,", r",2, val, ", ror #7") \
|
||||
TEST_RR( op s "vs r6, r",7, VAL1,", r",2, val, ", rrx") \
|
||||
TEST_R( op s "vc r6, r",7, VAL1,", pc, lsl #3") \
|
||||
TEST_R( op s "vc r6, r",7, VAL1,", sp, lsr #4") \
|
||||
TEST_R( op s "vc r6, pc, r",7, VAL1,", asr #5") \
|
||||
TEST_R( op s "vc r6, sp, r",7, VAL1,", ror #6") \
|
||||
TEST_RRR( op s "hi r8, r",9, VAL1,", r",14,val, ", lsl r",0, 3,"")\
|
||||
TEST_RRR( op s "ls r9, r",9, VAL1,", r",14,val, ", lsr r",7, 4,"")\
|
||||
TEST_RRR( op s "ge r10, r",11,VAL1,", r",14,val, ", asr r",7, 5,"")\
|
||||
TEST_RRR( op s "lt r11, r",11,VAL1,", r",14,N(val),", asr r",7, 6,"")\
|
||||
TEST_RR( op s "gt r12, r13" ", r",14,val, ", ror r",14,7,"")\
|
||||
TEST_RR( op s "le r14, r",0, val, ", r13" ", lsl r",14,8,"")\
|
||||
TEST_R( op s "eq r0, r",11,VAL1,", #0xf5") \
|
||||
TEST_R( op s "ne r11, r",0, VAL1,", #0xf5000000") \
|
||||
TEST_R( op s " r7, r",8, VAL2,", #0x000af000") \
|
||||
TEST( op s " r4, pc" ", #0x00005a00")
|
||||
|
||||
@ -104,23 +104,23 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_R( op " r",8, VAL2,", #0x000af000")
|
||||
|
||||
#define _DATA_PROCESSING_DM(op,s,val) \
|
||||
TEST_R( op "eq" s " r0, r",1, val, "") \
|
||||
TEST_R( op "ne" s " r1, r",1, val, ", lsl #3") \
|
||||
TEST_R( op "cs" s " r2, r",3, val, ", lsr #4") \
|
||||
TEST_R( op "cc" s " r3, r",3, val, ", asr #5") \
|
||||
TEST_R( op "mi" s " r4, r",5, N(val),", asr #6") \
|
||||
TEST_R( op "pl" s " r5, r",5, val, ", ror #7") \
|
||||
TEST_R( op "vs" s " r6, r",10,val, ", rrx") \
|
||||
TEST( op "vs" s " r7, pc, lsl #3") \
|
||||
TEST( op "vs" s " r7, sp, lsr #4") \
|
||||
TEST_RR( op "vc" s " r8, r",7, val, ", lsl r",0, 3,"") \
|
||||
TEST_RR( op "hi" s " r9, r",9, val, ", lsr r",7, 4,"") \
|
||||
TEST_RR( op "ls" s " r10, r",9, val, ", asr r",7, 5,"") \
|
||||
TEST_RR( op "ge" s " r11, r",11,N(val),", asr r",7, 6,"") \
|
||||
TEST_RR( op "lt" s " r12, r",11,val, ", ror r",14,7,"") \
|
||||
TEST_R( op "gt" s " r14, r13" ", lsl r",14,8,"") \
|
||||
TEST( op "eq" s " r0, #0xf5") \
|
||||
TEST( op "ne" s " r11, #0xf5000000") \
|
||||
TEST_R( op s "eq r0, r",1, val, "") \
|
||||
TEST_R( op s "ne r1, r",1, val, ", lsl #3") \
|
||||
TEST_R( op s "cs r2, r",3, val, ", lsr #4") \
|
||||
TEST_R( op s "cc r3, r",3, val, ", asr #5") \
|
||||
TEST_R( op s "mi r4, r",5, N(val),", asr #6") \
|
||||
TEST_R( op s "pl r5, r",5, val, ", ror #7") \
|
||||
TEST_R( op s "vs r6, r",10,val, ", rrx") \
|
||||
TEST( op s "vs r7, pc, lsl #3") \
|
||||
TEST( op s "vs r7, sp, lsr #4") \
|
||||
TEST_RR( op s "vc r8, r",7, val, ", lsl r",0, 3,"") \
|
||||
TEST_RR( op s "hi r9, r",9, val, ", lsr r",7, 4,"") \
|
||||
TEST_RR( op s "ls r10, r",9, val, ", asr r",7, 5,"") \
|
||||
TEST_RR( op s "ge r11, r",11,N(val),", asr r",7, 6,"") \
|
||||
TEST_RR( op s "lt r12, r",11,val, ", ror r",14,7,"") \
|
||||
TEST_R( op s "gt r14, r13" ", lsl r",14,8,"") \
|
||||
TEST( op s "eq r0, #0xf5") \
|
||||
TEST( op s "ne r11, #0xf5000000") \
|
||||
TEST( op s " r7, #0x000af000") \
|
||||
TEST( op s " r4, #0x00005a00")
|
||||
|
||||
@ -166,10 +166,10 @@ void kprobe_arm_test_cases(void)
|
||||
|
||||
/* Data-processing with PC as a target and status registers updated */
|
||||
TEST_UNSUPPORTED("movs pc, r1")
|
||||
TEST_UNSUPPORTED("movs pc, r1, lsl r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1b0f211) " @movs pc, r1, lsl r2")
|
||||
TEST_UNSUPPORTED("movs pc, #0x10000")
|
||||
TEST_UNSUPPORTED("adds pc, lr, r1")
|
||||
TEST_UNSUPPORTED("adds pc, lr, r1, lsl r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe09ef211) " @adds pc, lr, r1, lsl r2")
|
||||
TEST_UNSUPPORTED("adds pc, lr, #4")
|
||||
|
||||
/* Data-processing with SP as target */
|
||||
@ -352,7 +352,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe000029f) " @ mul r0, pc, r2")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0000f91) " @ mul r0, r1, pc")
|
||||
TEST_RR( "muls r0, r",1, VAL1,", r",2, VAL2,"")
|
||||
TEST_RR( "mullss r7, r",8, VAL2,", r",9, VAL2,"")
|
||||
TEST_RR( "mulsls r7, r",8, VAL2,", r",9, VAL2,"")
|
||||
TEST_R( "muls lr, r",4, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe01f0291) " @ muls pc, r1, r2")
|
||||
|
||||
@ -361,7 +361,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_RR( "mla lr, r",1, VAL2,", r",2, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe02f3291) " @ mla pc, r1, r2, r3")
|
||||
TEST_RRR( "mlas r0, r",1, VAL1,", r",2, VAL2,", r",3, VAL3,"")
|
||||
TEST_RRR( "mlahis r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
|
||||
TEST_RRR( "mlashi r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"")
|
||||
TEST_RR( "mlas lr, r",1, VAL2,", r",2, VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe03f3291) " @ mlas pc, r1, r2, r3")
|
||||
|
||||
@ -394,7 +394,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe081f392) " @ umull pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe08f1392) " @ umull r1, pc, r2, r3")
|
||||
TEST_RR( "umulls r0, r1, r",2, VAL1,", r",3, VAL2,"")
|
||||
TEST_RR( "umulllss r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_RR( "umullsls r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_R( "umulls lr, r12, r",11,VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe091f392) " @ umulls pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe09f1392) " @ umulls r1, pc, r2, r3")
|
||||
@ -405,7 +405,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0af1392) " @ umlal pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0a1f392) " @ umlal r1, pc, r2, r3")
|
||||
TEST_RRRR( "umlals r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
|
||||
TEST_RRRR( "umlalles r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRRR( "umlalsle r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRR( "umlals r",14,VAL3,", r",7, VAL4,", r",5, VAL1,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0bf1392) " @ umlals pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0b1f392) " @ umlals r1, pc, r2, r3")
|
||||
@ -416,7 +416,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0c1f392) " @ smull pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0cf1392) " @ smull r1, pc, r2, r3")
|
||||
TEST_RR( "smulls r0, r1, r",2, VAL1,", r",3, VAL2,"")
|
||||
TEST_RR( "smulllss r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_RR( "smullsls r7, r8, r",9, VAL2,", r",10, VAL1,"")
|
||||
TEST_R( "smulls lr, r12, r",11,VAL3,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0d1f392) " @ smulls pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0df1392) " @ smulls r1, pc, r2, r3")
|
||||
@ -427,7 +427,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0ef1392) " @ smlal pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0e1f392) " @ smlal r1, pc, r2, r3")
|
||||
TEST_RRRR( "smlals r",0, VAL1,", r",1, VAL2,", r",2, VAL3,", r",3, VAL4)
|
||||
TEST_RRRR( "smlalles r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRRR( "smlalsle r",8, VAL4,", r",9, VAL1,", r",10,VAL2,", r",11,VAL3)
|
||||
TEST_RRR( "smlals r",14,VAL3,", r",7, VAL4,", r",5, VAL1,", r13")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0ff1392) " @ smlals pc, r1, r2, r3")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0f0f392) " @ smlals r0, pc, r2, r3")
|
||||
@ -450,7 +450,7 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe10f0091) " @ swp r0, r1, [pc]")
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
TEST_RP("swpb lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( "swpvsb r0, r",1,VAL1,", [sp]")
|
||||
TEST_R( "swpbvs r0, r",1,VAL1,", [sp]")
|
||||
#else
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe148e097) " @ swpb lr, r7, [r8]")
|
||||
TEST_UNSUPPORTED(__inst_arm(0x614d0091) " @ swpvsb r0, r1, [sp]")
|
||||
@ -477,11 +477,11 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_GROUP("Extra load/store instructions")
|
||||
|
||||
TEST_RPR( "strh r",0, VAL1,", [r",1, 48,", -r",2, 24,"]")
|
||||
TEST_RPR( "streqh r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
|
||||
TEST_UNSUPPORTED( "streqh r14, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "streqh r14, [r12, r13]")
|
||||
TEST_RPR( "strheq r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
|
||||
TEST_UNSUPPORTED( "strheq r14, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strheq r14, [r12, r13]")
|
||||
TEST_RPR( "strh r",1, VAL1,", [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_RPR( "strneh r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strhne r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strh r",2, VAL1,", [r",3, 24,"], r",4, 48,"")
|
||||
TEST_RPR( "strh r",10,VAL2,", [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0ba) " @ strh r12, [pc, r10]!")
|
||||
@ -489,9 +489,9 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089a0bf) " @ strh r10, [r9], pc")
|
||||
|
||||
TEST_PR( "ldrh r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrcsh r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrhcs r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrh r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrcch r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrhcc r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrh r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrh r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0ba) " @ ldrh r12, [pc, r10]!")
|
||||
@ -499,9 +499,9 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe099a0bf) " @ ldrh r10, [r9], pc")
|
||||
|
||||
TEST_RP( "strh r",0, VAL1,", [r",1, 24,", #-2]")
|
||||
TEST_RP( "strmih r",14,VAL2,", [r",13,0, ", #2]")
|
||||
TEST_RP( "strhmi r",14,VAL2,", [r",13,0, ", #2]")
|
||||
TEST_RP( "strh r",1, VAL1,", [r",2, 24,", #4]!")
|
||||
TEST_RP( "strplh r",12,VAL2,", [r",11,24,", #-4]!")
|
||||
TEST_RP( "strhpl r",12,VAL2,", [r",11,24,", #-4]!")
|
||||
TEST_RP( "strh r",2, VAL1,", [r",3, 24,"], #48")
|
||||
TEST_RP( "strh r",10,VAL2,", [r",9, 64,"], #-48")
|
||||
TEST_RP( "strh r",3, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
|
||||
@ -511,9 +511,9 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0c9f3b0) " @ strh pc, [r9], #48")
|
||||
|
||||
TEST_P( "ldrh r0, [r",0, 24,", #-2]")
|
||||
TEST_P( "ldrvsh r14, [r",13,0, ", #2]")
|
||||
TEST_P( "ldrhvs r14, [r",13,0, ", #2]")
|
||||
TEST_P( "ldrh r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrvch r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrhvc r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrh r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrh r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrh r0, [pc, #0]")
|
||||
@ -521,18 +521,18 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0d9f3b0) " @ ldrh pc, [r9], #48")
|
||||
|
||||
TEST_PR( "ldrsb r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrhisb r14, [r",13,0,", r",12, 48,"]")
|
||||
TEST_PR( "ldrsbhi r14, [r",13,0,", r",12, 48,"]")
|
||||
TEST_PR( "ldrsb r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrlssb r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsbls r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsb r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrsb r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0da) " @ ldrsb r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe099f0db) " @ ldrsb pc, [r9], r11")
|
||||
|
||||
TEST_P( "ldrsb r0, [r",0, 24,", #-1]")
|
||||
TEST_P( "ldrgesb r14, [r",13,0, ", #1]")
|
||||
TEST_P( "ldrsbge r14, [r",13,0, ", #1]")
|
||||
TEST_P( "ldrsb r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrltsb r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsblt r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsb r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrsb r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrsb r0, [pc, #0]")
|
||||
@ -540,18 +540,18 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe0d9f3d0) " @ ldrsb pc, [r9], #48")
|
||||
|
||||
TEST_PR( "ldrsh r0, [r",0, 48,", -r",2, 24,"]")
|
||||
TEST_PR( "ldrgtsh r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrshgt r14, [r",13,0, ", r",12, 48,"]")
|
||||
TEST_PR( "ldrsh r1, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrlesh r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrshle r12, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrsh r2, [r",3, 24,"], r",4, 48,"")
|
||||
TEST_PR( "ldrsh r10, [r",9, 48,"], -r",11,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1bfc0fa) " @ ldrsh r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe099f0fb) " @ ldrsh pc, [r9], r11")
|
||||
|
||||
TEST_P( "ldrsh r0, [r",0, 24,", #-1]")
|
||||
TEST_P( "ldreqsh r14, [r",13,0 ,", #1]")
|
||||
TEST_P( "ldrsheq r14, [r",13,0 ,", #1]")
|
||||
TEST_P( "ldrsh r1, [r",2, 24,", #4]!")
|
||||
TEST_P( "ldrnesh r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrshne r12, [r",11,24,", #-4]!")
|
||||
TEST_P( "ldrsh r2, [r",3, 24,"], #48")
|
||||
TEST_P( "ldrsh r10, [r",9, 64,"], #-48")
|
||||
TEST( "ldrsh r0, [pc, #0]")
|
||||
@ -571,30 +571,30 @@ void kprobe_arm_test_cases(void)
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
TEST_RPR( "strd r",0, VAL1,", [r",1, 48,", -r",2,24,"]")
|
||||
TEST_RPR( "strccd r",8, VAL2,", [r",11,0, ", r",12,48,"]")
|
||||
TEST_UNSUPPORTED( "strccd r8, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strccd r8, [r12, r13]")
|
||||
TEST_RPR( "strdcc r",8, VAL2,", [r",11,0, ", r",12,48,"]")
|
||||
TEST_UNSUPPORTED( "strdcc r8, [r13, r12]")
|
||||
TEST_UNSUPPORTED( "strdcc r8, [r12, r13]")
|
||||
TEST_RPR( "strd r",4, VAL1,", [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_RPR( "strcsd r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",10,VAL2,", [r",9, 48,"], -r",7,24,"")
|
||||
TEST_RPR( "strdcs r",12,VAL2,", r13, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strd r",2, VAL1,", r3, [r",5, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",10,VAL2,", r11, [r",9, 48,"], -r",7,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0fa) " @ strd r12, [pc, r10]!")
|
||||
|
||||
TEST_PR( "ldrd r0, [r",0, 48,", -r",2,24,"]")
|
||||
TEST_PR( "ldrmid r8, [r",13,0, ", r",12,48,"]")
|
||||
TEST_PR( "ldrdmi r8, [r",13,0, ", r",12,48,"]")
|
||||
TEST_PR( "ldrd r4, [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_PR( "ldrpld r6, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrd r2, [r",5, 24,"], r",4,48,"")
|
||||
TEST_PR( "ldrd r10, [r",9,48,"], -r",7,24,"")
|
||||
TEST_PR( "ldrdpl r6, [r",11,48,", -r",10,24,"]!")
|
||||
TEST_PR( "ldrd r2, r3, [r",5, 24,"], r",4,48,"")
|
||||
TEST_PR( "ldrd r10, r11, [r",9,48,"], -r",7,24,"")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1afc0da) " @ ldrd r12, [pc, r10]!")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089f0db) " @ ldrd pc, [r9], r11")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089e0db) " @ ldrd lr, [r9], r11")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe089c0df) " @ ldrd r12, [r9], pc")
|
||||
|
||||
TEST_RP( "strd r",0, VAL1,", [r",1, 24,", #-8]")
|
||||
TEST_RP( "strvsd r",8, VAL2,", [r",13,0, ", #8]")
|
||||
TEST_RP( "strdvs r",8, VAL2,", [r",13,0, ", #8]")
|
||||
TEST_RP( "strd r",4, VAL1,", [r",2, 24,", #16]!")
|
||||
TEST_RP( "strvcd r",12,VAL2,", [r",11,24,", #-16]!")
|
||||
TEST_RP( "strdvc r",12,VAL2,", r13, [r",11,24,", #-16]!")
|
||||
TEST_RP( "strd r",2, VAL1,", [r",4, 24,"], #48")
|
||||
TEST_RP( "strd r",10,VAL2,", [r",9, 64,"], #-48")
|
||||
TEST_RP( "strd r",6, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
|
||||
@ -603,9 +603,9 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1efc3f0) " @ strd r12, [pc, #48]!")
|
||||
|
||||
TEST_P( "ldrd r0, [r",0, 24,", #-8]")
|
||||
TEST_P( "ldrhid r8, [r",13,0, ", #8]")
|
||||
TEST_P( "ldrdhi r8, [r",13,0, ", #8]")
|
||||
TEST_P( "ldrd r4, [r",2, 24,", #16]!")
|
||||
TEST_P( "ldrlsd r6, [r",11,24,", #-16]!")
|
||||
TEST_P( "ldrdls r6, [r",11,24,", #-16]!")
|
||||
TEST_P( "ldrd r2, [r",5, 24,"], #48")
|
||||
TEST_P( "ldrd r10, [r",9,6,"], #-48")
|
||||
TEST_UNSUPPORTED(__inst_arm(0xe1efc3d0) " @ ldrd r12, [pc, #48]!")
|
||||
@ -1084,63 +1084,63 @@ void kprobe_arm_test_cases(void)
|
||||
TEST_GROUP("Branch, branch with link, and block data transfer")
|
||||
|
||||
TEST_P( "stmda r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmeqda r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmneda r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdaeq r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmdane r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmda r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmda r",13,0, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmda r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmcsda r",4, 15*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmccda r",7, 15*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmdacs r",4, 15*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmdacc r",7, 15*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmda r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmda r",14,15*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmia r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmmiia r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmplia r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmiami r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmiapl r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmia r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmia r",14,0, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmvsia r",4, 0, ", {r0-r15}")
|
||||
TEST_BF_P("ldmvcia r",7, 8*4, "!, {r8-r15}")
|
||||
TEST_BF_P("ldmiavs r",4, 0, ", {r0-r15}")
|
||||
TEST_BF_P("ldmiavc r",7, 8*4, "!, {r8-r15}")
|
||||
TEST_P( "ldmia r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmia r",14,15*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmhidb r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmlsdb r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdbhi r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmdbls r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmdb r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmdb r",13,4, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmdb r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmgedb r",4, 16*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmltdb r",7, 16*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmdbge r",4, 16*4,", {r0-r15}")
|
||||
TEST_BF_P("ldmdblt r",7, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmdb r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmdb r",14,16*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmib r",0, 16*4,", {r0}")
|
||||
TEST_P( "stmgtib r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmleib r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmibgt r",4, 16*4,", {r0-r15}")
|
||||
TEST_P( "stmible r",8, 16*4,"!, {r8-r15}")
|
||||
TEST_P( "stmib r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_P( "stmib r",13,-4, "!, {pc}")
|
||||
|
||||
TEST_P( "ldmib r",0, 16*4,", {r0}")
|
||||
TEST_BF_P("ldmeqib r",4, -4,", {r0-r15}")
|
||||
TEST_BF_P("ldmneib r",7, 7*4,"!, {r8-r15}")
|
||||
TEST_BF_P("ldmibeq r",4, -4,", {r0-r15}")
|
||||
TEST_BF_P("ldmibne r",7, 7*4,"!, {r8-r15}")
|
||||
TEST_P( "ldmib r",12,16*4,"!, {r1,r3,r5,r7,r8-r11,r14}")
|
||||
TEST_BF_P("ldmib r",14,14*4,"!, {pc}")
|
||||
|
||||
TEST_P( "stmdb r",13,16*4,"!, {r3-r12,lr}")
|
||||
TEST_P( "stmeqdb r",13,16*4,"!, {r3-r12}")
|
||||
TEST_P( "stmnedb r",2, 16*4,", {r3-r12,lr}")
|
||||
TEST_P( "stmdbeq r",13,16*4,"!, {r3-r12}")
|
||||
TEST_P( "stmdbne r",2, 16*4,", {r3-r12,lr}")
|
||||
TEST_P( "stmdb r",13,16*4,"!, {r2-r12,lr}")
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0-r12}")
|
||||
TEST_P( "stmdb r",0, 16*4,", {r0-r12,lr}")
|
||||
|
||||
TEST_BF_P("ldmia r",13,5*4, "!, {r3-r12,pc}")
|
||||
TEST_P( "ldmccia r",13,5*4, "!, {r3-r12}")
|
||||
TEST_BF_P("ldmcsia r",2, 5*4, "!, {r3-r12,pc}")
|
||||
TEST_P( "ldmiacc r",13,5*4, "!, {r3-r12}")
|
||||
TEST_BF_P("ldmiacs r",2, 5*4, "!, {r3-r12,pc}")
|
||||
TEST_BF_P("ldmia r",13,4*4, "!, {r2-r12,pc}")
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0-r12}")
|
||||
TEST_P( "ldmia r",0, 16*4,", {r0-r12,lr}")
|
||||
@ -1174,80 +1174,80 @@ void kprobe_arm_test_cases(void)
|
||||
#define TEST_COPROCESSOR(code) TEST_UNSUPPORTED(code)
|
||||
|
||||
#define COPROCESSOR_INSTRUCTIONS_ST_LD(two,cc) \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two" 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two"l 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two" 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two"l 0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two" p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("stc"two"l p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two" p0, cr0, [r13], {1}") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #-4]") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13, #-4]!") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], #4") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], #-4") \
|
||||
TEST_COPROCESSOR("ldc"two"l p0, cr0, [r13], {1}") \
|
||||
\
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##daf0001) " @ stc"two" 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d2f0001) " @ stc"two" 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##caf0001) " @ stc"two" 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c2f0001) " @ stc"two" 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "stc"two" 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two" p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##def0001) " @ stc"two"l 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d6f0001) " @ stc"two"l 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cef0001) " @ stc"two"l 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c6f0001) " @ stc"two"l 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "stc"two"l 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "stc"two"l p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##dbf0001) " @ ldc"two" 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d3f0001) " @ ldc"two" 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cbf0001) " @ ldc"two" 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c3f0001) " @ ldc"two" 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "ldc"two" 0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15, #-4]") \
|
||||
TEST_COPROCESSOR( "ldc"two" p0, cr0, [r15], {1}") \
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15, #4]") \
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15, #-4]") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##dff0001) " @ ldc"two"l 0, cr0, [r15, #4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##d7f0001) " @ ldc"two"l 0, cr0, [r15, #-4]!") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##cff0001) " @ ldc"two"l 0, cr0, [r15], #4") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c7f0001) " @ ldc"two"l 0, cr0, [r15], #-4") \
|
||||
TEST_COPROCESSOR( "ldc"two"l 0, cr0, [r15], {1}")
|
||||
TEST_COPROCESSOR( "ldc"two"l p0, cr0, [r15], {1}")
|
||||
|
||||
#define COPROCESSOR_INSTRUCTIONS_MC_MR(two,cc) \
|
||||
\
|
||||
TEST_COPROCESSOR( "mcrr"two" 0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mcrr"two" 15, 0, r14, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mcrr"two" p0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mcrr"two" p15, 0, r14, r0, cr15") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c4f00f0) " @ mcrr"two" 0, 15, r0, r15, cr0") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c40ff0f) " @ mcrr"two" 15, 0, r15, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mrrc"two" 0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mrrc"two" 15, 0, r14, r0, cr15") \
|
||||
TEST_COPROCESSOR( "mrrc"two" p0, 15, r0, r14, cr0") \
|
||||
TEST_COPROCESSOR( "mrrc"two" p15, 0, r14, r0, cr15") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c5f00f0) " @ mrrc"two" 0, 15, r0, r15, cr0") \
|
||||
TEST_UNSUPPORTED(__inst_arm(0x##cc##c50ff0f) " @ mrrc"two" 15, 0, r15, r0, cr15") \
|
||||
TEST_COPROCESSOR( "cdp"two" 15, 15, cr15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "cdp"two" 0, 0, cr0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mcr"two" 15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mcr"two" 0, 0, r0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mrc"two" 15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mrc"two" 0, 0, r0, cr0, cr0, 0")
|
||||
TEST_COPROCESSOR( "cdp"two" p15, 15, cr15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "cdp"two" p0, 0, cr0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mcr"two" p15, 7, r15, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mcr"two" p0, 0, r0, cr0, cr0, 0") \
|
||||
TEST_COPROCESSOR( "mrc"two" p15, 7, r14, cr15, cr15, 7") \
|
||||
TEST_COPROCESSOR( "mrc"two" p0, 0, r0, cr0, cr0, 0")
|
||||
|
||||
COPROCESSOR_INSTRUCTIONS_ST_LD("",e)
|
||||
#if __LINUX_ARM_ARCH__ >= 5
|
||||
|
@ -108,6 +108,7 @@ struct test_arg_end {
|
||||
|
||||
#define TESTCASE_START(title) \
|
||||
__asm__ __volatile__ ( \
|
||||
".syntax unified \n\t" \
|
||||
"bl __kprobes_test_case_start \n\t" \
|
||||
".pushsection .rodata \n\t" \
|
||||
"10: \n\t" \
|
||||
|
@ -8,16 +8,15 @@
|
||||
gen := arch/$(ARCH)/include/generated
|
||||
kapi := $(gen)/asm
|
||||
uapi := $(gen)/uapi/asm
|
||||
syshdr := $(srctree)/$(src)/syscallhdr.sh
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
sysnr := $(srctree)/$(src)/syscallnr.sh
|
||||
systbl := $(srctree)/$(src)/syscalltbl.sh
|
||||
systbl := $(srctree)/scripts/syscalltbl.sh
|
||||
syscall := $(src)/syscall.tbl
|
||||
|
||||
gen-y := $(gen)/calls-oabi.S
|
||||
gen-y += $(gen)/calls-eabi.S
|
||||
kapi-hdrs-y := $(kapi)/unistd-nr.h
|
||||
kapi-hdrs-y += $(kapi)/mach-types.h
|
||||
uapi-hdrs-y := $(uapi)/unistd-common.h
|
||||
uapi-hdrs-y += $(uapi)/unistd-oabi.h
|
||||
uapi-hdrs-y += $(uapi)/unistd-eabi.h
|
||||
|
||||
@ -41,28 +40,21 @@ $(kapi)/mach-types.h: $(src)/gen-mach-types $(src)/mach-types FORCE
|
||||
$(call if_changed,gen_mach)
|
||||
|
||||
quiet_cmd_syshdr = SYSHDR $@
|
||||
cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' '$<' '$@' \
|
||||
'$(syshdr_abi_$(basetarget))' \
|
||||
'$(syshdr_pfx_$(basetarget))' \
|
||||
'__NR_SYSCALL_BASE'
|
||||
cmd_syshdr = $(CONFIG_SHELL) $(syshdr) --abis $(abis) \
|
||||
--offset __NR_SYSCALL_BASE $< $@
|
||||
|
||||
quiet_cmd_systbl = SYSTBL $@
|
||||
cmd_systbl = $(CONFIG_SHELL) '$(systbl)' '$<' '$@' \
|
||||
'$(systbl_abi_$(basetarget))'
|
||||
cmd_systbl = $(CONFIG_SHELL) $(systbl) --abis $(abis) $< $@
|
||||
|
||||
quiet_cmd_sysnr = SYSNR $@
|
||||
cmd_sysnr = $(CONFIG_SHELL) '$(sysnr)' '$<' '$@' \
|
||||
'$(syshdr_abi_$(basetarget))'
|
||||
|
||||
syshdr_abi_unistd-common := common
|
||||
$(uapi)/unistd-common.h: $(syscall) $(syshdr) FORCE
|
||||
$(call if_changed,syshdr)
|
||||
|
||||
syshdr_abi_unistd-oabi := oabi
|
||||
$(uapi)/unistd-oabi.h: abis := common,oabi
|
||||
$(uapi)/unistd-oabi.h: $(syscall) $(syshdr) FORCE
|
||||
$(call if_changed,syshdr)
|
||||
|
||||
syshdr_abi_unistd-eabi := eabi
|
||||
$(uapi)/unistd-eabi.h: abis := common,eabi
|
||||
$(uapi)/unistd-eabi.h: $(syscall) $(syshdr) FORCE
|
||||
$(call if_changed,syshdr)
|
||||
|
||||
@ -70,10 +62,10 @@ sysnr_abi_unistd-nr := common,oabi,eabi,compat
|
||||
$(kapi)/unistd-nr.h: $(syscall) $(sysnr) FORCE
|
||||
$(call if_changed,sysnr)
|
||||
|
||||
systbl_abi_calls-oabi := common,oabi
|
||||
$(gen)/calls-oabi.S: abis := common,oabi
|
||||
$(gen)/calls-oabi.S: $(syscall) $(systbl) FORCE
|
||||
$(call if_changed,systbl)
|
||||
|
||||
systbl_abi_calls-eabi := common,eabi
|
||||
$(gen)/calls-eabi.S: abis := common,eabi
|
||||
$(gen)/calls-eabi.S: $(syscall) $(systbl) FORCE
|
||||
$(call if_changed,systbl)
|
||||
|
@ -1,31 +0,0 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
in="$1"
|
||||
out="$2"
|
||||
my_abis=`echo "($3)" | tr ',' '|'`
|
||||
prefix="$4"
|
||||
offset="$5"
|
||||
|
||||
fileguard=_ASM_ARM_`basename "$out" | sed \
|
||||
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
|
||||
-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g'`
|
||||
if echo $out | grep -q uapi; then
|
||||
fileguard="_UAPI$fileguard"
|
||||
fi
|
||||
grep -E "^[0-9A-Fa-fXx]+[[:space:]]+${my_abis}" "$in" | sort -n | (
|
||||
echo "#ifndef ${fileguard}"
|
||||
echo "#define ${fileguard} 1"
|
||||
echo ""
|
||||
|
||||
while read nr abi name entry ; do
|
||||
if [ -z "$offset" ]; then
|
||||
echo "#define __NR_${prefix}${name} $nr"
|
||||
else
|
||||
echo "#define __NR_${prefix}${name} ($offset + $nr)"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "#endif /* ${fileguard} */"
|
||||
) > "$out"
|
@ -1,22 +0,0 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
in="$1"
|
||||
out="$2"
|
||||
my_abis=`echo "($3)" | tr ',' '|'`
|
||||
|
||||
grep -E "^[0-9A-Fa-fXx]+[[:space:]]+${my_abis}" "$in" | sort -n | (
|
||||
while read nr abi name entry compat; do
|
||||
if [ "$abi" = "eabi" -a -n "$compat" ]; then
|
||||
echo "$in: error: a compat entry for an EABI syscall ($name) makes no sense" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -n "$entry" ]; then
|
||||
if [ -z "$compat" ]; then
|
||||
echo "NATIVE($nr, $entry)"
|
||||
else
|
||||
echo "COMPAT($nr, $entry, $compat)"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
) > "$out"
|
Loading…
Reference in New Issue
Block a user