From a80c682d18d1f9da15cc5e28249194efc8e6afea Mon Sep 17 00:00:00 2001 From: kitty Date: Thu, 5 Mar 2026 00:38:19 +1100 Subject: move back to brk'd memory someone on the uiua discord told me about mprotect. it worked! --- jefs.fs | 1 - jefs.s | 33 +++++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/jefs.fs b/jefs.fs index 45804c7..1d6d83b 100644 --- a/jefs.fs +++ b/jefs.fs @@ -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 diff --git a/jefs.s b/jefs.s index 4050289..b58c691 100644 --- a/jefs.s +++ b/jefs.s @@ -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 -- cgit v1.2.3