014-sys_calls.P1pp (2537B)
1 # tests/p1/sys_calls.P1 — exercise the sys_brk/sys_lseek/sys_unlink wrappers 2 # added to P1pp.P1pp alongside sys_open/sys_read/sys_write/sys_close. 3 # 4 # Sequence: 5 # 1. sys_brk(0) — fetch current break; succeed if > 0. 6 # 2. sys_open(/tmp/...) — create+truncate, write "X", close. 7 # 3. reopen RDONLY — sys_lseek(0, SEEK_SET) then sys_read 1 byte; 8 # verify the byte is 'X'; close. 9 # 4. sys_unlink — remove the temp file. 10 # Each successful step prints one byte ("B", "L", "U") so the .expected 11 # is a fixed `BLU` line. 12 13 :p1_main 14 %enter(0) 15 16 # --- sys_brk ----------------------------------------------------------- 17 %li(a0, 0) 18 %call(&sys_brk) 19 %bltz(a0, &.fail) 20 %beqz(a0, &.fail) 21 %la(a0, &b_msg) 22 %li(a1, 1) 23 %call(&write_stdout) 24 %bltz(a0, &.fail) 25 26 # --- create + write "X" ------------------------------------------------ 27 %la(a0, &fname) 28 %li(a1, 577) # O_WRONLY|O_CREAT|O_TRUNC 29 %li(a2, 0644) 30 %call(&sys_open) 31 %bltz(a0, &.fail) 32 %mov(s0, a0) # save fd 33 34 %mov(a0, s0) 35 %la(a1, &payload) 36 %li(a2, 1) 37 %call(&sys_write) 38 %bltz(a0, &.fail) 39 40 %mov(a0, s0) 41 %call(&sys_close) 42 %bltz(a0, &.fail) 43 44 # --- reopen, lseek, read, verify, close -------------------------------- 45 %la(a0, &fname) 46 %li(a1, 0) # O_RDONLY 47 %li(a2, 0) 48 %call(&sys_open) 49 %bltz(a0, &.fail) 50 %mov(s0, a0) 51 52 %mov(a0, s0) 53 %li(a1, 0) 54 %li(a2, 0) # SEEK_SET 55 %call(&sys_lseek) 56 %bltz(a0, &.fail) 57 58 %mov(a0, s0) 59 %la(a1, &readbuf) 60 %li(a2, 1) 61 %call(&sys_read) 62 %bltz(a0, &.fail) 63 64 %mov(a0, s0) 65 %call(&sys_close) 66 %bltz(a0, &.fail) 67 68 %la(s1, &readbuf) 69 %lb(s1, s1, 0) 70 %li(t0, 88) # 'X' 71 %bne(s1, t0, &.fail) 72 73 %la(a0, &l_msg) 74 %li(a1, 1) 75 %call(&write_stdout) 76 %bltz(a0, &.fail) 77 78 # --- sys_unlink -------------------------------------------------------- 79 %la(a0, &fname) 80 %call(&sys_unlink) 81 %bltz(a0, &.fail) 82 83 %la(a0, &u_msg) 84 %li(a1, 2) 85 %call(&write_stdout) 86 %bltz(a0, &.fail) 87 88 %li(a0, 0) 89 %eret 90 91 :.fail 92 %li(a0, 1) 93 %eret 94 95 # write_stdout(buf=a0, len=a1) -> n_or_err (a0). Single-shot syscall. 96 :write_stdout 97 %enter(0) 98 %mov(a3, a1) 99 %mov(a2, a0) 100 %li(a1, 1) 101 %li(a0, %sys_write) 102 %syscall 103 %eret 104 105 :fname 106 "/tmp/p1-sys-calls.tmp" 107 %(0) 108 109 :payload 110 "X" 111 112 :b_msg 113 "B" 114 115 :l_msg 116 "L" 117 118 :u_msg 119 "U 120 " 121 122 :readbuf 123 %(0) 124 125 :ELF_end