From mboxrd@z Thu Jan 1 00:00:00 1970 From: suzuki.poulose@arm.com (Suzuki K. Poulose) Date: Wed, 21 Jan 2015 12:43:08 +0000 Subject: [PATCHv3 0/3] Handle SETEND for AArch32 tasks Message-ID: <1421844191-9263-1-git-send-email-suzuki.poulose@arm.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: "Suzuki K. Poulose" This series add support for controlling the 'setend' instruction, which is deprecated in ARMv8, using the legacy instruction emulation framework, introduced by Punit Agrawal. Changes since V2: - Move ID_AA64MMFR0_EL1 bit definitions to asm/cputype.h - Use mask/value pair for the features in ID_AA64MMFR0_EL1 - Better documentation about the hardware support limitaion under Documentation and the Kconfig help - Restore the original 'set_hw_mode' API, with wrappers to invoke the set_hw_mode for on_each_cpu() variants. - Print a warning when we detect an incompatibility for a registered insn_emulation hook on a hotplugged CPU. Changes since V1: - Added a patch to keep track of the mixed endian support and register the setend emulation only if all the active CPUs supports mixed endian. - Fail hotplug operation if the CPU doesn't support a feature required by insn_emulation. - Signal handler runs in native endian Testing : $ cat setend_sig.c #include #include #define setend_be(a) asm __volatile__ ( "setend be" ::: "memory" ) #define setend_le(a) asm __volatile__ ( "setend le" ::: "memory" ) volatile int flag = 1; void sigint(int sig) { printf("in sighandler %d\n", sig); flag = 0; return; } main() { volatile int a = 0x0; (void)signal(SIGINT, sigint); printf("Press Ctrl+C to continue\n"); setend_be(); a ++; while (flag); setend_le(); a ++; printf("a: 0x%x\n", a); return 0; } $ cat /proc/sys/abi/setend 1 $ echo 1 > /sys/kernel/debug/tracing/events/emulation/instruction_emulation/enable $ echo 1 > /sys/kernel/debug/tracing/tracing_on $ ./setend_sig_a32 Press Ctrl+C to continue ^Cin sighandler 2 a: 0x1000001 $ cat /sys/kernel/debug/tracing/trace # tracer: nop # # entries-in-buffer/entries-written: 2/2 #P:2 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | setend_sig_a32-1373 [000] ...1 491.554499: instruction_emulation: instr="setend be" addr=0x8460 setend_sig_a32-1373 [000] ...1 492.833056: instruction_emulation: instr="setend le" addr=0x8488 $ dmesg | tail [ 491.554807] "setend_sig_a32" (1373) uses deprecated setend instruction at 0x8460 [ 492.833285] "setend_sig_a32" (1373) uses deprecated setend instruction at 0x8488 $ echo 2 > /proc/sys/abi/setend $ ./setend_sig_t16 Press Ctrl+C to continue ^Cin sighandler 2 a: 0x1000001 $ dmesg | tail [ 491.554807] "setend_sig_a32" (1373) uses deprecated setend instruction at 0x8460 [ 492.833285] "setend_sig_a32" (1373) uses deprecated setend instruction at 0x8488 [ 537.426216] Removed setend emulation handler [ 537.426624] Enabled setend support Suzuki K. Poulose (3): arm64: Track system support for mixed endian EL0 arm64: Consolidate hotplug notifier for instruction emulation arm64: Emulate SETEND for AArch32 tasks Documentation/arm64/legacy_instructions.txt | 12 ++ arch/arm64/Kconfig | 15 ++ arch/arm64/include/asm/cpufeature.h | 2 + arch/arm64/include/asm/cputype.h | 17 +++ arch/arm64/include/asm/ptrace.h | 7 + arch/arm64/kernel/armv8_deprecated.c | 205 ++++++++++++++++++++------- arch/arm64/kernel/cpuinfo.c | 22 +++ arch/arm64/kernel/signal32.c | 5 +- 8 files changed, 236 insertions(+), 49 deletions(-) -- 1.7.9.5