mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20201102' into staging
target-arm queue: * target/arm: Fix Neon emulation bugs on big-endian hosts * target/arm: fix handling of HCR.FB * target/arm: fix LORID_EL1 access check * disas/capstone: Fix monitor disassembly of >32 bytes * hw/arm/smmuv3: Fix potential integer overflow (CID 1432363) * hw/arm/boot: fix SVE for EL3 direct kernel boot * hw/display/omap_lcdc: Fix potential NULL pointer dereference * hw/display/exynos4210_fimd: Fix potential NULL pointer dereference * target/arm: Get correct MMU index for other-security-state * configure: Test that gio libs from pkg-config work * hw/intc/arm_gicv3_cpuif: Make GIC maintenance interrupts work * docs: Fix building with Sphinx 3 * tests/qtest/npcm7xx_rng-test: Disable randomness tests # gpg: Signature made Mon 02 Nov 2020 17:09:00 GMT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [ultimate] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20201102: (26 commits) tests/qtest/npcm7xx_rng-test: Disable randomness tests qemu-option-trace.rst.inc: Don't use option:: markup scripts/kerneldoc: For Sphinx 3 use c:macro for macros with arguments hw/intc/arm_gicv3_cpuif: Make GIC maintenance interrupts work configure: Test that gio libs from pkg-config work target/arm: Get correct MMU index for other-security-state hw/display/exynos4210_fimd: Fix potential NULL pointer dereference hw/display/omap_lcdc: Fix potential NULL pointer dereference hw/arm/boot: fix SVE for EL3 direct kernel boot hw/arm/smmuv3: Fix potential integer overflow (CID 1432363) disas/capstone: Fix monitor disassembly of >32 bytes target/arm: fix LORID_EL1 access check target/arm: fix handling of HCR.FB target/arm: Fix VUDOT/VSDOT (scalar) on big-endian hosts target/arm: Fix float16 pairwise Neon ops on big-endian hosts target/arm: Improve do_prewiden_3d target/arm: Simplify do_long_3d and do_2scalar_long target/arm: Rename neon_load_reg64 to vfp_load_reg64 target/arm: Add read/write_neon_element64 target/arm: Rename neon_load_reg32 to vfp_load_reg32 ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -3489,13 +3489,21 @@ if test "$static" = yes && test "$mingw32" = yes; then
|
||||
fi
|
||||
|
||||
if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
|
||||
gio=yes
|
||||
gio_cflags=$($pkg_config --cflags gio-2.0)
|
||||
gio_libs=$($pkg_config --libs gio-2.0)
|
||||
gdbus_codegen=$($pkg_config --variable=gdbus_codegen gio-2.0)
|
||||
if [ ! -x "$gdbus_codegen" ]; then
|
||||
gdbus_codegen=
|
||||
fi
|
||||
# Check that the libraries actually work -- Ubuntu 18.04 ships
|
||||
# with pkg-config --static --libs data for gio-2.0 that is missing
|
||||
# -lblkid and will give a link error.
|
||||
write_c_skeleton
|
||||
if compile_prog "" "gio_libs" ; then
|
||||
gio=yes
|
||||
else
|
||||
gio=no
|
||||
fi
|
||||
else
|
||||
gio=no
|
||||
fi
|
||||
|
||||
+1
-1
@@ -286,7 +286,7 @@ bool cap_disas_monitor(disassemble_info *info, uint64_t pc, int count)
|
||||
|
||||
/* Make certain that we can make progress. */
|
||||
assert(tsize != 0);
|
||||
info->read_memory_func(pc, cap_buf + csize, tsize, info);
|
||||
info->read_memory_func(pc + csize, cap_buf + csize, tsize, info);
|
||||
csize += tsize;
|
||||
|
||||
if (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
Specify tracing options.
|
||||
|
||||
.. option:: [enable=]PATTERN
|
||||
``[enable=]PATTERN``
|
||||
|
||||
Immediately enable events matching *PATTERN*
|
||||
(either event name or a globbing pattern). This option is only
|
||||
@@ -11,7 +11,7 @@ Specify tracing options.
|
||||
|
||||
Use :option:`-trace help` to print a list of names of trace points.
|
||||
|
||||
.. option:: events=FILE
|
||||
``events=FILE``
|
||||
|
||||
Immediately enable events listed in *FILE*.
|
||||
The file must contain one event name (as listed in the ``trace-events-all``
|
||||
@@ -19,7 +19,7 @@ Specify tracing options.
|
||||
available if QEMU has been compiled with the ``simple``, ``log`` or
|
||||
``ftrace`` tracing backend.
|
||||
|
||||
.. option:: file=FILE
|
||||
``file=FILE``
|
||||
|
||||
Log output traces to *FILE*.
|
||||
This option is only available if QEMU has been compiled with
|
||||
|
||||
@@ -742,6 +742,9 @@ static void do_cpu_reset(void *opaque)
|
||||
if (cpu_isar_feature(aa64_mte, cpu)) {
|
||||
env->cp15.scr_el3 |= SCR_ATA;
|
||||
}
|
||||
if (cpu_isar_feature(aa64_sve, cpu)) {
|
||||
env->cp15.cptr_el[3] |= CPTR_EZ;
|
||||
}
|
||||
/* AArch64 kernels never boot in secure mode */
|
||||
assert(!info->secure_boot);
|
||||
/* This hook is only supported for AArch32 currently:
|
||||
|
||||
+2
-1
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/bitops.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "migration/vmstate.h"
|
||||
@@ -864,7 +865,7 @@ static void smmuv3_s1_range_inval(SMMUState *s, Cmd *cmd)
|
||||
scale = CMD_SCALE(cmd);
|
||||
num = CMD_NUM(cmd);
|
||||
ttl = CMD_TTL(cmd);
|
||||
num_pages = (num + 1) * (1 << (scale));
|
||||
num_pages = (num + 1) * BIT_ULL(scale);
|
||||
}
|
||||
|
||||
if (type == SMMU_CMD_TLBI_NH_VA) {
|
||||
|
||||
@@ -1275,12 +1275,14 @@ static void exynos4210_fimd_update(void *opaque)
|
||||
bool blend = false;
|
||||
uint8_t *host_fb_addr;
|
||||
bool is_dirty = false;
|
||||
const int global_width = (s->vidtcon[2] & FIMD_VIDTCON2_SIZE_MASK) + 1;
|
||||
int global_width;
|
||||
|
||||
if (!s || !s->console || !s->enabled ||
|
||||
surface_bits_per_pixel(qemu_console_surface(s->console)) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
global_width = (s->vidtcon[2] & FIMD_VIDTCON2_SIZE_MASK) + 1;
|
||||
exynos4210_update_resolution(s);
|
||||
surface = qemu_console_surface(s->console);
|
||||
|
||||
|
||||
@@ -78,14 +78,18 @@ static void omap_lcd_interrupts(struct omap_lcd_panel_s *s)
|
||||
static void omap_update_display(void *opaque)
|
||||
{
|
||||
struct omap_lcd_panel_s *omap_lcd = (struct omap_lcd_panel_s *) opaque;
|
||||
DisplaySurface *surface = qemu_console_surface(omap_lcd->con);
|
||||
DisplaySurface *surface;
|
||||
draw_line_func draw_line;
|
||||
int size, height, first, last;
|
||||
int width, linesize, step, bpp, frame_offset;
|
||||
hwaddr frame_base;
|
||||
|
||||
if (!omap_lcd || omap_lcd->plm == 1 || !omap_lcd->enable ||
|
||||
!surface_bits_per_pixel(surface)) {
|
||||
if (!omap_lcd || omap_lcd->plm == 1 || !omap_lcd->enable) {
|
||||
return;
|
||||
}
|
||||
|
||||
surface = qemu_console_surface(omap_lcd->con);
|
||||
if (!surface_bits_per_pixel(surface)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -399,6 +399,7 @@ static void gicv3_cpuif_virt_update(GICv3CPUState *cs)
|
||||
int irqlevel = 0;
|
||||
int fiqlevel = 0;
|
||||
int maintlevel = 0;
|
||||
ARMCPU *cpu = ARM_CPU(cs->cpu);
|
||||
|
||||
idx = hppvi_index(cs);
|
||||
trace_gicv3_cpuif_virt_update(gicv3_redist_affid(cs), idx);
|
||||
@@ -424,7 +425,7 @@ static void gicv3_cpuif_virt_update(GICv3CPUState *cs)
|
||||
|
||||
qemu_set_irq(cs->parent_vfiq, fiqlevel);
|
||||
qemu_set_irq(cs->parent_virq, irqlevel);
|
||||
qemu_set_irq(cs->maintenance_irq, maintlevel);
|
||||
qemu_set_irq(cpu->gicv3_maintenance_interrupt, maintlevel);
|
||||
}
|
||||
|
||||
static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||
@@ -2624,8 +2625,6 @@ void gicv3_init_cpuif(GICv3State *s)
|
||||
&& cpu->gic_num_lrs) {
|
||||
int j;
|
||||
|
||||
cs->maintenance_irq = cpu->gicv3_maintenance_interrupt;
|
||||
|
||||
cs->num_list_regs = cpu->gic_num_lrs;
|
||||
cs->vpribits = cpu->gic_vpribits;
|
||||
cs->vprebits = cpu->gic_vprebits;
|
||||
|
||||
@@ -153,7 +153,6 @@ struct GICv3CPUState {
|
||||
qemu_irq parent_fiq;
|
||||
qemu_irq parent_virq;
|
||||
qemu_irq parent_vfiq;
|
||||
qemu_irq maintenance_irq;
|
||||
|
||||
/* Redistributor */
|
||||
uint32_t level; /* Current IRQ level */
|
||||
|
||||
+17
-1
@@ -839,7 +839,23 @@ sub output_function_rst(%) {
|
||||
output_highlight_rst($args{'purpose'});
|
||||
$start = "\n\n**Syntax**\n\n ``";
|
||||
} else {
|
||||
print ".. c:function:: ";
|
||||
if ((split(/\./, $sphinx_version))[0] >= 3) {
|
||||
# Sphinx 3 and later distinguish macros and functions and
|
||||
# complain if you use c:function with something that's not
|
||||
# syntactically valid as a function declaration.
|
||||
# We assume that anything with a return type is a function
|
||||
# and anything without is a macro.
|
||||
if ($args{'functiontype'} ne "") {
|
||||
print ".. c:function:: ";
|
||||
} else {
|
||||
print ".. c:macro:: ";
|
||||
}
|
||||
} else {
|
||||
# Older Sphinx don't support documenting macros that take
|
||||
# arguments with c:macro, and don't complain about the use
|
||||
# of c:function for this.
|
||||
print ".. c:function:: ";
|
||||
}
|
||||
}
|
||||
if ($args{'functiontype'} ne "") {
|
||||
$start .= $args{'functiontype'} . " " . $args{'function'} . " (";
|
||||
|
||||
+7
-17
@@ -731,13 +731,12 @@ static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
|
||||
/*
|
||||
* Non-IS variants of TLB operations are upgraded to
|
||||
* IS versions if we are at NS EL1 and HCR_EL2.FB is set to
|
||||
* IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
|
||||
* force broadcast of these operations.
|
||||
*/
|
||||
static bool tlb_force_broadcast(CPUARMState *env)
|
||||
{
|
||||
return (env->cp15.hcr_el2 & HCR_FB) &&
|
||||
arm_current_el(env) == 1 && arm_is_secure_below_el3(env);
|
||||
return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
|
||||
}
|
||||
|
||||
static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
@@ -6680,9 +6679,10 @@ static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||
#endif
|
||||
|
||||
/* Shared logic between LORID and the rest of the LOR* registers.
|
||||
* Secure state has already been delt with.
|
||||
* Secure state exclusion has already been dealt with.
|
||||
*/
|
||||
static CPAccessResult access_lor_ns(CPUARMState *env)
|
||||
static CPAccessResult access_lor_ns(CPUARMState *env,
|
||||
const ARMCPRegInfo *ri, bool isread)
|
||||
{
|
||||
int el = arm_current_el(env);
|
||||
|
||||
@@ -6695,16 +6695,6 @@ static CPAccessResult access_lor_ns(CPUARMState *env)
|
||||
return CP_ACCESS_OK;
|
||||
}
|
||||
|
||||
static CPAccessResult access_lorid(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
bool isread)
|
||||
{
|
||||
if (arm_is_secure_below_el3(env)) {
|
||||
/* Access ok in secure mode. */
|
||||
return CP_ACCESS_OK;
|
||||
}
|
||||
return access_lor_ns(env);
|
||||
}
|
||||
|
||||
static CPAccessResult access_lor_other(CPUARMState *env,
|
||||
const ARMCPRegInfo *ri, bool isread)
|
||||
{
|
||||
@@ -6712,7 +6702,7 @@ static CPAccessResult access_lor_other(CPUARMState *env,
|
||||
/* Access denied in secure mode. */
|
||||
return CP_ACCESS_TRAP;
|
||||
}
|
||||
return access_lor_ns(env);
|
||||
return access_lor_ns(env, ri, isread);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -6739,7 +6729,7 @@ static const ARMCPRegInfo lor_reginfo[] = {
|
||||
.type = ARM_CP_CONST, .resetvalue = 0 },
|
||||
{ .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
|
||||
.opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
|
||||
.access = PL1_R, .accessfn = access_lorid,
|
||||
.access = PL1_R, .accessfn = access_lor_ns,
|
||||
.type = ARM_CP_CONST, .resetvalue = 0 },
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
@@ -2719,7 +2719,8 @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
|
||||
/* Return the MMU index for a v7M CPU in the specified security state */
|
||||
ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
|
||||
{
|
||||
bool priv = arm_current_el(env) != 0;
|
||||
bool priv = arm_v7m_is_handler_mode(env) ||
|
||||
!(env->v7m.control[secstate] & 1);
|
||||
|
||||
return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
|
||||
}
|
||||
|
||||
+257
-215
File diff suppressed because it is too large
Load Diff
+144
-197
File diff suppressed because it is too large
Load Diff
+115
-38
@@ -1094,64 +1094,141 @@ static inline void gen_hlt(DisasContext *s, int imm)
|
||||
unallocated_encoding(s);
|
||||
}
|
||||
|
||||
static inline long vfp_reg_offset(bool dp, unsigned reg)
|
||||
/*
|
||||
* Return the offset of a "full" NEON Dreg.
|
||||
*/
|
||||
static long neon_full_reg_offset(unsigned reg)
|
||||
{
|
||||
return offsetof(CPUARMState, vfp.zregs[reg >> 1].d[reg & 1]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
|
||||
* where 0 is the least significant end of the register.
|
||||
*/
|
||||
static long neon_element_offset(int reg, int element, MemOp memop)
|
||||
{
|
||||
int element_size = 1 << (memop & MO_SIZE);
|
||||
int ofs = element * element_size;
|
||||
#ifdef HOST_WORDS_BIGENDIAN
|
||||
/*
|
||||
* Calculate the offset assuming fully little-endian,
|
||||
* then XOR to account for the order of the 8-byte units.
|
||||
*/
|
||||
if (element_size < 8) {
|
||||
ofs ^= 8 - element_size;
|
||||
}
|
||||
#endif
|
||||
return neon_full_reg_offset(reg) + ofs;
|
||||
}
|
||||
|
||||
/* Return the offset of a VFP Dreg (dp = true) or VFP Sreg (dp = false). */
|
||||
static long vfp_reg_offset(bool dp, unsigned reg)
|
||||
{
|
||||
if (dp) {
|
||||
return offsetof(CPUARMState, vfp.zregs[reg >> 1].d[reg & 1]);
|
||||
return neon_element_offset(reg, 0, MO_64);
|
||||
} else {
|
||||
long ofs = offsetof(CPUARMState, vfp.zregs[reg >> 2].d[(reg >> 1) & 1]);
|
||||
if (reg & 1) {
|
||||
ofs += offsetof(CPU_DoubleU, l.upper);
|
||||
} else {
|
||||
ofs += offsetof(CPU_DoubleU, l.lower);
|
||||
}
|
||||
return ofs;
|
||||
return neon_element_offset(reg >> 1, reg & 1, MO_32);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return the offset of a 32-bit piece of a NEON register.
|
||||
zero is the least significant end of the register. */
|
||||
static inline long
|
||||
neon_reg_offset (int reg, int n)
|
||||
static inline void vfp_load_reg64(TCGv_i64 var, int reg)
|
||||
{
|
||||
int sreg;
|
||||
sreg = reg * 2 + n;
|
||||
return vfp_reg_offset(0, sreg);
|
||||
tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(true, reg));
|
||||
}
|
||||
|
||||
static TCGv_i32 neon_load_reg(int reg, int pass)
|
||||
static inline void vfp_store_reg64(TCGv_i64 var, int reg)
|
||||
{
|
||||
TCGv_i32 tmp = tcg_temp_new_i32();
|
||||
tcg_gen_ld_i32(tmp, cpu_env, neon_reg_offset(reg, pass));
|
||||
return tmp;
|
||||
tcg_gen_st_i64(var, cpu_env, vfp_reg_offset(true, reg));
|
||||
}
|
||||
|
||||
static void neon_store_reg(int reg, int pass, TCGv_i32 var)
|
||||
{
|
||||
tcg_gen_st_i32(var, cpu_env, neon_reg_offset(reg, pass));
|
||||
tcg_temp_free_i32(var);
|
||||
}
|
||||
|
||||
static inline void neon_load_reg64(TCGv_i64 var, int reg)
|
||||
{
|
||||
tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(1, reg));
|
||||
}
|
||||
|
||||
static inline void neon_store_reg64(TCGv_i64 var, int reg)
|
||||
{
|
||||
tcg_gen_st_i64(var, cpu_env, vfp_reg_offset(1, reg));
|
||||
}
|
||||
|
||||
static inline void neon_load_reg32(TCGv_i32 var, int reg)
|
||||
static inline void vfp_load_reg32(TCGv_i32 var, int reg)
|
||||
{
|
||||
tcg_gen_ld_i32(var, cpu_env, vfp_reg_offset(false, reg));
|
||||
}
|
||||
|
||||
static inline void neon_store_reg32(TCGv_i32 var, int reg)
|
||||
static inline void vfp_store_reg32(TCGv_i32 var, int reg)
|
||||
{
|
||||
tcg_gen_st_i32(var, cpu_env, vfp_reg_offset(false, reg));
|
||||
}
|
||||
|
||||
static void read_neon_element32(TCGv_i32 dest, int reg, int ele, MemOp memop)
|
||||
{
|
||||
long off = neon_element_offset(reg, ele, memop);
|
||||
|
||||
switch (memop) {
|
||||
case MO_SB:
|
||||
tcg_gen_ld8s_i32(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_UB:
|
||||
tcg_gen_ld8u_i32(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_SW:
|
||||
tcg_gen_ld16s_i32(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_UW:
|
||||
tcg_gen_ld16u_i32(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_UL:
|
||||
case MO_SL:
|
||||
tcg_gen_ld_i32(dest, cpu_env, off);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void read_neon_element64(TCGv_i64 dest, int reg, int ele, MemOp memop)
|
||||
{
|
||||
long off = neon_element_offset(reg, ele, memop);
|
||||
|
||||
switch (memop) {
|
||||
case MO_SL:
|
||||
tcg_gen_ld32s_i64(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_UL:
|
||||
tcg_gen_ld32u_i64(dest, cpu_env, off);
|
||||
break;
|
||||
case MO_Q:
|
||||
tcg_gen_ld_i64(dest, cpu_env, off);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void write_neon_element32(TCGv_i32 src, int reg, int ele, MemOp memop)
|
||||
{
|
||||
long off = neon_element_offset(reg, ele, memop);
|
||||
|
||||
switch (memop) {
|
||||
case MO_8:
|
||||
tcg_gen_st8_i32(src, cpu_env, off);
|
||||
break;
|
||||
case MO_16:
|
||||
tcg_gen_st16_i32(src, cpu_env, off);
|
||||
break;
|
||||
case MO_32:
|
||||
tcg_gen_st_i32(src, cpu_env, off);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static void write_neon_element64(TCGv_i64 src, int reg, int ele, MemOp memop)
|
||||
{
|
||||
long off = neon_element_offset(reg, ele, memop);
|
||||
|
||||
switch (memop) {
|
||||
case MO_64:
|
||||
tcg_gen_st_i64(src, cpu_env, off);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
|
||||
{
|
||||
TCGv_ptr ret = tcg_temp_new_ptr();
|
||||
|
||||
@@ -293,7 +293,7 @@ void HELPER(gvec_sdot_idx_b)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||
intptr_t index = simd_data(desc);
|
||||
uint32_t *d = vd;
|
||||
int8_t *n = vn;
|
||||
int8_t *m_indexed = (int8_t *)vm + index * 4;
|
||||
int8_t *m_indexed = (int8_t *)vm + H4(index) * 4;
|
||||
|
||||
/* Notice the special case of opr_sz == 8, from aa64/aa32 advsimd.
|
||||
* Otherwise opr_sz is a multiple of 16.
|
||||
@@ -324,7 +324,7 @@ void HELPER(gvec_udot_idx_b)(void *vd, void *vn, void *vm, uint32_t desc)
|
||||
intptr_t index = simd_data(desc);
|
||||
uint32_t *d = vd;
|
||||
uint8_t *n = vn;
|
||||
uint8_t *m_indexed = (uint8_t *)vm + index * 4;
|
||||
uint8_t *m_indexed = (uint8_t *)vm + H4(index) * 4;
|
||||
|
||||
/* Notice the special case of opr_sz == 8, from aa64/aa32 advsimd.
|
||||
* Otherwise opr_sz is a multiple of 16.
|
||||
@@ -1858,10 +1858,10 @@ DO_ABA(gvec_uaba_d, uint64_t)
|
||||
r2 = float16_##OP(m[H2(0)], m[H2(1)], fpst); \
|
||||
r3 = float16_##OP(m[H2(2)], m[H2(3)], fpst); \
|
||||
\
|
||||
d[H4(0)] = r0; \
|
||||
d[H4(1)] = r1; \
|
||||
d[H4(2)] = r2; \
|
||||
d[H4(3)] = r3; \
|
||||
d[H2(0)] = r0; \
|
||||
d[H2(1)] = r1; \
|
||||
d[H2(2)] = r2; \
|
||||
d[H2(3)] = r3; \
|
||||
}
|
||||
|
||||
DO_NEON_PAIRWISE(neon_padd, add)
|
||||
|
||||
@@ -265,10 +265,16 @@ int main(int argc, char **argv)
|
||||
|
||||
qtest_add_func("npcm7xx_rng/enable_disable", test_enable_disable);
|
||||
qtest_add_func("npcm7xx_rng/rosel", test_rosel);
|
||||
qtest_add_func("npcm7xx_rng/continuous/monobit", test_continuous_monobit);
|
||||
qtest_add_func("npcm7xx_rng/continuous/runs", test_continuous_runs);
|
||||
qtest_add_func("npcm7xx_rng/first_byte/monobit", test_first_byte_monobit);
|
||||
qtest_add_func("npcm7xx_rng/first_byte/runs", test_first_byte_runs);
|
||||
/*
|
||||
* These tests fail intermittently; only run them on explicit
|
||||
* request until we figure out why.
|
||||
*/
|
||||
if (getenv("QEMU_TEST_FLAKY_RNG_TESTS")) {
|
||||
qtest_add_func("npcm7xx_rng/continuous/monobit", test_continuous_monobit);
|
||||
qtest_add_func("npcm7xx_rng/continuous/runs", test_continuous_runs);
|
||||
qtest_add_func("npcm7xx_rng/first_byte/monobit", test_first_byte_monobit);
|
||||
qtest_add_func("npcm7xx_rng/first_byte/runs", test_first_byte_runs);
|
||||
}
|
||||
|
||||
qtest_start("-machine npcm750-evb");
|
||||
ret = g_test_run();
|
||||
|
||||
Reference in New Issue
Block a user