[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] tcg-arm: Implement tcg_register_jit
From: |
Richard Henderson |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] tcg-arm: Implement tcg_register_jit |
Date: |
Tue, 04 Jun 2013 13:03:48 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6 |
Ping.
r~
On 05/24/2013 02:20 PM, Richard Henderson wrote:
> Allows unwinding past the code_gen_buffer.
>
> Signed-off-by: Richard Henderson <address@hidden>
> ---
> 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));
> +}
>