>From 137c01b789d4fd4189fe6dc6a1a7b7f60ba7bfcf Mon Sep 17 00:00:00 2001 From: Paulo Cesar Pereira de Andrade Date: Mon, 23 Aug 2010 18:59:39 -0300 Subject: [PATCH 5/6] Add safety check on number of integer and float arguments on x86_64. --- lightning/i386/core-64.h | 10 ++++++++++ lightning/i386/fp-64.h | 5 +++++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/lightning/i386/core-64.h b/lightning/i386/core-64.h index 4fb6adc..cf8ec6f 100644 --- a/lightning/i386/core-64.h +++ b/lightning/i386/core-64.h @@ -38,6 +38,12 @@ #define JIT_CAN_16 0 #define JIT_REXTMP _R11D +/* Number or integer argument registers */ +#define JIT_RA_NUM 6 + +/* Number of float argument registers */ +#define JIT_FA_NUM 8 + #define JIT_R_NUM 3 #define JIT_R(i) ((i) == 0 ? _EAX : _R9D + (i)) #define JIT_V_NUM 5 @@ -132,7 +138,11 @@ struct jit_local_state { #define jit_callr(reg) CALLsr((reg)) /* Stack isn't used for arguments: */ +#if !defined(_ASM_SAFETY) #define jit_prepare_i(ni) (_jitl.argssize = (ni)) +#else +#define jit_prepare_i(ni) ((ni) <= JIT_RA_NUM ? _jitl.argssize = (ni) : JITFAIL("too many integer arguments")) +#endif #define jit_pusharg_i(rs) (--_jitl.argssize, MOVQrr(rs, jit_arg_reg_order[_jitl.argssize])) #define jit_finish(sub) (MOVQir((long) (sub), JIT_REXTMP), \ diff --git a/lightning/i386/fp-64.h b/lightning/i386/fp-64.h index 2dfe399..3e651ba 100644 --- a/lightning/i386/fp-64.h +++ b/lightning/i386/fp-64.h @@ -290,8 +290,13 @@ union jit_double_imm { #define jit_ordr_d(d, s1, s2) (XORLrr ((d), (d)), UCOMISDrr ((s1), (s2)), SETNPr (jit_reg8((d)))) #define jit_unordr_d(d, s1, s2) (XORLrr ((d), (d)), UCOMISDrr ((s1), (s2)), SETPr (jit_reg8((d)))) +#if !defined(_ASM_SAFETY) #define jit_prepare_f(num) (_jitl.nextarg_putfp = _XMM0 + (num)) #define jit_prepare_d(num) (_jitl.nextarg_putfp = _XMM0 + (num)) +#else +#define jit_prepare_f(num) ((num) <= JIT_FA_NUM ? (_jitl.nextarg_putfp = _XMM0 + (num)) : JITFAIL("too many float arguments")) +#define jit_prepare_d(num) ((num) <= JIT_FA_NUM ? (_jitl.nextarg_putfp = _XMM0 + (num)) : JITFAIL("too many float arguments")) +#endif #define jit_arg_f() (_XMM0 + _jitl.nextarg_getfp++) #define jit_arg_d() (_XMM0 + _jitl.nextarg_getfp++) -- 1.7.2.1