[PATCHv3 0/3] Handle SETEND for AArch32 tasks
Suzuki K. Poulose
suzuki.poulose at arm.com
Wed Jan 21 04:43:08 PST 2015
From: "Suzuki K. Poulose" <suzuki.poulose at arm.com>
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 <stdio.h>
#include <signal.h>
#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
More information about the linux-arm-kernel
mailing list