static u32 lightrec_mfc2(struct lightrec_state *state, u8 reg);
static void lightrec_default_sb(struct lightrec_state *state, u32 opcode,
- void *host, u32 addr, u8 data)
+ void *host, u32 addr, u32 data)
{
- *(u8 *)host = data;
+ *(u8 *)host = (u8)data;
if (!(state->opt_flags & LIGHTREC_OPT_INV_DMA_ONLY))
lightrec_invalidate(state, addr, 1);
}
static void lightrec_default_sh(struct lightrec_state *state, u32 opcode,
- void *host, u32 addr, u16 data)
+ void *host, u32 addr, u32 data)
{
- *(u16 *)host = HTOLE16(data);
+ *(u16 *)host = HTOLE16((u16)data);
if (!(state->opt_flags & LIGHTREC_OPT_INV_DMA_ONLY))
lightrec_invalidate(state, addr, 2);
return LE32TOH(*(u32 *)host);
}
+static u32 lightrec_default_lwu(struct lightrec_state *state,
+ u32 opcode, void *host, u32 addr)
+{
+ u32 val;
+
+ memcpy(&val, host, 4);
+
+ return LE32TOH(val);
+}
+
+static void lightrec_default_swu(struct lightrec_state *state, u32 opcode,
+ void *host, u32 addr, u32 data)
+{
+ data = HTOLE32(data);
+
+ memcpy(host, &data, 4);
+
+ if (!(state->opt_flags & LIGHTREC_OPT_INV_DMA_ONLY))
+ lightrec_invalidate(state, addr & ~0x3, 8);
+}
+
static const struct lightrec_mem_map_ops lightrec_default_ops = {
.sb = lightrec_default_sb,
.sh = lightrec_default_sh,
.lb = lightrec_default_lb,
.lh = lightrec_default_lh,
.lw = lightrec_default_lw,
+ .lwu = lightrec_default_lwu,
+ .swu = lightrec_default_swu,
};
static void __segfault_cb(struct lightrec_state *state, u32 addr,
switch (op.i.op) {
case OP_SB:
- ops->sb(state, opcode, host, addr, (u8) data);
+ ops->sb(state, opcode, host, addr, data);
return 0;
case OP_SH:
- ops->sh(state, opcode, host, addr, (u16) data);
+ ops->sh(state, opcode, host, addr, data);
return 0;
case OP_SWL:
lightrec_swl(state, ops, opcode, host, addr, data);
return lightrec_lwl(state, ops, opcode, host, addr, data);
case OP_LWR:
return lightrec_lwr(state, ops, opcode, host, addr, data);
+ case OP_META_LWU:
+ return ops->lwu(state, opcode, host, addr);
+ case OP_META_SWU:
+ ops->swu(state, opcode, host, addr, data);
+ return 0;
case OP_LW:
default:
return ops->lw(state, opcode, host, addr);
case OP_LWL:
case OP_LWR:
case OP_LW:
+ case OP_META_LWU:
if (OPT_HANDLE_LOAD_DELAYS && unlikely(!state->in_delay_slot_n)) {
state->temp_reg = ret;
state->in_delay_slot_n = 0xff;
case OP_SWR:
case OP_LWC2:
case OP_SWC2:
+ case OP_META_LWU:
+ case OP_META_SWU:
if (!LIGHTREC_FLAGS_GET_IO_MODE(op->flags))
return false;
fallthrough;
else
lut_size = CODE_LUT_SIZE * sizeof(void *);
- init_jit(argv0);
+ init_jit_with_debug(argv0, stdout);
state = calloc(1, sizeof(*state) + lut_size);
if (!state)