From 430a05dcea92d6a0148a1437246ebff69a8f1333 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 5 Apr 2010 19:06:51 -0400 Subject: [PATCH] Store stack bounds in TIB on win64 to make C++ exceptions work --- Nmakefile | 2 +- basis/cpu/x86/32/bootstrap.factor | 3 -- basis/cpu/x86/32/unix/bootstrap.factor | 14 +++----- basis/cpu/x86/32/winnt/bootstrap.factor | 46 ++++++++----------------- basis/cpu/x86/64/bootstrap.factor | 12 ++----- basis/cpu/x86/64/unix/bootstrap.factor | 5 +-- basis/cpu/x86/64/winnt/bootstrap.factor | 13 +++++-- basis/cpu/x86/unix/bootstrap.factor | 13 +++++++ basis/cpu/x86/winnt/bootstrap.factor | 32 +++++++++++++++++ 9 files changed, 81 insertions(+), 59 deletions(-) create mode 100644 basis/cpu/x86/unix/bootstrap.factor create mode 100644 basis/cpu/x86/winnt/bootstrap.factor diff --git a/Nmakefile b/Nmakefile index dc28e1884c..02d2b5f1ed 100755 --- a/Nmakefile +++ b/Nmakefile @@ -1,5 +1,5 @@ !IF DEFINED(DEBUG) -LINK_FLAGS = /nologo /DEBUG shell32.lib +LINK_FLAGS = /nologo /safeseh /DEBUG shell32.lib CL_FLAGS = /nologo /Zi /O2 /W3 /DFACTOR_DEBUG !ELSE LINK_FLAGS = /nologo /safeseh shell32.lib diff --git a/basis/cpu/x86/32/bootstrap.factor b/basis/cpu/x86/32/bootstrap.factor index 9b1a1de23d..b2cd241df1 100644 --- a/basis/cpu/x86/32/bootstrap.factor +++ b/basis/cpu/x86/32/bootstrap.factor @@ -330,6 +330,3 @@ IN: bootstrap.x86 jit-delete-current-context jit-start-context ] \ (start-context-and-delete) define-sub-primitive - -<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> -call diff --git a/basis/cpu/x86/32/unix/bootstrap.factor b/basis/cpu/x86/32/unix/bootstrap.factor index 1e3bee4961..56d18511e4 100644 --- a/basis/cpu/x86/32/unix/bootstrap.factor +++ b/basis/cpu/x86/32/unix/bootstrap.factor @@ -1,14 +1,8 @@ ! Copyright (C) 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: cpu.x86.assembler cpu.x86.assembler.operands kernel -layouts parser sequences ; +USING: kernel parser sequences ; IN: bootstrap.x86 -: jit-save-tib ( -- ) ; -: jit-restore-tib ( -- ) ; -: jit-update-tib ( ctx-reg -- ) drop ; -: jit-install-seh ( -- ) ESP bootstrap-cell ADD ; -: jit-update-seh ( ctx-reg -- ) drop ; - -<< "vocab:cpu/x86/32/bootstrap.factor" parse-file suffix! >> -call +<< "vocab:cpu/x86/unix/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/32/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> call diff --git a/basis/cpu/x86/32/winnt/bootstrap.factor b/basis/cpu/x86/32/winnt/bootstrap.factor index b8ee1dacaf..5628632e6c 100644 --- a/basis/cpu/x86/32/winnt/bootstrap.factor +++ b/basis/cpu/x86/32/winnt/bootstrap.factor @@ -5,50 +5,32 @@ cpu.x86.assembler cpu.x86.assembler.operands kernel layouts locals parser sequences ; IN: bootstrap.x86 -: tib-exception-list-offset ( -- n ) 0 bootstrap-cells ; -: tib-stack-base-offset ( -- n ) 1 bootstrap-cells ; -: tib-stack-limit-offset ( -- n ) 2 bootstrap-cells ; +: tib-segment ( -- ) FS ; +: tib-temp ( -- reg ) EAX ; -: jit-save-tib ( -- ) - tib-exception-list-offset [] FS PUSH - tib-stack-base-offset [] FS PUSH - tib-stack-limit-offset [] FS PUSH ; - -: jit-restore-tib ( -- ) - tib-stack-limit-offset [] FS POP - tib-stack-base-offset [] FS POP - tib-exception-list-offset [] FS POP ; - -:: jit-update-tib ( ctx-reg -- ) - ! There's a redundant load here because we're not allowed - ! to clobber ctx-reg. Clobbers EAX. - ! Save callstack base in TIB - EAX ctx-reg context-callstack-seg-offset [+] MOV - EAX EAX segment-end-offset [+] MOV - tib-stack-base-offset [] EAX FS MOV - ! Save callstack limit in TIB - EAX ctx-reg context-callstack-seg-offset [+] MOV - EAX EAX segment-start-offset [+] MOV - tib-stack-limit-offset [] EAX FS MOV ; +<< "vocab:cpu/x86/winnt/bootstrap.factor" parse-file suffix! >> call : jit-install-seh ( -- ) ! Create a new exception record and store it in the TIB. + ! Clobbers tib-temp. ! Align stack ESP 3 bootstrap-cells ADD ! Exception handler address filled in by callback.cpp - 0 PUSH rc-absolute-cell rt-exception-handler jit-rel + tib-temp 0 MOV rc-absolute-cell rt-exception-handler jit-rel + tib-temp PUSH ! No next handler 0 PUSH ! This is the new exception handler - tib-exception-list-offset [] ESP FS MOV ; + tib-exception-list-offset [] ESP tib-segment MOV ; :: jit-update-seh ( ctx-reg -- ) ! Load exception record structure that jit-install-seh - ! created from the bottom of the callstack. Clobbers EAX. - EAX ctx-reg context-callstack-bottom-offset [+] MOV - EAX bootstrap-cell ADD + ! created from the bottom of the callstack. + ! Clobbers tib-temp. + tib-temp ctx-reg context-callstack-bottom-offset [+] MOV + tib-temp bootstrap-cell ADD ! Store exception record in TIB. - tib-exception-list-offset [] EAX FS MOV ; + tib-exception-list-offset [] tib-temp tib-segment MOV ; -<< "vocab:cpu/x86/32/bootstrap.factor" parse-file suffix! >> -call +<< "vocab:cpu/x86/32/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> call diff --git a/basis/cpu/x86/64/bootstrap.factor b/basis/cpu/x86/64/bootstrap.factor index 69734df225..68c3d8b702 100644 --- a/basis/cpu/x86/64/bootstrap.factor +++ b/basis/cpu/x86/64/bootstrap.factor @@ -26,11 +26,6 @@ IN: bootstrap.x86 : fixnum>slot@ ( -- ) temp0 1 SAR ; : rex-length ( -- n ) 1 ; -: jit-save-tib ( -- ) ; -: jit-restore-tib ( -- ) ; -: jit-update-tib ( ctx-reg -- ) drop ; -: jit-install-seh ( -- ) stack-reg bootstrap-cell ADD ; - : jit-call ( name -- ) RAX 0 MOV rc-absolute-cell jit-dlsym RAX CALL ; @@ -238,7 +233,9 @@ IN: bootstrap.x86 RSP ctx-reg context-callstack-top-offset [+] MOV ! Load new ds, rs registers - jit-restore-context ; + jit-restore-context + + ctx-reg jit-update-tib ; : jit-pop-context-and-param ( -- ) arg1 ds-reg [] MOV @@ -293,6 +290,3 @@ IN: bootstrap.x86 jit-delete-current-context jit-start-context ] \ (start-context-and-delete) define-sub-primitive - -<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> -call diff --git a/basis/cpu/x86/64/unix/bootstrap.factor b/basis/cpu/x86/64/unix/bootstrap.factor index d19b5306a0..cffb12902c 100644 --- a/basis/cpu/x86/64/unix/bootstrap.factor +++ b/basis/cpu/x86/64/unix/bootstrap.factor @@ -12,5 +12,6 @@ IN: bootstrap.x86 : arg3 ( -- reg ) RDX ; : arg4 ( -- reg ) RCX ; -<< "vocab:cpu/x86/64/bootstrap.factor" parse-file suffix! >> -call +<< "vocab:cpu/x86/unix/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/64/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> call diff --git a/basis/cpu/x86/64/winnt/bootstrap.factor b/basis/cpu/x86/64/winnt/bootstrap.factor index 113a13918f..f816980e57 100644 --- a/basis/cpu/x86/64/winnt/bootstrap.factor +++ b/basis/cpu/x86/64/winnt/bootstrap.factor @@ -5,6 +5,8 @@ vocabs sequences cpu.x86.assembler parser cpu.x86.assembler.operands ; IN: bootstrap.x86 +DEFER: stack-reg + : stack-frame-size ( -- n ) 8 bootstrap-cells ; : nv-regs ( -- seq ) { RBX RSI RDI R12 R13 R14 R15 } ; : arg1 ( -- reg ) RCX ; @@ -12,5 +14,12 @@ IN: bootstrap.x86 : arg3 ( -- reg ) R8 ; : arg4 ( -- reg ) R9 ; -<< "vocab:cpu/x86/64/bootstrap.factor" parse-file suffix! >> -call +: tib-segment ( -- ) GS ; +: tib-temp ( -- reg ) R11 ; + +: jit-install-seh ( -- ) stack-reg bootstrap-cell ADD ; +: jit-update-seh ( ctx-reg -- ) drop ; + +<< "vocab:cpu/x86/winnt/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/64/bootstrap.factor" parse-file suffix! >> call +<< "vocab:cpu/x86/bootstrap.factor" parse-file suffix! >> call diff --git a/basis/cpu/x86/unix/bootstrap.factor b/basis/cpu/x86/unix/bootstrap.factor new file mode 100644 index 0000000000..20dd738ac6 --- /dev/null +++ b/basis/cpu/x86/unix/bootstrap.factor @@ -0,0 +1,13 @@ +! Copyright (C) 2010 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: cpu.x86.assembler cpu.x86.assembler.operands kernel +layouts ; +IN: bootstrap.x86 + +DEFER: stack-reg + +: jit-save-tib ( -- ) ; +: jit-restore-tib ( -- ) ; +: jit-update-tib ( ctx-reg -- ) drop ; +: jit-install-seh ( -- ) stack-reg bootstrap-cell ADD ; +: jit-update-seh ( ctx-reg -- ) drop ; diff --git a/basis/cpu/x86/winnt/bootstrap.factor b/basis/cpu/x86/winnt/bootstrap.factor new file mode 100644 index 0000000000..b81c1eb604 --- /dev/null +++ b/basis/cpu/x86/winnt/bootstrap.factor @@ -0,0 +1,32 @@ +! Copyright (C) 2010 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: bootstrap.image.private compiler.constants +cpu.x86.assembler cpu.x86.assembler.operands kernel layouts +locals parser sequences ; +IN: bootstrap.x86 + +: tib-exception-list-offset ( -- n ) 0 bootstrap-cells ; +: tib-stack-base-offset ( -- n ) 1 bootstrap-cells ; +: tib-stack-limit-offset ( -- n ) 2 bootstrap-cells ; + +: jit-save-tib ( -- ) + tib-exception-list-offset [] tib-segment PUSH + tib-stack-base-offset [] tib-segment PUSH + tib-stack-limit-offset [] tib-segment PUSH ; + +: jit-restore-tib ( -- ) + tib-stack-limit-offset [] tib-segment POP + tib-stack-base-offset [] tib-segment POP + tib-exception-list-offset [] tib-segment POP ; + +:: jit-update-tib ( ctx-reg -- ) + ! There's a redundant load here because we're not allowed + ! to clobber ctx-reg. Clobbers tib-temp. + ! Save callstack base in TIB + tib-temp ctx-reg context-callstack-seg-offset [+] MOV + tib-temp tib-temp segment-end-offset [+] MOV + tib-stack-base-offset [] tib-temp tib-segment MOV + ! Save callstack limit in TIB + tib-temp ctx-reg context-callstack-seg-offset [+] MOV + tib-temp tib-temp segment-start-offset [+] MOV + tib-stack-limit-offset [] tib-temp tib-segment MOV ; -- 2.34.1