unicorn/qemu
Philippe Mathieu-Daudé a3938167d4
memory: Fix access_with_adjusted_size(small size) on big-endian memory regions
Memory regions configured as DEVICE_BIG_ENDIAN (or DEVICE_NATIVE_ENDIAN on
big-endian guest) behave incorrectly when the memory access 'size' is smaller
than the implementation 'access_size'.

In the following code segment from access_with_adjusted_size():

if (memory_region_big_endian(mr)) {
    for (i = 0; i < size; i += access_size) {
        r |= access_fn(mr, addr + i, value, access_size,
                       (size - access_size - i) * 8, access_mask, attrs);
}

(size - access_size - i) * 8 is the number of bits that will arithmetic
shift the current value.

Currently we can only 'left' shift a read() access, and 'right' shift a write().

When the access 'size' is smaller than the implementation, we get a negative
number of bits to shift.

For the read() case, a negative 'left' shift is a 'right' shift :)
However since the 'shift' type is unsigned, there is currently no way to
right shift.

Fix this by changing the access_fn() prototype to handle signed shift values,
and modify the memory_region_shift_read|write_access() helpers to correctly
arithmetic shift the opposite direction when the 'shift' value is negative.
2018-10-04 04:40:42 -04:00
..
accel translator: fix breakpoint processing 2018-10-04 04:04:57 -04:00
crypto crypto: Clean up includes 2018-02-19 00:47:40 -05:00
default-configs
docs
fpu softfloat: Add scaling float-to-int routines 2018-08-25 04:05:45 -04:00
hw hw/mips/mips_r4k: Fix initialization of MIPS target CPUs 2018-09-03 17:40:08 -04:00
include atomic: fix comment s/x64_64/x86_64/ 2018-10-04 00:44:48 -04:00
qapi qobject: Modify qobject_ref() to return obj 2018-05-04 10:24:10 -04:00
qobject qstring: Move qstring_from_substr()'s @end one to the right 2018-08-02 21:24:19 -04:00
qom qom/object: add some interface asserts 2018-10-04 04:30:42 -04:00
scripts qapi: Emit a blank line before dummy declaration 2018-09-25 21:12:16 -04:00
target target/i386: fix translation for icount mode 2018-10-04 04:32:26 -04:00
tcg target/i386: move x86_64_hregs to DisasContext 2018-10-04 04:02:50 -04:00
util Haiku support patches (#989) 2018-09-03 07:55:51 -04:00
aarch64.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
aarch64eb.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
accel.c clean-up: removed duplicate #includes 2018-02-28 08:51:56 -05:00
arm.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
armeb.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
CODING_STYLE
configure configure: preserve various environment variables in config.status 2018-10-04 00:46:48 -04:00
COPYING
COPYING.LIB
cpus.c Include qapi/error.h exactly where needed 2018-03-07 12:26:38 -05:00
exec.c memory, exec: Expose all memory block related flags. 2018-08-22 13:00:05 -04:00
gen_all_header.sh
glib_compat.c Use cpu_create(type) instead of cpu_init(cpu_model) 2018-03-20 14:20:30 -04:00
HACKING HACKING: document preference for g_new instead of g_malloc 2018-05-22 00:30:50 -04:00
header_gen.py memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
ioport.c hw: remove pio_addr_t 2018-02-24 02:43:16 -05:00
LICENSE
m68k.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
Makefile Revert "Makefile: Rename TARGET_DIRS to TARGET_LIST" 2018-07-05 17:40:24 -04:00
Makefile.objs qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-09 11:35:11 -05:00
Makefile.target tcg: remove softfloat from --disable-tcg builds 2018-06-07 11:49:35 -04:00
memory.c memory: Fix access_with_adjusted_size(small size) on big-endian memory regions 2018-10-04 04:40:42 -04:00
memory_ldst.inc.c exec: Fix MAP_RAM for cached access 2018-07-03 01:11:12 -04:00
memory_mapping.c include/qemu/osdep.h: Don't include qapi/error.h 2018-02-21 23:08:18 -05:00
mips.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
mips64.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
mips64el.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
mipsel.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
powerpc.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
qemu-timer.c timer/cpus: fix some typos and update some comments 2018-02-25 23:21:57 -05:00
rules.mak build-sys: silence make by default or V=0 2018-03-06 08:58:03 -05:00
sparc.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
sparc64.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00
unicorn_common.h unicorn_common: Fix unicorn memory functions failing 2018-09-03 10:40:14 -04:00
VERSION Open 3.1 development tree 2018-08-16 06:33:25 -04:00
vl.c Use cpu_create(type) instead of cpu_init(cpu_model) 2018-03-20 14:20:30 -04:00
vl.h
x86_64.h memory: cleanup side effects of memory_region_init_foo() on failure 2018-10-04 04:15:29 -04:00