env: use writev to add the newline

this allows us to print each line in a single, atomic write call,
without modifying or buffering it.
This commit is contained in:
magical 2023-04-23 15:21:38 -07:00
parent e20f0c4b1e
commit 84ce44330c

17
env.s
View File

@ -27,10 +27,18 @@ _start:
sll t0, s0, 3 # argc*8 sll t0, s0, 3 # argc*8
add s1, s1, t0 add s1, s1, t0
# allocate space for an iovec
addi sp, sp, -(8+8)*2
la t0, newline
sd t0, 16(sp)
li t1, 1
sd t1, 24(sp)
loop: loop:
# check for null pointer, which signals the end of envp # check for null pointer, which signals the end of envp
ld a1, 0(s1) ld a1, 0(s1)
beqz a1, end beqz a1, end
sd a1, 0(sp)
# compute length of string # compute length of string
mv t1, a1 mv t1, a1
@ -39,7 +47,9 @@ loop:
addi t1, t1, 1 addi t1, t1, 1
bnez t0, strlen bnez t0, strlen
sub a2, t1, a1 sub a2, t1, a1
sd a2, 8(sp)
/*
# print string # print string
li a7, 64 li a7, 64
li a0, 1 li a0, 1
@ -53,6 +63,13 @@ loop:
la a1, newline la a1, newline
li a2, 1 li a2, 1
ecall ecall
*/
li a7, 66 # sys_writev
li a0, 1
mv a1, sp
li a2, 2
ecall
bltz a0, write_error
# increment envp and loop # increment envp and loop
addi s1, s1, 8 addi s1, s1, 8