code wiki / (root) / nx_emu_armv7a.nx

nx_emu_armv7a.nx

buildroot/runtime/nx_emu_armv7a.nx

7089 B134 linesdepth 3pulls 3 transitivereach 0 importersview sourcekind orphan librarytopic emu
docsdependenciesstructsconstsfunctions

about

nx_emu_armv7a.nx -- sovereign ARMv7-A (32-bit ARM) interpreter (NX-EMU). Little-endian, fixed 32-bit instrs, 16 GPRs + C flag (for i64-pair add/sub carry). Decodes the subset nxc2's armv7a backend emits: DP add/adc/sub/sbc/adds/subs/mov (reg+rotated-imm), movw, mla, umull, ldr/str (imm offset, U-bit sign), push/pop (STMDB/LDMIA sp!), bx, bl (ARM pc+8 pipeline), svc. Linux EABI: svc, r7=num, args r0.., exit=1 (code in r0). NO qemu. license_tier: ORIGINAL

dependencies 1 imports · 0 importers

nx_syscalls_x86_64.nx nx_emu_armv7a.nx

imports: nx_syscalls_x86_64.nx

imported by: nobody (leaf or entry point)

structs

none

consts

9const A7_GUEST: i64 = 16777216
10const A7_MASK: i64 = 0xFFFFFFFF
11const A7_SYS_EXIT: i64 = 1

functions

13func a7_ld(mem: *u8, va: i64, width: i64) -> i64 { var v: i64 = 0; var i: i64 = 0; while i < width { v = v | ((mem[va + i] & 0xff) << (i * 8)); i = i + 1 } return v }
called by 1: emu_armv7a_run_mem
14func a7_st(mem: *u8, va: i64, width: i64, val: i64) -> i64 { var i: i64 = 0; while i < width { mem[va + i] = (val >> (i * 8)) & 0xff; i = i + 1 } return 0 }
called by 1: emu_armv7a_run_mem
15func a7_sx(v: i64, bits: i64) -> i64 { let m: i64 = 1 << (bits - 1); if (v & m) != 0 { return v - (1 << bits) } return v }
called by 1: emu_armv7a_run_mem
16func a7_ror(v: i64, n: i64) -> i64 { if n == 0 { return v & A7_MASK } return ((v >> n) | (v << (32 - n))) & A7_MASK }
called by 1: emu_armv7a_run_mem
17func a7_pop(list: i64) -> i64 { var c: i64 = 0; var i: i64 = 0; while i < 16 { if (list & (1 << i)) != 0 { c = c + 1 } i = i + 1 } return c }
called by 1: emu_armv7a_run_mem
19func emu_armv7a_run_mem(mem: *u8, mem_size: i64, entry: i64, sp0: i64) -> i64
129func emu_armv7a_run(code: *u8, code_len: i64) -> i64