summaryrefslogtreecommitdiffstats
path: root/gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml
diff options
context:
space:
mode:
authorChristian Krinitsin <mail@krinitsin.com>2025-05-21 21:21:26 +0200
committerChristian Krinitsin <mail@krinitsin.com>2025-05-21 21:21:26 +0200
commit4b927bc37359dec23f67d3427fc982945f24f404 (patch)
tree245449ef9146942dc7fffd0235b48b7e70a00bf2 /gitlab/issues/target_arm/host_missing/accel_TCG/1499.toml
parentaa8bd79cec7bf6790ddb01d156c2ef2201abbaab (diff)
downloademulator-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.toml98
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 = """"""