#define GP_SCRATCH_REG 31
#define GP_SCRATCH_REG2 30
-static void
+G_GNUC_UNUSED static void
print_ctx (MonoContext *ctx)
{
char name[256];
/* int call_filter (guint64 fp, guint64 ip) */
/*
- * We have to create a register+stack frame similar to the frame which contains
- * the filter.
+ * We have to create a register+stack frame similar to the frame which
+ * contains the filter.
* - setting fp
* - setting up a register stack frame
- * These cannot be set up in this function, because the fp register is a stacked
- * register which is different in each method. Also, the register stack frame is
- * different in each method. So we pass the FP value in a a non-stacked
- * register and the code generated by the OP_START_HANDLER opcode will copy it
- * to the appropriate register after setting up the register stack frame.
+ * These cannot be set up in this function, because the fp register is a
+ * stacked register which is different in each method. Also, the register
+ * stack frame is different in each method. So we pass the FP value in a a
+ * non-stacked register and the code generated by the OP_START_HANDLER
+ * opcode will copy it to the appropriate register after setting up the
+ * register stack frame.
* The stacked registers are not need to be set since variables used in
- * handler registers are never allocated to registers.
+ * handler regions are never allocated to registers.
*/
in0 = 32;
/* Target ip */
ia64_mov_to_br (code, IA64_B6, in0 + 1);
- /* Return address */
- ia64_mov_from_ip (code, GP_SCRATCH_REG);
- ia64_adds_imm (code, GP_SCRATCH_REG, 3 * 16, GP_SCRATCH_REG);
-
/* Call the filter */
ia64_br_call_reg (code, IA64_B0, IA64_B6);
/* R8 contains the result of the filter */
- /* R9 contains the saved apr_pfs value */
/* FIXME: Add unwind info for this */
- /* The filter returns using br_cond_reg, so have to do another return */
- ia64_mov_to_ar_i (code, IA64_PFS, IA64_R9);
- ia64_mov_from_ip (code, GP_SCRATCH_REG);
- ia64_adds_imm (code, GP_SCRATCH_REG, 4 * 16, GP_SCRATCH_REG);
- ia64_mov_to_br (code, IA64_B0, GP_SCRATCH_REG);
- ia64_br_ret_reg (code, IA64_B0);
-
ia64_begin_bundle (code);
r_body = mono_ia64_create_unwind_region (&code);
*
* Returns a function pointer which can be used to raise
* corlib exceptions. The returned function has the following
- * signature: void (*func) (guint32 ex_token, guint32 offset);
+ * signature: void (*func) (guint32 ex_token_index, guint32 offset);
* Here, offset is the offset which needs to be substracted from the caller IP
* to get the IP of the throw. Passing the offset has the advantage that it
* needs no relocations in the caller.
/* Call exception_from_token */
ia64_movl (code, out0 + 0, mono_defaults.exception_class->image);
ia64_mov (code, out0 + 1, in0 + 0);
+ ia64_movl (code, GP_SCRATCH_REG, MONO_TOKEN_TYPE_DEF);
+ ia64_add (code, out0 + 1, in0 + 0, GP_SCRATCH_REG);
ptr = mono_exception_from_token;
ia64_movl (code, GP_SCRATCH_REG, ptr);
ia64_ld8_inc_imm (code, GP_SCRATCH_REG2, GP_SCRATCH_REG, 8);
gpointer
mono_arch_ip_from_context (void *sigctx)
{
- /* On IA64, these two are equal */
- unw_context_t *ctx = (unw_context_t*)sigctx;
- unw_cursor_t cursor;
- int res;
- unw_word_t w;
-
- res = unw_init_local (&cursor, ctx);
- g_assert (res == 0);
- res = unw_get_reg (&cursor, UNW_IA64_IP, &w);
- g_assert (res == 0);
+ ucontext_t *ctx = (ucontext_t*)sigctx;
- return (gpointer)w;
+ return (gpointer)ctx->uc_mcontext.sc_ip;
}