.section .text.user_syscall,"ax" .balign 4 .global __syscall_blob_start __syscall_blob_start: // x7: ABI version, x8: call number, x0..x5: arguments, x0: result. mov x7, #1 mov x8, #0 svc #0x42 cmp x0, #1 b.ne .Lsyscall_fail mov x0, #1 mov x1, #2 mov x2, #3 mov x3, #4 mov x4, #5 mov x5, #6 mov x8, #1 svc #0x42 cmp x0, #21 b.ne .Lsyscall_fail cmp x1, #2 b.ne .Lsyscall_fail cmp x2, #3 b.ne .Lsyscall_fail cmp x3, #4 b.ne .Lsyscall_fail cmp x4, #5 b.ne .Lsyscall_fail cmp x5, #6 b.ne .Lsyscall_fail mov x8, #0x7fff svc #0x42 movn x9, #37 cmp x0, x9 b.ne .Lsyscall_fail mov x7, #2 mov x8, #0 svc #0x42 movn x9, #21 cmp x0, x9 b.ne .Lsyscall_fail .if {copy_test} // Read four bytes from the live EL0 data page, then let EL1 copy four // known bytes back. Every negative path must return without a partial // load/store or a fatal exception in the kernel. mov x7, #1 movz x10, #0x1000 movk x10, #0x8000, lsl #16 movz x9, #0x4241 movk x9, #0x4443, lsl #16 str w9, [x10] mov x0, x10 mov x1, #4 mov x8, #3 svc #0x42 cmp x0, #4 b.ne .Lsyscall_fail add x0, x10, #16 mov x1, #4 mov x8, #4 svc #0x42 cmp x0, #4 b.ne .Lsyscall_fail ldr w9, [x10, #16] movz x11, #0x5857 movk x11, #0x5a59, lsl #16 cmp x9, x11 b.ne .Lsyscall_fail movn x0, #0 mov x1, #0 mov x8, #3 svc #0x42 cbnz x0, .Lsyscall_fail movn x0, #1 mov x1, #4 mov x8, #3 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail add x0, x10, #4094 mov x1, #4 mov x8, #4 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail ldrh w9, [x10, #4094] cbnz w9, .Lsyscall_fail movz x0, #0 movk x0, #0x8000, lsl #16 mov x1, #4 mov x8, #4 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail add x0, x10, #4096 mov x1, #4 mov x8, #3 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail // K272: one fully validated printable buffer is emitted. Invalid guard // and control-byte requests return errors without a user-text record. mov x0, x10 mov x1, #4 mov x8, #5 svc #0x42 cmp x0, #4 b.ne .Lsyscall_fail add x0, x10, #4096 mov x1, #4 mov x8, #5 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail movz x9, #0x0a41 strh w9, [x10, #32] add x0, x10, #32 mov x1, #2 mov x8, #5 svc #0x42 movn x9, #21 cmp x0, x9 b.ne .Lsyscall_fail .endif .if {clock_test} // Three real EL0 reads across distinct SVC/ERET pairs. x19 is the // previous returned tick and must survive every exception frame. mov x19, #0 mov x7, #1 mov x8, #7 svc #0x42 cmp x0, x19 b.lo .Lsyscall_fail mov x19, x0 mov x8, #7 svc #0x42 cmp x0, x19 b.lo .Lsyscall_fail mov x19, x0 mov x8, #7 svc #0x42 cmp x0, x19 b.lo .Lsyscall_fail .endif .if {mmio_test} // Opaque device IDs only. No EL0 physical address or mapped pointer is // returned; every unprivileged request must receive EPERM. mov x7, #1 mov x1, #0 mov x2, #0 mov x3, #0 mov x4, #0 mov x5, #0 mov x8, #11 mov x0, #1 svc #0x42 movn x9, #0 cmp x0, x9 b.ne .Lsyscall_fail mov x8, #11 mov x0, #2 svc #0x42 movn x9, #0 cmp x0, x9 b.ne .Lsyscall_fail mov x8, #11 mov x0, #0xffff svc #0x42 movn x9, #0 cmp x0, x9 b.ne .Lsyscall_fail .endif .if {ipc_test} // K312/K313: EL0 supplies bytes, EL1 takes an owned snapshot. Later // mutation and three rejected ranges must not alter channel state. mov x7, #1 movz x10, #0x1000 movk x10, #0x8000, lsl #16 movz x9, #0x4241 movk x9, #0x4443, lsl #16 str w9, [x10] mov x0, x10 mov x1, #4 mov x8, #12 svc #0x42 cmp x0, #1 b.ne .Lsyscall_fail movz x9, #0x5857 movk x9, #0x5a59, lsl #16 str w9, [x10] mov x8, #13 svc #0x42 cmp x0, #4 b.ne .Lsyscall_fail add x0, x10, #4094 mov x1, #4 mov x8, #12 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail mov x8, #13 svc #0x42 cbnz x0, .Lsyscall_fail movn x0, #1 mov x1, #4 mov x8, #12 svc #0x42 movn x9, #13 cmp x0, x9 b.ne .Lsyscall_fail mov x8, #13 svc #0x42 cbnz x0, .Lsyscall_fail mov x0, x10 mov x1, #33 mov x8, #12 svc #0x42 movn x9, #21 cmp x0, x9 b.ne .Lsyscall_fail mov x8, #13 svc #0x42 cbnz x0, .Lsyscall_fail .endif mov x7, #1 mov x8, #2 mov x0, #0 svc #0x42 .Lsyscall_fail: brk #0xbad b .Lsyscall_fail .global __syscall_blob_end __syscall_blob_end: