microblaze: Add partial decoding of stream insns
Based on a patch from: Alejandro Cabrera <aldaya@gmail.com> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
This commit is contained in:
parent
8545364198
commit
6d76d23e82
@ -33,4 +33,7 @@ DEF_HELPER_2(mmu_write, void, i32, i32)
|
|||||||
|
|
||||||
DEF_HELPER_4(memalign, void, i32, i32, i32, i32)
|
DEF_HELPER_4(memalign, void, i32, i32, i32, i32)
|
||||||
|
|
||||||
|
DEF_HELPER_2(get, i32, i32, i32)
|
||||||
|
DEF_HELPER_3(put, void, i32, i32, i32)
|
||||||
|
|
||||||
#include "def-helper.h"
|
#include "def-helper.h"
|
||||||
|
@ -50,3 +50,6 @@
|
|||||||
#define DEC_BR {B8(00100110), B8(00110111)}
|
#define DEC_BR {B8(00100110), B8(00110111)}
|
||||||
#define DEC_BCC {B8(00100111), B8(00110111)}
|
#define DEC_BCC {B8(00100111), B8(00110111)}
|
||||||
#define DEC_RTS {B8(00101101), B8(00111111)}
|
#define DEC_RTS {B8(00101101), B8(00111111)}
|
||||||
|
|
||||||
|
#define DEC_STREAM {B8(00010011), B8(00110111)}
|
||||||
|
|
||||||
|
@ -69,6 +69,41 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void helper_put(uint32_t id, uint32_t ctrl, uint32_t data)
|
||||||
|
{
|
||||||
|
int test = ctrl & STREAM_TEST;
|
||||||
|
int atomic = ctrl & STREAM_ATOMIC;
|
||||||
|
int control = ctrl & STREAM_CONTROL;
|
||||||
|
int nonblock = ctrl & STREAM_NONBLOCK;
|
||||||
|
int exception = ctrl & STREAM_EXCEPTION;
|
||||||
|
|
||||||
|
qemu_log("Unhandled stream put to stream-id=%d data=%x %s%s%s%s%s\n",
|
||||||
|
id, data,
|
||||||
|
test ? "t" : "",
|
||||||
|
nonblock ? "n" : "",
|
||||||
|
exception ? "e" : "",
|
||||||
|
control ? "c" : "",
|
||||||
|
atomic ? "a" : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t helper_get(uint32_t id, uint32_t ctrl)
|
||||||
|
{
|
||||||
|
int test = ctrl & STREAM_TEST;
|
||||||
|
int atomic = ctrl & STREAM_ATOMIC;
|
||||||
|
int control = ctrl & STREAM_CONTROL;
|
||||||
|
int nonblock = ctrl & STREAM_NONBLOCK;
|
||||||
|
int exception = ctrl & STREAM_EXCEPTION;
|
||||||
|
|
||||||
|
qemu_log("Unhandled stream get from stream-id=%d %s%s%s%s%s\n",
|
||||||
|
id,
|
||||||
|
test ? "t" : "",
|
||||||
|
nonblock ? "n" : "",
|
||||||
|
exception ? "e" : "",
|
||||||
|
control ? "c" : "",
|
||||||
|
atomic ? "a" : "");
|
||||||
|
return 0xdead0000 | id;
|
||||||
|
}
|
||||||
|
|
||||||
void helper_raise_exception(uint32_t index)
|
void helper_raise_exception(uint32_t index)
|
||||||
{
|
{
|
||||||
env->exception_index = index;
|
env->exception_index = index;
|
||||||
|
@ -1476,6 +1476,42 @@ static void dec_null(DisasContext *dc)
|
|||||||
dc->abort_at_next_insn = 1;
|
dc->abort_at_next_insn = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Insns connected to FSL or AXI stream attached devices. */
|
||||||
|
static void dec_stream(DisasContext *dc)
|
||||||
|
{
|
||||||
|
int mem_index = cpu_mmu_index(dc->env);
|
||||||
|
TCGv_i32 t_id, t_ctrl;
|
||||||
|
int ctrl;
|
||||||
|
|
||||||
|
LOG_DIS("%s%s imm=%x\n", dc->rd ? "get" : "put",
|
||||||
|
dc->type_b ? "" : "d", dc->imm);
|
||||||
|
|
||||||
|
if ((dc->tb_flags & MSR_EE_FLAG) && (mem_index == MMU_USER_IDX)) {
|
||||||
|
tcg_gen_movi_tl(cpu_SR[SR_ESR], ESR_EC_PRIVINSN);
|
||||||
|
t_gen_raise_exception(dc, EXCP_HW_EXCP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
t_id = tcg_temp_new();
|
||||||
|
if (dc->type_b) {
|
||||||
|
tcg_gen_movi_tl(t_id, dc->imm & 0xf);
|
||||||
|
ctrl = dc->imm >> 10;
|
||||||
|
} else {
|
||||||
|
tcg_gen_andi_tl(t_id, cpu_R[dc->rb], 0xf);
|
||||||
|
ctrl = dc->imm >> 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
t_ctrl = tcg_const_tl(ctrl);
|
||||||
|
|
||||||
|
if (dc->rd == 0) {
|
||||||
|
gen_helper_put(t_id, t_ctrl, cpu_R[dc->ra]);
|
||||||
|
} else {
|
||||||
|
gen_helper_get(cpu_R[dc->rd], t_id, t_ctrl);
|
||||||
|
}
|
||||||
|
tcg_temp_free(t_id);
|
||||||
|
tcg_temp_free(t_ctrl);
|
||||||
|
}
|
||||||
|
|
||||||
static struct decoder_info {
|
static struct decoder_info {
|
||||||
struct {
|
struct {
|
||||||
uint32_t bits;
|
uint32_t bits;
|
||||||
@ -1500,6 +1536,7 @@ static struct decoder_info {
|
|||||||
{DEC_MUL, dec_mul},
|
{DEC_MUL, dec_mul},
|
||||||
{DEC_DIV, dec_div},
|
{DEC_DIV, dec_div},
|
||||||
{DEC_MSR, dec_msr},
|
{DEC_MSR, dec_msr},
|
||||||
|
{DEC_STREAM, dec_stream},
|
||||||
{{0, 0}, dec_null}
|
{{0, 0}, dec_null}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user