* [Qemu-devel] [PATCH] microblaze: Add support for the clz insn
@ 2012-01-10 10:27 Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector Edgar E. Iglesias
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 10:27 UTC (permalink / raw)
To: qemu-devel, edgar.iglesias
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
---
target-microblaze/helper.h | 1 +
target-microblaze/op_helper.c | 11 +++++++++++
target-microblaze/translate.c | 11 +++++++++++
3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h
index b92aa34..420ff3b 100644
--- a/target-microblaze/helper.h
+++ b/target-microblaze/helper.h
@@ -5,6 +5,7 @@ DEF_HELPER_0(debug, void)
DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32)
DEF_HELPER_2(cmp, i32, i32, i32)
DEF_HELPER_2(cmpu, i32, i32, i32)
+DEF_HELPER_1(clz, i32, i32)
DEF_HELPER_2(divs, i32, i32, i32)
DEF_HELPER_2(divu, i32, i32, i32)
diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c
index 7433cec..fe38b7b 100644
--- a/target-microblaze/op_helper.c
+++ b/target-microblaze/op_helper.c
@@ -165,6 +165,17 @@ uint32_t helper_cmpu(uint32_t a, uint32_t b)
return t;
}
+uint32_t helper_clz(uint32_t t0)
+{
+ if (t0 == 0) {
+ return 32;
+ }
+ if (t0 == ~0) {
+ return 0;
+ }
+ return clz32(t0);
+}
+
uint32_t helper_carry(uint32_t a, uint32_t b, uint32_t cf)
{
uint32_t ncf;
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index d7f513d..f4e6f30 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -809,6 +809,17 @@ static void dec_bit(DisasContext *dc)
return;
}
break;
+ case 0xe0:
+ if ((dc->tb_flags & MSR_EE_FLAG)
+ && (dc->env->pvr.regs[2] & PVR2_ILL_OPCODE_EXC_MASK)
+ && !((dc->env->pvr.regs[2] & PVR2_USE_PCMP_INSTR))) {
+ tcg_gen_movi_tl(cpu_SR[SR_ESR], ESR_EC_ILLEGAL_OP);
+ t_gen_raise_exception(dc, EXCP_HW_EXCP);
+ }
+ if (dc->env->pvr.regs[2] & PVR2_USE_PCMP_INSTR) {
+ gen_helper_clz(cpu_R[dc->rd], cpu_R[dc->ra]);
+ }
+ break;
default:
cpu_abort(dc->env, "unknown bit oc=%x op=%x rd=%d ra=%d rb=%d\n",
dc->pc, op, dc->rd, dc->ra, dc->rb);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
@ 2012-01-10 10:27 ` Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Break the tb at memory barriers Edgar E. Iglesias
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 10:27 UTC (permalink / raw)
To: qemu-devel, edgar.iglesias
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
---
target-microblaze/cpu.h | 3 +++
target-microblaze/helper.h | 1 +
target-microblaze/op_helper.c | 11 +++++++++++
target-microblaze/translate.c | 33 +++++++++++++++++++++++++++++++++
4 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/target-microblaze/cpu.h b/target-microblaze/cpu.h
index 1a307e3..3ecaeee 100644
--- a/target-microblaze/cpu.h
+++ b/target-microblaze/cpu.h
@@ -93,6 +93,7 @@ struct CPUMBState;
#define ESR_EC_DIVZERO 5
#define ESR_EC_FPU 6
#define ESR_EC_PRIVINSN 7
+#define ESR_EC_STACKPROT 7 /* Same as PRIVINSN. */
#define ESR_EC_DATA_STORAGE 8
#define ESR_EC_INSN_STORAGE 9
#define ESR_EC_DATA_TLB 10
@@ -235,6 +236,8 @@ typedef struct CPUMBState {
uint32_t regs[33];
uint32_t sregs[24];
float_status fp_status;
+ /* Stack protectors. Yes, it's a hw feature. */
+ uint32_t slr, shr;
/* Internal flags. */
#define IMM_FLAG 4
diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h
index 420ff3b..2205d5a 100644
--- a/target-microblaze/helper.h
+++ b/target-microblaze/helper.h
@@ -33,6 +33,7 @@ DEF_HELPER_2(mmu_write, void, i32, i32)
#endif
DEF_HELPER_4(memalign, void, i32, i32, i32, i32)
+DEF_HELPER_1(stackprot, void, i32)
DEF_HELPER_2(get, i32, i32, i32)
DEF_HELPER_3(put, void, i32, i32, i32)
diff --git a/target-microblaze/op_helper.c b/target-microblaze/op_helper.c
index fe38b7b..5fd7906 100644
--- a/target-microblaze/op_helper.c
+++ b/target-microblaze/op_helper.c
@@ -489,6 +489,17 @@ void helper_memalign(uint32_t addr, uint32_t dr, uint32_t wr, uint32_t mask)
}
}
+void helper_stackprot(uint32_t addr)
+{
+ if (addr < env->slr || addr > env->shr) {
+ qemu_log("Stack protector violation at %x %x %x\n",
+ addr, env->slr, env->shr);
+ env->sregs[SR_EAR] = addr;
+ env->sregs[SR_ESR] = ESR_EC_STACKPROT;
+ helper_raise_exception(EXCP_HW_EXCP);
+ }
+}
+
#if !defined(CONFIG_USER_ONLY)
/* Writes/reads to the MMU's special regs end up here. */
uint32_t helper_mmu_read(uint32_t rn)
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index f4e6f30..180ac84 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -526,6 +526,12 @@ static void dec_msr(DisasContext *dc)
case 0x7:
tcg_gen_andi_tl(cpu_SR[SR_FSR], cpu_R[dc->ra], 31);
break;
+ case 0x800:
+ tcg_gen_st_tl(cpu_R[dc->ra], cpu_env, offsetof(CPUState, slr));
+ break;
+ case 0x802:
+ tcg_gen_st_tl(cpu_R[dc->ra], cpu_env, offsetof(CPUState, shr));
+ break;
default:
cpu_abort(dc->env, "unknown mts reg %x\n", sr);
break;
@@ -552,6 +558,12 @@ static void dec_msr(DisasContext *dc)
case 0xb:
tcg_gen_mov_tl(cpu_R[dc->rd], cpu_SR[SR_BTR]);
break;
+ case 0x800:
+ tcg_gen_ld_tl(cpu_R[dc->rd], cpu_env, offsetof(CPUState, slr));
+ break;
+ case 0x802:
+ tcg_gen_ld_tl(cpu_R[dc->rd], cpu_env, offsetof(CPUState, shr));
+ break;
case 0x2000:
case 0x2001:
case 0x2002:
@@ -864,6 +876,13 @@ static inline void gen_load(DisasContext *dc, TCGv dst, TCGv addr,
static inline TCGv *compute_ldst_addr(DisasContext *dc, TCGv *t)
{
unsigned int extimm = dc->tb_flags & IMM_FLAG;
+ /* Should be set to one if r1 is used by loadstores. */
+ int stackprot = 0;
+
+ /* All load/stores use ra. */
+ if (dc->ra == 1) {
+ stackprot = 1;
+ }
/* Treat the common cases first. */
if (!dc->type_b) {
@@ -874,8 +893,16 @@ static inline TCGv *compute_ldst_addr(DisasContext *dc, TCGv *t)
return &cpu_R[dc->ra];
}
+ if (dc->rb == 1) {
+ stackprot = 1;
+ }
+
*t = tcg_temp_new();
tcg_gen_add_tl(*t, cpu_R[dc->ra], cpu_R[dc->rb]);
+
+ if (stackprot) {
+ gen_helper_stackprot(*t);
+ }
return t;
}
/* Immediate. */
@@ -891,6 +918,9 @@ static inline TCGv *compute_ldst_addr(DisasContext *dc, TCGv *t)
tcg_gen_add_tl(*t, cpu_R[dc->ra], *(dec_alu_op_b(dc)));
}
+ if (stackprot) {
+ gen_helper_stackprot(*t);
+ }
return t;
}
@@ -1917,6 +1947,9 @@ void cpu_reset (CPUState *env)
memset(env, 0, offsetof(CPUMBState, breakpoints));
tlb_flush(env, 1);
+ /* Disable stack protector. */
+ env->shr = ~0;
+
env->pvr.regs[0] = PVR0_PVR_FULL_MASK \
| PVR0_USE_BARREL_MASK \
| PVR0_USE_DIV_MASK \
--
1.7.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH] microblaze: Break the tb at memory barriers
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector Edgar E. Iglesias
@ 2012-01-10 10:27 ` Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop Edgar E. Iglesias
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 10:27 UTC (permalink / raw)
To: qemu-devel, edgar.iglesias
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
---
target-microblaze/translate.c | 12 +++++++++++-
1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index 180ac84..96ce2ec 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -1249,12 +1249,22 @@ static void dec_bcc(DisasContext *dc)
static void dec_br(DisasContext *dc)
{
- unsigned int dslot, link, abs;
+ unsigned int dslot, link, abs, mbar;
int mem_index = cpu_mmu_index(dc->env);
dslot = dc->ir & (1 << 20);
abs = dc->ir & (1 << 19);
link = dc->ir & (1 << 18);
+
+ /* Memory barrier. */
+ mbar = (dc->ir >> 16) & 31;
+ if (mbar == 2 && dc->imm == 4) {
+ LOG_DIS("mbar %d\n", dc->rd);
+ /* Break the TB. */
+ dc->cpustate_changed = 1;
+ return;
+ }
+
LOG_DIS("br%s%s%s%s imm=%x\n",
abs ? "a" : "", link ? "l" : "",
dc->type_b ? "i" : "", dslot ? "d" : "",
--
1.7.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Break the tb at memory barriers Edgar E. Iglesias
@ 2012-01-10 10:27 ` Edgar E. Iglesias
2012-01-10 15:16 ` Edgar E. Iglesias
2012-01-10 15:37 ` [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Peter Maydell
2012-01-10 23:19 ` Richard Henderson
4 siblings, 1 reply; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 10:27 UTC (permalink / raw)
To: qemu-devel, edgar.iglesias
From: Lars Persson <larper@axis.com>
- Send EOP flags to the out channels.
- Send data descriptor metadata to the out channels.
Signed-off-by: Lars Persson <larper@axis.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
---
hw/etraxfs_dma.c | 28 ++++++++++++++++++++++------
hw/etraxfs_dma.h | 13 ++++++++++---
hw/etraxfs_eth.c | 2 +-
3 files changed, 33 insertions(+), 10 deletions(-)
diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c
index d2bd584..332525c 100644
--- a/hw/etraxfs_dma.c
+++ b/hw/etraxfs_dma.c
@@ -401,15 +401,29 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
uint32_t saved_data_buf;
unsigned char buf[2 * 1024];
+ struct dma_context_metadata meta;
+ bool send_context = true;
+
if (ctrl->channels[c].eol)
return 0;
do {
+ bool out_eop;
D(printf("ch=%d buf=%x after=%x\n",
c,
(uint32_t)ctrl->channels[c].current_d.buf,
(uint32_t)ctrl->channels[c].current_d.after));
+ if (send_context) {
+ if (ctrl->channels[c].client->client.metadata_push) {
+ meta.metadata = ctrl->channels[c].current_d.md;
+ ctrl->channels[c].client->client.metadata_push(
+ ctrl->channels[c].client->client.opaque,
+ &meta);
+ }
+ send_context = false;
+ }
+
channel_load_d(ctrl, c);
saved_data_buf = channel_reg(ctrl, c, RW_SAVED_DATA_BUF);
len = (uint32_t)(unsigned long)
@@ -420,13 +434,17 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
len = sizeof buf;
cpu_physical_memory_read (saved_data_buf, buf, len);
- D(printf("channel %d pushes %x %u bytes\n", c,
- saved_data_buf, len));
+ out_eop = ((saved_data_buf + len) ==
+ ctrl->channels[c].current_d.after) &&
+ ctrl->channels[c].current_d.out_eop;
+
+ D(printf("channel %d pushes %x %u bytes eop=%u\n", c,
+ saved_data_buf, len, out_eop));
if (ctrl->channels[c].client->client.push)
ctrl->channels[c].client->client.push(
ctrl->channels[c].client->client.opaque,
- buf, len);
+ buf, len, out_eop);
else
printf("WARNING: DMA ch%d dataloss,"
" no attached client.\n", c);
@@ -437,11 +455,9 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
ctrl->channels[c].current_d.after) {
/* Done. Step to next. */
if (ctrl->channels[c].current_d.out_eop) {
- /* TODO: signal eop to the client. */
- D(printf("signal eop\n"));
+ send_context = true;
}
if (ctrl->channels[c].current_d.intr) {
- /* TODO: signal eop to the client. */
/* data intr. */
D(printf("signal intr %d eol=%d\n",
len, ctrl->channels[c].current_d.eol));
diff --git a/hw/etraxfs_dma.h b/hw/etraxfs_dma.h
index 96408ab..021c52a 100644
--- a/hw/etraxfs_dma.h
+++ b/hw/etraxfs_dma.h
@@ -1,3 +1,8 @@
+struct dma_context_metadata {
+ /* data descriptor md */
+ uint16_t metadata;
+};
+
struct etraxfs_dma_client
{
/* DMA controller. */
@@ -5,10 +10,12 @@ struct etraxfs_dma_client
void *ctrl;
/* client. */
- struct
- {
- int (*push)(void *opaque, unsigned char *buf, int len);
+ struct {
+ int (*push)(void *opaque, unsigned char *buf,
+ int len, bool eop);
void (*pull)(void *opaque);
+ void (*metadata_push)(void *opaque,
+ const struct dma_context_metadata *md);
void *opaque;
} client;
};
diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c
index b525258..5afa55f 100644
--- a/hw/etraxfs_eth.c
+++ b/hw/etraxfs_eth.c
@@ -540,7 +540,7 @@ static ssize_t eth_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
return size;
}
-static int eth_tx_push(void *opaque, unsigned char *buf, int len)
+static int eth_tx_push(void *opaque, unsigned char *buf, int len, bool eop)
{
struct fs_eth *eth = opaque;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop
2012-01-10 10:27 ` [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop Edgar E. Iglesias
@ 2012-01-10 15:16 ` Edgar E. Iglesias
0 siblings, 0 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 15:16 UTC (permalink / raw)
To: qemu-devel; +Cc: larper
Forgot to CC Lars on this one.
Also note that this patch has tab issues due to the ETRAX DMA model beeing
written prior to CodingStyle.
Cheers
On Tue, Jan 10, 2012 at 11:27:27AM +0100, Edgar E. Iglesias wrote:
> From: Lars Persson <larper@axis.com>
>
> - Send EOP flags to the out channels.
> - Send data descriptor metadata to the out channels.
>
> Signed-off-by: Lars Persson <larper@axis.com>
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> ---
> hw/etraxfs_dma.c | 28 ++++++++++++++++++++++------
> hw/etraxfs_dma.h | 13 ++++++++++---
> hw/etraxfs_eth.c | 2 +-
> 3 files changed, 33 insertions(+), 10 deletions(-)
>
> diff --git a/hw/etraxfs_dma.c b/hw/etraxfs_dma.c
> index d2bd584..332525c 100644
> --- a/hw/etraxfs_dma.c
> +++ b/hw/etraxfs_dma.c
> @@ -401,15 +401,29 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
> uint32_t saved_data_buf;
> unsigned char buf[2 * 1024];
>
> + struct dma_context_metadata meta;
> + bool send_context = true;
> +
> if (ctrl->channels[c].eol)
> return 0;
>
> do {
> + bool out_eop;
> D(printf("ch=%d buf=%x after=%x\n",
> c,
> (uint32_t)ctrl->channels[c].current_d.buf,
> (uint32_t)ctrl->channels[c].current_d.after));
>
> + if (send_context) {
> + if (ctrl->channels[c].client->client.metadata_push) {
> + meta.metadata = ctrl->channels[c].current_d.md;
> + ctrl->channels[c].client->client.metadata_push(
> + ctrl->channels[c].client->client.opaque,
> + &meta);
> + }
> + send_context = false;
> + }
> +
> channel_load_d(ctrl, c);
> saved_data_buf = channel_reg(ctrl, c, RW_SAVED_DATA_BUF);
> len = (uint32_t)(unsigned long)
> @@ -420,13 +434,17 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
> len = sizeof buf;
> cpu_physical_memory_read (saved_data_buf, buf, len);
>
> - D(printf("channel %d pushes %x %u bytes\n", c,
> - saved_data_buf, len));
> + out_eop = ((saved_data_buf + len) ==
> + ctrl->channels[c].current_d.after) &&
> + ctrl->channels[c].current_d.out_eop;
> +
> + D(printf("channel %d pushes %x %u bytes eop=%u\n", c,
> + saved_data_buf, len, out_eop));
>
> if (ctrl->channels[c].client->client.push)
> ctrl->channels[c].client->client.push(
> ctrl->channels[c].client->client.opaque,
> - buf, len);
> + buf, len, out_eop);
> else
> printf("WARNING: DMA ch%d dataloss,"
> " no attached client.\n", c);
> @@ -437,11 +455,9 @@ static int channel_out_run(struct fs_dma_ctrl *ctrl, int c)
> ctrl->channels[c].current_d.after) {
> /* Done. Step to next. */
> if (ctrl->channels[c].current_d.out_eop) {
> - /* TODO: signal eop to the client. */
> - D(printf("signal eop\n"));
> + send_context = true;
> }
> if (ctrl->channels[c].current_d.intr) {
> - /* TODO: signal eop to the client. */
> /* data intr. */
> D(printf("signal intr %d eol=%d\n",
> len, ctrl->channels[c].current_d.eol));
> diff --git a/hw/etraxfs_dma.h b/hw/etraxfs_dma.h
> index 96408ab..021c52a 100644
> --- a/hw/etraxfs_dma.h
> +++ b/hw/etraxfs_dma.h
> @@ -1,3 +1,8 @@
> +struct dma_context_metadata {
> + /* data descriptor md */
> + uint16_t metadata;
> +};
> +
> struct etraxfs_dma_client
> {
> /* DMA controller. */
> @@ -5,10 +10,12 @@ struct etraxfs_dma_client
> void *ctrl;
>
> /* client. */
> - struct
> - {
> - int (*push)(void *opaque, unsigned char *buf, int len);
> + struct {
> + int (*push)(void *opaque, unsigned char *buf,
> + int len, bool eop);
> void (*pull)(void *opaque);
> + void (*metadata_push)(void *opaque,
> + const struct dma_context_metadata *md);
> void *opaque;
> } client;
> };
> diff --git a/hw/etraxfs_eth.c b/hw/etraxfs_eth.c
> index b525258..5afa55f 100644
> --- a/hw/etraxfs_eth.c
> +++ b/hw/etraxfs_eth.c
> @@ -540,7 +540,7 @@ static ssize_t eth_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
> return size;
> }
>
> -static int eth_tx_push(void *opaque, unsigned char *buf, int len)
> +static int eth_tx_push(void *opaque, unsigned char *buf, int len, bool eop)
> {
> struct fs_eth *eth = opaque;
>
> --
> 1.7.3.4
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH] microblaze: Add support for the clz insn
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
` (2 preceding siblings ...)
2012-01-10 10:27 ` [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop Edgar E. Iglesias
@ 2012-01-10 15:37 ` Peter Maydell
2012-01-10 15:41 ` Edgar E. Iglesias
2012-01-10 23:19 ` Richard Henderson
4 siblings, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2012-01-10 15:37 UTC (permalink / raw)
To: Edgar E. Iglesias; +Cc: qemu-devel
On 10 January 2012 10:27, Edgar E. Iglesias <edgar.iglesias@gmail.com> wrote:
> +uint32_t helper_clz(uint32_t t0)
> +{
> + if (t0 == 0) {
> + return 32;
> + }
> + if (t0 == ~0) {
> + return 0;
> + }
> + return clz32(t0);
> +}
I think clz32() handles both the 0 and 0xffffffff cases correctly,
so they don't need special-casing.
-- PMM
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH] microblaze: Add support for the clz insn
2012-01-10 15:37 ` [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Peter Maydell
@ 2012-01-10 15:41 ` Edgar E. Iglesias
0 siblings, 0 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 15:41 UTC (permalink / raw)
To: Peter Maydell; +Cc: qemu-devel
On Tue, Jan 10, 2012 at 03:37:51PM +0000, Peter Maydell wrote:
> On 10 January 2012 10:27, Edgar E. Iglesias <edgar.iglesias@gmail.com> wrote:
> > +uint32_t helper_clz(uint32_t t0)
> > +{
> > + if (t0 == 0) {
> > + return 32;
> > + }
> > + if (t0 == ~0) {
> > + return 0;
> > + }
> > + return clz32(t0);
> > +}
>
> I think clz32() handles both the 0 and 0xffffffff cases correctly,
> so they don't need special-casing.
That seems to be the case, I'll fix that, thanks.
Cheers
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH] microblaze: Add support for the clz insn
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
` (3 preceding siblings ...)
2012-01-10 15:37 ` [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Peter Maydell
@ 2012-01-10 23:19 ` Richard Henderson
2012-01-10 23:20 ` Edgar E. Iglesias
4 siblings, 1 reply; 9+ messages in thread
From: Richard Henderson @ 2012-01-10 23:19 UTC (permalink / raw)
To: Edgar E. Iglesias; +Cc: qemu-devel
On 01/10/2012 09:27 PM, Edgar E. Iglesias wrote:
> +++ b/target-microblaze/helper.h
> @@ -5,6 +5,7 @@ DEF_HELPER_0(debug, void)
> DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32)
> DEF_HELPER_2(cmp, i32, i32, i32)
> DEF_HELPER_2(cmpu, i32, i32, i32)
> +DEF_HELPER_1(clz, i32, i32)
Use DEF_HELPER_FLAGS_1 with PURE|CONST, since the function examines
nothing but its arguments.
r~
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH] microblaze: Add support for the clz insn
2012-01-10 23:19 ` Richard Henderson
@ 2012-01-10 23:20 ` Edgar E. Iglesias
0 siblings, 0 replies; 9+ messages in thread
From: Edgar E. Iglesias @ 2012-01-10 23:20 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel
On Wed, Jan 11, 2012 at 10:19:19AM +1100, Richard Henderson wrote:
> On 01/10/2012 09:27 PM, Edgar E. Iglesias wrote:
> > +++ b/target-microblaze/helper.h
> > @@ -5,6 +5,7 @@ DEF_HELPER_0(debug, void)
> > DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32)
> > DEF_HELPER_2(cmp, i32, i32, i32)
> > DEF_HELPER_2(cmpu, i32, i32, i32)
> > +DEF_HELPER_1(clz, i32, i32)
>
> Use DEF_HELPER_FLAGS_1 with PURE|CONST, since the function examines
> nothing but its arguments.
Yep thank, noticed that when I changed the helper today :)
Cheers
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-01-10 23:20 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-10 10:27 [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Emulate the hw stackprotector Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] microblaze: Break the tb at memory barriers Edgar E. Iglesias
2012-01-10 10:27 ` [Qemu-devel] [PATCH] etraxfs-dma: Model metadata and eop Edgar E. Iglesias
2012-01-10 15:16 ` Edgar E. Iglesias
2012-01-10 15:37 ` [Qemu-devel] [PATCH] microblaze: Add support for the clz insn Peter Maydell
2012-01-10 15:41 ` Edgar E. Iglesias
2012-01-10 23:19 ` Richard Henderson
2012-01-10 23:20 ` Edgar E. Iglesias
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).