From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45979) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UjxSb-0000cc-U8 for qemu-devel@nongnu.org; Tue, 04 Jun 2013 16:04:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UjxST-0007L8-Db for qemu-devel@nongnu.org; Tue, 04 Jun 2013 16:04:01 -0400 Received: from mail-ve0-x231.google.com ([2607:f8b0:400c:c01::231]:54228) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UjxST-0007Kx-5o for qemu-devel@nongnu.org; Tue, 04 Jun 2013 16:03:53 -0400 Received: by mail-ve0-f177.google.com with SMTP id cz10so595082veb.36 for ; Tue, 04 Jun 2013 13:03:52 -0700 (PDT) Received: from anchor.twiddle.net (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPSA id l5sm33711646vev.1.2013.06.04.13.03.50 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 04 Jun 2013 13:03:51 -0700 (PDT) Sender: Richard Henderson Message-ID: <51AE4824.3000905@twiddle.net> Date: Tue, 04 Jun 2013 13:03:48 -0700 From: Richard Henderson MIME-Version: 1.0 References: <1369430452-27598-1-git-send-email-rth@twiddle.net> In-Reply-To: <1369430452-27598-1-git-send-email-rth@twiddle.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/2] tcg-arm: Implement tcg_register_jit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Ping. r~ On 05/24/2013 02:20 PM, Richard Henderson wrote: > Allows unwinding past the code_gen_buffer. > > Signed-off-by: Richard Henderson > --- > tcg/arm/tcg-target.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 82 insertions(+), 9 deletions(-) > > diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c > index 3d43412..4a691b1 100644 > --- a/tcg/arm/tcg-target.c > +++ b/tcg/arm/tcg-target.c > @@ -2100,23 +2100,31 @@ static inline void tcg_out_movi(TCGContext *s, TCGType type, > tcg_out_movi32(s, COND_AL, ret, arg); > } > > +/* Compute frame size via macros, to share between tcg_target_qemu_prologue > + and tcg_register_jit. */ > + > +#define PUSH_SIZE ((11 - 4 + 1 + 1) * sizeof(tcg_target_long)) > + > +#define FRAME_SIZE \ > + ((PUSH_SIZE \ > + + TCG_STATIC_CALL_ARGS_SIZE \ > + + CPU_TEMP_BUF_NLONGS * sizeof(long) \ > + + TCG_TARGET_STACK_ALIGN - 1) \ > + & -TCG_TARGET_STACK_ALIGN) > + > static void tcg_target_qemu_prologue(TCGContext *s) > { > - int frame_size; > + int stack_addend; > > /* Calling convention requires us to save r4-r11 and lr. */ > /* stmdb sp!, { r4 - r11, lr } */ > tcg_out32(s, (COND_AL << 28) | 0x092d4ff0); > > - /* Allocate the local stack frame. */ > - frame_size = TCG_STATIC_CALL_ARGS_SIZE; > - frame_size += CPU_TEMP_BUF_NLONGS * sizeof(long); > - /* We saved an odd number of registers above; keep an 8 aligned stack. */ > - frame_size = ((frame_size + TCG_TARGET_STACK_ALIGN - 1) > - & -TCG_TARGET_STACK_ALIGN) + 4; > + /* Reserve callee argument and tcg temp space. */ > + stack_addend = FRAME_SIZE - PUSH_SIZE; > > tcg_out_dat_rI(s, COND_AL, ARITH_SUB, TCG_REG_CALL_STACK, > - TCG_REG_CALL_STACK, frame_size, 1); > + TCG_REG_CALL_STACK, stack_addend, 1); > tcg_set_frame(s, TCG_REG_CALL_STACK, TCG_STATIC_CALL_ARGS_SIZE, > CPU_TEMP_BUF_NLONGS * sizeof(long)); > > @@ -2127,8 +2135,73 @@ static void tcg_target_qemu_prologue(TCGContext *s) > > /* Epilogue. We branch here via tb_ret_addr. */ > tcg_out_dat_rI(s, COND_AL, ARITH_ADD, TCG_REG_CALL_STACK, > - TCG_REG_CALL_STACK, frame_size, 1); > + TCG_REG_CALL_STACK, stack_addend, 1); > > /* ldmia sp!, { r4 - r11, pc } */ > tcg_out32(s, (COND_AL << 28) | 0x08bd8ff0); > } > + > +typedef struct { > + uint32_t len __attribute__((aligned((sizeof(void *))))); > + uint32_t id; > + uint8_t version; > + char augmentation[1]; > + uint8_t code_align; > + uint8_t data_align; > + uint8_t return_column; > +} DebugFrameCIE; > + > +typedef struct { > + uint32_t len __attribute__((aligned((sizeof(void *))))); > + uint32_t cie_offset; > + tcg_target_long func_start __attribute__((packed)); > + tcg_target_long func_len __attribute__((packed)); > + uint8_t def_cfa[4]; > + uint8_t reg_ofs[18]; > +} DebugFrameFDE; > + > +typedef struct { > + DebugFrameCIE cie; > + DebugFrameFDE fde; > +} DebugFrame; > + > +#define ELF_HOST_MACHINE EM_ARM > + > +static DebugFrame debug_frame = { > + .cie.len = sizeof(DebugFrameCIE)-4, /* length after .len member */ > + .cie.id = -1, > + .cie.version = 1, > + .cie.code_align = 1, > + .cie.data_align = 0x7c, /* sleb128 -4 */ > + .cie.return_column = 14, > + > + .fde.len = sizeof(DebugFrameFDE)-4, /* length after .len member */ > + .fde.def_cfa = { > + 12, 13, /* DW_CFA_def_cfa sp, ... */ > + (FRAME_SIZE & 0x7f) | 0x80, /* ... uleb128 FRAME_SIZE */ > + (FRAME_SIZE >> 7) > + }, > + .fde.reg_ofs = { > + /* The following must match the stmdb in the prologue. */ > + 0x8e, 1, /* DW_CFA_offset, lr, -4 */ > + 0x8b, 2, /* DW_CFA_offset, r11, -8 */ > + 0x8a, 3, /* DW_CFA_offset, r10, -12 */ > + 0x89, 4, /* DW_CFA_offset, r9, -16 */ > + 0x88, 5, /* DW_CFA_offset, r8, -20 */ > + 0x87, 6, /* DW_CFA_offset, r7, -24 */ > + 0x86, 7, /* DW_CFA_offset, r6, -28 */ > + 0x85, 8, /* DW_CFA_offset, r5, -32 */ > + 0x84, 9, /* DW_CFA_offset, r4, -36 */ > + } > +}; > + > +void tcg_register_jit(void *buf, size_t buf_size) > +{ > + /* We're expecting a 2 byte uleb128 encoded value. */ > + assert(FRAME_SIZE >> 14 == 0); > + > + debug_frame.fde.func_start = (tcg_target_long) buf; > + debug_frame.fde.func_len = buf_size; > + > + tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame)); > +} >