harden qemu/cstack interaction - gcl.git - GNU Common Lisp

index : gcl.git
GNU Common Lisp
summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamm Maguire <camm@transcendence.maguirefamily.org>2025年05月08日 12:37:02 -0400
committerCamm Maguire <camm@transcendence.maguirefamily.org>2025年05月08日 12:37:02 -0400
commit5907bbbe67433e39ec57e36346e3ec30b769b14d (patch)
treef112e9be72262af1aedad063fc215bb4daa0b113
parentfd8984c0fcdaa45ff4296ebfdf13eddd12c2362b (diff)
downloadgcl-5907bbbe67433e39ec57e36346e3ec30b769b14d.tar.gz
harden qemu/cstack interaction
Diffstat
-rw-r--r--gcl/h/cstack.h 27
-rw-r--r--gcl/o/main.c 27
2 files changed, 9 insertions, 45 deletions
diff --git a/gcl/h/cstack.h b/gcl/h/cstack.h
index b833a2652..aa5a08e6c 100644
--- a/gcl/h/cstack.h
+++ b/gcl/h/cstack.h
@@ -16,40 +16,31 @@
#define SET_STACK_POINTER "mov %0,r15\n\t"
#endif
-#define FIXED_STACK (1UL<<23)/*FIXME configure?*/
-#if defined(__SH4__)/*FIXME is this just due to qemu?*/
-#define CTOP (void *)0x80000000
-#define SS FIXED_STACK
+#define CTOP (void *)0xc0000000/*FIXME configure?*/
+#define MIN_STACK (1UL<<23)/*QEMU will not grow the stack*/
+
+#if defined(__SH4__)
+#undef CTOP
+#define CTOP (void *)0x80000000/*FIXME is this just due to qemu?*/
#elif defined(__gnu_hurd__)
-#define CTOP (void *)0xc0000000
-#define SS FIXED_STACK
#define MAP_GROWSDOWN 0
#define MAP_STACK 0
-#else
-#define CTOP (void *)0xc0000000/*FIXME configure?*/
-#define SS getpagesize()
#endif
#ifdef SET_STACK_POINTER
{
- void *p,*p1,*b,*s;
+ void *p,*p1,*b=CTOP-MIN_STACK,*s;
int a,f=MAP_FIXED|MAP_PRIVATE|MAP_ANON|MAP_STACK;
- int ss=
-#ifdef CHECK_FOR_QEMU
- qemu_p() ? FIXED_STACK :
-#endif
- SS;
p=alloca(1);
p1=alloca(1);
- b=CTOP-(p1<p ? ss : FIXED_STACK);
a=p1<p ? p-p1 : p1-p;
- a<<=2;
+ a<<=3;
s=p1<p ? CTOP-a : b+a;
if (p1<p) f|=MAP_GROWSDOWN;
if (p > CTOP || p < b) {
- if (mmap(b,ss,PROT_READ|PROT_WRITE|PROT_EXEC,f,-1,0)!=(void *)-1) {
+ if (mmap(b,MIN_STACK,PROT_READ|PROT_WRITE|PROT_EXEC,f,-1,0)!=(void *)-1) {
stack_map_base=b;
asm volatile (SET_STACK_POINTER::"r" (s):"memory");
if (p1>p)
diff --git a/gcl/o/main.c b/gcl/o/main.c
index 79fd138a3..64eb3cd91 100644
--- a/gcl/o/main.c
+++ b/gcl/o/main.c
@@ -407,32 +407,6 @@ setup_maxpages(double scale) {
}
-int
-qemu_p(void) {
-
-#if !defined(DARWIN) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__)/*FIXME*/
-
- char *c;
- ufixnum e,r=0;
- int l;
-
- massert((l=open("/proc/cpuinfo",O_RDONLY))!=-1);
-
- for (e=0;!e && (c=next_line(l,&r));)
- e=!memcmp("model",c,5) && strstr(c,"QEMU");
-
- massert(!close(l));
-
- return e;
-
-#else
-
- return 0;
-
-#endif
-}
-
-
static void *
next_shared_lib_map_no_malloc(void) {
@@ -753,7 +727,6 @@ main(int argc, char **argv, char **envp) {
bds_top = bds_org-1;
frs_top = frs_org-1;
-#define CHECK_FOR_QEMU
#include "cstack.h"
gcl_init_alloc(alloca(1));
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月04日 14:56:47 +0000

AltStyle によって変換されたページ (->オリジナル) /