diff options
author | Alain Frisch <alain@frisch.fr> | 2007-06-06 08:37:18 +0000 |
---|---|---|
committer | Alain Frisch <alain@frisch.fr> | 2007-06-06 08:37:18 +0000 |
commit | d7e2fe61f0cf290edabf92474f289375dd2e6b2d (patch) | |
tree | fdf5f96c895b056b96aa5d4e282f994dc80cb8ad | |
parent | 26d1dbacdf233f5c2c048284dd927922c4984735 (diff) | |
download | ocaml-d7e2fe61f0cf290edabf92474f289375dd2e6b2d.tar.gz |
stack overflow detection on amd64
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/natdynlink@8327 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | asmrun/natdynlink.c | 12 | ||||
-rw-r--r-- | asmrun/signals_asm.c | 6 |
2 files changed, 15 insertions, 3 deletions
diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index 6226ba473e..05da896b95 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -29,6 +29,8 @@ static void *getsym(void *handle, char *module, char *name, int opt){ /* Data segments are used by the Is_atom predicate (mlvalues.h) to detect static Caml blocks. + Code segments are used in signals_asm.c + TODO: use dichotomic search */ @@ -39,6 +41,7 @@ typedef struct segment { } segment; segment *caml_dyn_data_segments = NULL; +segment *caml_dyn_code_segments = NULL; static segment *segment_cons(void *begin, void *end, segment *tl) { segment *lnk = caml_stat_alloc(sizeof(segment)); @@ -54,6 +57,12 @@ int caml_is_in_data(void *p) { if (p >= lnk->begin && p <= lnk->end) return 1; return 0; } +int caml_is_in_code(void *p) { + segment *lnk; + for (lnk = caml_dyn_code_segments; NULL != lnk; lnk = lnk->next) + if (p >= lnk->begin && p <= lnk->end) return 1; + return 0; +} extern char caml_globals_map[]; @@ -115,7 +124,8 @@ CAMLprim value caml_natdynlink_run(void *handle, value symbol) { sym = optsym("__code_begin"); sym2 = optsym("__code_end"); - /* TODO: register code segment */ + if (NULL != sym && NULL != sym2) + caml_dyn_code_segments = segment_cons(sym,sym2,caml_dyn_code_segments); entrypoint = optsym("__entry"); if (NULL != entrypoint) result = caml_callback((value)(&entrypoint), 0); diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index f333540513..187b6f0c50 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -46,10 +46,12 @@ extern void caml_win32_overflow_detection(); #endif extern char * caml_code_area_start, * caml_code_area_end; +CAMLextern int caml_is_in_code(void *); #define In_code_area(pc) \ - ((char *)(pc) >= caml_code_area_start && \ - (char *)(pc) <= caml_code_area_end) + ( ((char *)(pc) >= caml_code_area_start && \ + (char *)(pc) <= caml_code_area_end) \ + || caml_is_in_code((void *)(pc)) ) /* This routine is the common entry point for garbage collection and signal handling. It can trigger a callback to Caml code. |