diff options
| author | kitty <nepeta@canaglie.net> | 2026-03-05 00:38:19 +1100 |
|---|---|---|
| committer | kitty <nepeta@canaglie.net> | 2026-03-05 00:38:19 +1100 |
| commit | a80c682d18d1f9da15cc5e28249194efc8e6afea (patch) | |
| tree | 598dd0980ed6191a6c7263500a93516c762530bb | |
| parent | dd614d161f3e139d798f3d7a33a3e8abce9db48f (diff) | |
move back to brk'd memory
someone on the uiua discord told me about mprotect. it worked!
| -rw-r--r-- | jefs.fs | 1 | ||||
| -rw-r--r-- | jefs.s | 33 |
2 files changed, 29 insertions, 5 deletions
@@ -1,7 +1,6 @@ \ i think something is going on with the stack. i dunno \ things TODO: \ standardise stack comment abbrs (i like leo brodie's forth_style.txt) -\ go back to brked user mem area (with mprotect) (someone in the uiua discord suggested it \ DO LOOP \ s\" \ add error handling to compiling words @@ -81,6 +81,7 @@ ;; syscall %assign __NR_read 0 %assign __NR_write 1 +%assign __NR_mprotect 10 %assign __NR_brk 12 %assign __NR_exit 60 ;; }}} @@ -100,11 +101,36 @@ _start: mov r14, wstack ; point SP to top mov qword [rs0], rsp + call zero_here + call interpret mov rdi, 0 mov rax, __NR_exit syscall +; i could separate this but i wanna have do in forth. euj +defword "0here", zero_here, 0 + ; get current brk + xor rdi, rdi + mov rax, __NR_brk + syscall + mov qword [here], rax + mov qword [herestart], rax + + ; expand it to 640k + add rax, 0x9c400 + mov rdi, rax + mov rax, __NR_brk + syscall + mov qword [heremax], rax + + mov rdx, 0x7 ; PROT_EXEC | PROT_READ | PROT_WRITE + mov rsi, 0x9c400 + mov rdi, qword [here] + mov rax, __NR_mprotect + syscall + ret + defword "bye", bye, 0 mov rdi, 0 mov rax, __NR_exit @@ -1177,14 +1203,13 @@ defvar "tib", tib, 0, initfile defvar "#tib", num_tib, 0, initlen defvar ">in", to_in, 0, 0 defvar "state", state, 0, interpreting -defvar "here", here, 0, umem +defvar "here", here, 0, 0 defvar "s0", s0, 0, wstack -defvar "herestart", herestart, 0, umem ; beginning of user memory area +defvar "herestart", herestart, 0, 0 defvar "rs0", rs0, 0, 0 -defvar "heremax", heremax, 0, umem_e ; ending of user memory area +defvar "heremax", heremax, 0, 0 ; ending of user memory area defvar "base", base, 0, 10 defvar "error", error, 0, 0 -; defvar "handler", handler, 0, brac_handler defvalue "handler", handler, 0, brac_handler defvar "latest", latest, 0, lfa_latest |
