summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlain Frisch <alain@frisch.fr>2007-06-06 08:37:18 +0000
committerAlain Frisch <alain@frisch.fr>2007-06-06 08:37:18 +0000
commitd7e2fe61f0cf290edabf92474f289375dd2e6b2d (patch)
treefdf5f96c895b056b96aa5d4e282f994dc80cb8ad
parent26d1dbacdf233f5c2c048284dd927922c4984735 (diff)
downloadocaml-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.c12
-rw-r--r--asmrun/signals_asm.c6
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.