boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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