diff mbox series

[v3,13/16] tcg/aarch64: Return false on failure from patch_reloc

Message ID 20181130215221.20554-14-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg: Assorted cleanups | expand

Commit Message

Richard Henderson Nov. 30, 2018, 9:52 p.m. UTC
This does require an extra two checks within the slow paths
to replace the assert that we're moving.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 tcg/aarch64/tcg-target.inc.c | 35 ++++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

-- 
2.17.2

Comments

Alex Bennée Dec. 3, 2018, 10:43 a.m. UTC | #1
Richard Henderson <richard.henderson@linaro.org> writes:

> This does require an extra two checks within the slow paths

> to replace the assert that we're moving.

>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  tcg/aarch64/tcg-target.inc.c | 35 ++++++++++++++++++++---------------

>  1 file changed, 20 insertions(+), 15 deletions(-)

>

> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c

> index 16f08c59c4..77f0ca4d5e 100644

> --- a/tcg/aarch64/tcg-target.inc.c

> +++ b/tcg/aarch64/tcg-target.inc.c

> @@ -78,20 +78,26 @@ static const int tcg_target_call_oarg_regs[1] = {

>  #define TCG_REG_GUEST_BASE TCG_REG_X28

>  #endif

>

> -static inline void reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)

> +static inline bool reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)

>  {

>      ptrdiff_t offset = target - code_ptr;

> -    tcg_debug_assert(offset == sextract64(offset, 0, 26));

> -    /* read instruction, mask away previous PC_REL26 parameter contents,

> -       set the proper offset, then write back the instruction. */

> -    *code_ptr = deposit32(*code_ptr, 0, 26, offset);

> +    if (offset == sextract64(offset, 0, 26)) {

> +        /* read instruction, mask away previous PC_REL26 parameter contents,

> +           set the proper offset, then write back the instruction. */

> +        *code_ptr = deposit32(*code_ptr, 0, 26, offset);

> +        return true;

> +    }

> +    return false;

>  }

>

> -static inline void reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target)

> +static inline bool reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target)

>  {

>      ptrdiff_t offset = target - code_ptr;

> -    tcg_debug_assert(offset == sextract64(offset, 0, 19));

> -    *code_ptr = deposit32(*code_ptr, 5, 19, offset);

> +    if (offset == sextract64(offset, 0, 19)) {

> +        *code_ptr = deposit32(*code_ptr, 5, 19, offset);

> +        return true;

> +    }

> +    return false;

>  }

>

>  static inline bool patch_reloc(tcg_insn_unit *code_ptr, int type,

> @@ -101,15 +107,12 @@ static inline bool patch_reloc(tcg_insn_unit *code_ptr, int type,

>      switch (type) {

>      case R_AARCH64_JUMP26:

>      case R_AARCH64_CALL26:

> -        reloc_pc26(code_ptr, (tcg_insn_unit *)value);

> -        break;

> +        return reloc_pc26(code_ptr, (tcg_insn_unit *)value);

>      case R_AARCH64_CONDBR19:

> -        reloc_pc19(code_ptr, (tcg_insn_unit *)value);

> -        break;

> +        return reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>      default:

>          tcg_abort();

>      }

> -    return true;


nit: the default leg could return false for the same effect

Otherwise:

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>



--
Alex Bennée
Richard Henderson Dec. 3, 2018, 1:23 p.m. UTC | #2
On 12/3/18 4:43 AM, Alex Bennée wrote:
>>      case R_AARCH64_CONDBR19:

>> -        reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>> -        break;

>> +        return reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>>      default:

>>          tcg_abort();

>>      }

>> -    return true;

> 

> nit: the default leg could return false for the same effect


Would it be clearer changed to g_assert_not_reached()?
Because I'm not intending "unknown relocation" to have
the same effect as "out of range relocation".


r~
Alex Bennée Dec. 3, 2018, 2:15 p.m. UTC | #3
Richard Henderson <richard.henderson@linaro.org> writes:

> On 12/3/18 4:43 AM, Alex Bennée wrote:

>>>      case R_AARCH64_CONDBR19:

>>> -        reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>>> -        break;

>>> +        return reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>>>      default:

>>>          tcg_abort();

>>>      }

>>> -    return true;

>>

>> nit: the default leg could return false for the same effect

>

> Would it be clearer changed to g_assert_not_reached()?

> Because I'm not intending "unknown relocation" to have

> the same effect as "out of range relocation".


g_assert_not_reached would probably be better then.

Is there any particular reason tcg has tcg_abort(), is it just for the
slightly different report string?

>

>

> r~



--
Alex Bennée
Richard Henderson Dec. 3, 2018, 2:31 p.m. UTC | #4
On 12/3/18 8:15 AM, Alex Bennée wrote:
> 

> Richard Henderson <richard.henderson@linaro.org> writes:

> 

>> On 12/3/18 4:43 AM, Alex Bennée wrote:

>>>>      case R_AARCH64_CONDBR19:

>>>> -        reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>>>> -        break;

>>>> +        return reloc_pc19(code_ptr, (tcg_insn_unit *)value);

>>>>      default:

>>>>          tcg_abort();

>>>>      }

>>>> -    return true;

>>>

>>> nit: the default leg could return false for the same effect

>>

>> Would it be clearer changed to g_assert_not_reached()?

>> Because I'm not intending "unknown relocation" to have

>> the same effect as "out of range relocation".

> 

> g_assert_not_reached would probably be better then.

> 

> Is there any particular reason tcg has tcg_abort(), is it just for the

> slightly different report string?


It's just old, pre-dating a more concerted use of glib.


r~
diff mbox series

Patch

diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
index 16f08c59c4..77f0ca4d5e 100644
--- a/tcg/aarch64/tcg-target.inc.c
+++ b/tcg/aarch64/tcg-target.inc.c
@@ -78,20 +78,26 @@  static const int tcg_target_call_oarg_regs[1] = {
 #define TCG_REG_GUEST_BASE TCG_REG_X28
 #endif
 
-static inline void reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
+static inline bool reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
 {
     ptrdiff_t offset = target - code_ptr;
-    tcg_debug_assert(offset == sextract64(offset, 0, 26));
-    /* read instruction, mask away previous PC_REL26 parameter contents,
-       set the proper offset, then write back the instruction. */
-    *code_ptr = deposit32(*code_ptr, 0, 26, offset);
+    if (offset == sextract64(offset, 0, 26)) {
+        /* read instruction, mask away previous PC_REL26 parameter contents,
+           set the proper offset, then write back the instruction. */
+        *code_ptr = deposit32(*code_ptr, 0, 26, offset);
+        return true;
+    }
+    return false;
 }
 
-static inline void reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
+static inline bool reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
 {
     ptrdiff_t offset = target - code_ptr;
-    tcg_debug_assert(offset == sextract64(offset, 0, 19));
-    *code_ptr = deposit32(*code_ptr, 5, 19, offset);
+    if (offset == sextract64(offset, 0, 19)) {
+        *code_ptr = deposit32(*code_ptr, 5, 19, offset);
+        return true;
+    }
+    return false;
 }
 
 static inline bool patch_reloc(tcg_insn_unit *code_ptr, int type,
@@ -101,15 +107,12 @@  static inline bool patch_reloc(tcg_insn_unit *code_ptr, int type,
     switch (type) {
     case R_AARCH64_JUMP26:
     case R_AARCH64_CALL26:
-        reloc_pc26(code_ptr, (tcg_insn_unit *)value);
-        break;
+        return reloc_pc26(code_ptr, (tcg_insn_unit *)value);
     case R_AARCH64_CONDBR19:
-        reloc_pc19(code_ptr, (tcg_insn_unit *)value);
-        break;
+        return reloc_pc19(code_ptr, (tcg_insn_unit *)value);
     default:
         tcg_abort();
     }
-    return true;
 }
 
 #define TCG_CT_CONST_AIMM 0x100
@@ -1387,7 +1390,8 @@  static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
     TCGMemOp opc = get_memop(oi);
     TCGMemOp size = opc & MO_SIZE;
 
-    reloc_pc19(lb->label_ptr[0], s->code_ptr);
+    bool ok = reloc_pc19(lb->label_ptr[0], s->code_ptr);
+    tcg_debug_assert(ok);
 
     tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_X0, TCG_AREG0);
     tcg_out_mov(s, TARGET_LONG_BITS == 64, TCG_REG_X1, lb->addrlo_reg);
@@ -1409,7 +1413,8 @@  static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
     TCGMemOp opc = get_memop(oi);
     TCGMemOp size = opc & MO_SIZE;
 
-    reloc_pc19(lb->label_ptr[0], s->code_ptr);
+    bool ok = reloc_pc19(lb->label_ptr[0], s->code_ptr);
+    tcg_debug_assert(ok);
 
     tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_X0, TCG_AREG0);
     tcg_out_mov(s, TARGET_LONG_BITS == 64, TCG_REG_X1, lb->addrlo_reg);