summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jefs.fs1
-rw-r--r--jefs.s33
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