diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-05-21 21:21:26 +0200 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-05-21 21:21:26 +0200 |
| commit | 4b927bc37359dec23f67d3427fc982945f24f404 (patch) | |
| tree | 245449ef9146942dc7fffd0235b48b7e70a00bf2 /gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml | |
| parent | aa8bd79cec7bf6790ddb01d156c2ef2201abbaab (diff) | |
| download | emulator-bug-study-4b927bc37359dec23f67d3427fc982945f24f404.tar.gz emulator-bug-study-4b927bc37359dec23f67d3427fc982945f24f404.zip | |
add gitlab issues in toml format
Diffstat (limited to 'gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml')
| -rw-r--r-- | gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml b/gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml new file mode 100644 index 00000000..1c9d1cce --- /dev/null +++ b/gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml @@ -0,0 +1,98 @@ +id = 1499 +title = "qemu-system-arm doesn't honour CPACR.ASEDIS, D32DIS" +state = "opened" +created_at = "2023-02-21T02:44:11.168Z" +closed_at = "n/a" +labels = ["accel: TCG", "target: arm"] +url = "https://gitlab.com/qemu-project/qemu/-/issues/1499" +host-os = "Ubuntu 20.04" +host-arch = "x86" +qemu-version = "7.2.0" +guest-os = "-" +guest-arch = "cortex-a7" +description = """We used differential testing to compared the instruction consistency (ARMv7) between QEMU and raspberry pi 2B in system level and some inconsistency in SIMD instruction was detected. + +We compiled the kernel with options `-mcpu=cortex-a7 -march=armv7ve -mfloat-abi=hard -mfpu=vfpv4 `. Some SIMD instructions are considered as **undefined** instructions in raspi2b, but run successfully in the QEMU. + +We checked that the CPACR.ASEDIS=1, which disables Advanced SIMD functionality, according to ARMv7-a manual B4.1.40. The manual says "All instruction encodings identified in the Alphabetical list of instructions on page A8-300 as being Advanced SIMD instructions, but that are not VFPv3 or VFPv4 +instructions, are UNDEFINED when accessed from PL1 and PL0 modes." + +Tested instruction samples are shown as follows: + +- VMAX_int_T1A1_A 11110010010010110000011010100100 0xf24b06a4 +- VMUL_scalar_A1_A 11110010101001001100100 001000011 0xf2a4c843 +- VADD_int_T1A1_A 11110010000111111010100000001100 0xf21fa80c + +... + +Some checks of the SIMD instructions may be needed before the execution of the instructions in function ` do_3same` etc. in target/arm/translate-neon.c.""" +reproduce = """1. Compile a kernel module to run the test instruction in PL1. +2. Hook a undefined handler in kernel module to catch the undefined instructions. A kernel module template we used to test is as follows + +```c +#include <linux/module.h> +#include <linux/kernel.h> +#include <asm/traps.h> + +MODULE_LICENSE("GPL"); +#pragma GCC optimize ("O0") +// instr is undefined instruction value +static int undef_instr_handler(struct pt_regs *regs, u32 instr) +{ + printk(KERN_INFO "get undefined instruction\\n"); + // Just skip over to the next instruction. + regs->ARM_pc += 4; + return 0; // All fine! +} + +static struct undef_hook uh = { + .instr_mask = 0x0, // any instruction + .instr_val = 0x0, // any instruction + .cpsr_mask = 0x0, // any pstate + .cpsr_val = 0x0, // any pstate + .fn = undef_instr_handler +}; +int init_module(void) { + // Lookup wanted symbols. + register_undef_hook(&uh); + __asm__ __volatile__("push {R0-R12}"); + __asm__ __volatile__( + ".global inialize_location\\n" + "inialize_location:\\n" + "mov r0, %[reg_init] \\n" + "mov r1, %[reg_init] \\n" + "mov r2, %[reg_init] \\n" + "mov r3, %[reg_init] \\n" + "mov r4, %[reg_init] \\n" + "mov r5, %[reg_init] \\n" + "mov r6, %[reg_init] \\n" + "mov r7, %[reg_init] \\n" + "mov r8, %[reg_init] \\n" + "mov r9, %[reg_init] \\n" + "mov r10, %[reg_init] \\n" + "mov r11, %[reg_init] \\n" + "mov r12, %[reg_init] \\n" + : + : [reg_init] "n"(0) + ); + // =======TODO======= + // replace nop with test instruction + __asm__ __volatile__( + ".global inst_location\\n" + "inst_location:\\n" + "nop\\n" + ); + // kgdb_breakpoint(); + __asm__ __volatile__( + ".global finish_location\\n" + "finish_location:\\n" + ); + __asm__ __volatile__("pop {R0-R12}"); + return 0; +} + +void cleanup_module(void) { + unregister_undef_hook(&uh); +} +```""" +additional = """""" |
