ref: 00e6f81a080c81828854db16160d8b58a5cd8ca9
parent: 83906bfb6b2102104cb242ad578caa994785f72f
author: 9ferno <[email protected]>
date: Tue Dec 14 16:42:56 EST 2021
check that the addresses are within UP and UPE
--- a/os/pc64/bindings.s
+++ b/os/pc64/bindings.s
@@ -88,31 +88,41 @@
STOREFORTH;
TEXT fthopen(SB), 1, $24 /* ( mode cstr -- fd ) */
- PUSHQ UP
+ MOVQ UP, 16(SP)
F_TO_C_2
CALL kopen(SB)
- POPQ UP
+ MOVQ 16(SP), UP
C_TO_F_1
NEXT
TEXT fthclose(SB), 1, $16 /* ( fd -- n ) */
- PUSHQ UP
+ MOVQ UP, 8(SP)
F_TO_C_1
CALL kclose(SB)
- POPQ UP
+ MOVQ 24(SP), UP
C_TO_F_1
NEXT
TEXT fthread(SB), 1, $32 /* ( n a fd -- n2 ) */
- MOVQ (PSP), CX /* address = start of heap + address */
- ADDQ UP, CX
- MOVQ CX, (PSP)
- PUSHQ UP
+ MOVQ(PSP), CX
+ PUSH(TOP)
+ MOVQ CX, TOP /* ( n a fd -- n a fd a ) */
+ CALL inup(SB)
+ MOVQ TOP, CX
+ POP(TOP)
+ CMPQ CX, $0
+ JNE invalidaddress
+
+ MOVQ UP, 24(SP)
F_TO_C_3
CALL kread(SB)
- POPQ UP
+ MOVQ 24(SP), UP
C_TO_F_1
NEXT
+invalidaddress:
+ ADDQ $16, PSP
+ MOVQ $-1, TOP
+ NEXT
/* no link register in amd64
* 3 arguments for kwrite = 24 bytes
@@ -119,10 +129,16 @@
* 1 local for storing UP = 8 bytes
* Hence, need 32 bytes on the stack
*/
-TEXT fthwrite(SB), 1, $32 /* ( n a fd -- n2 ) */
- MOVQ (PSP), CX /* address = start of heap + address */
- ADDQ UP, CX
- MOVQ CX, (PSP)
+TEXT fthwrite(SB), 1, $32 /* ( n a fd -- n2|-1 ) */
+ MOVQ(PSP), CX
+ PUSH(TOP)
+ MOVQ CX, TOP /* ( n a fd -- n a fd a ) */
+ CALL inup(SB)
+ MOVQ TOP, CX
+ POP(TOP)
+ CMPQ CX, $0
+ JNE invalidaddress
+
MOVQ UP, 24(SP)
F_TO_C_3
CALL kwrite(SB)
@@ -131,9 +147,9 @@
NEXT
TEXT fthseek(SB), 1, $32 /* ( type pos fd -- n ) */
- PUSHQ UP
+ MOVQ UP, 24(SP)
F_TO_C_3
CALL kseek(SB)
- POPQ UP
+ MOVQ 24(SP), UP
C_TO_F_1
NEXT
--- a/os/pc64/forth.s
+++ b/os/pc64/forth.s
@@ -141,6 +141,33 @@
NEXT
+/*
+callable by UP using forth macro entries to check address
+ ( a -- -1|0|1 )
+ argument 1 in TOP = address
+ return value in TOP
+ -1 0 1
+ if UP < address < UPE
+ return 0 within range
+ else if address < UP
+ return -1 below UP
+ else if UPE < address
+ return 1 above UP
+ */
+TEXT inup(SB), 1, $-4
+ CMPQ TOP, UPE
+ JGT aboveupe
+ CMPQ TOP, UP
+ JLT belowup
+ MOVQ $0, TOP
+ RET
+belowup:
+ MOVQ $-1, TOP
+ RET
+aboveupe:
+ MOVQ $1, TOP
+ RET
+
TEXT reset(SB), 1, $-4
MOVQ UP, RSP
ADDQ $RSTACK_END, RSP