mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-target-arm-20220922' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue: * hw/net/can: fix Xilinx ZynqMP CAN RX FIFO logic * Fix alignment for Neon VLD4.32 * Refactoring of page-table-walk code * hw/acpi: Add ospm_status hook implementation for acpi-ged * hw/net/lan9118: Signal TSFL_INT flag when TX FIFO reaches specified level * chardev/baum: avoid variable-length arrays * io/channel-websock: avoid variable-length arrays * hw/net/e1000e_core: Use definition to avoid dynamic stack allocation * hw/ppc/pnv: Avoid dynamic stack allocation * hw/intc/xics: Avoid dynamic stack allocation * hw/i386/multiboot: Avoid dynamic stack allocation * hw/usb/hcd-ohci: Use definition to avoid dynamic stack allocation * ui/curses: Avoid dynamic stack allocation * tests/unit/test-vmstate: Avoid dynamic stack allocation * configure: fix various shellcheck-spotted issues and nits # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmMsjocZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3s0vEACuUs7nGGX5vd96EPN+sO5s # HstP16G6/Xnlw2z0BaXi0MMWapQRhSQJ+MIeDJmqIyZKQ3geJGP7pbFTxI3zreYM # UTKjdI/wWRYMKPYfxlIBZ8TPugj4a4paFJlyqmpHXtkwiWRv6rF70HQ9Yku5id93 # FN9js/dyF74S2AaDppBuTWp31cM1k6kBTg/v5tXSxE8kDUKkO+HZ1VujOqIG/4nJ # 6urNJ7jlHSiFdXya2QiR+CAkyXyy551rLETeO8VJg9tOO7Ys7Olj7lqv6kHJY/X1 # 01RbN5A5WXhqCvTLM3UYTvFHmbZtS/C5iUhHRtlZkOoeSv2jS6IRDB8BrBtIbOwF # XKpaYf1jyFLFwX++hpvySD9Vbcu8KgKId8iKTuDcxjQlEjL3fTbt1ulKo4y+rJ8O # 6G1k4yZc8/nAvttNoKCn7/Jr1dC+HsANa+1s1L+6w+f1gARV0VXs4gqsveNnbe1+ # WzzaHvHt+hCaiWkSZlyisyw3fbEXMrEyKewi+SZu3c8PvJ6DHa+rYjkhem7muBVF # iR48FRTjFiS+o402KMwXfMdiGjXyZFi09yn5diowlVjkNAaZVZfgu/wUMD5QBhbh # fNDSw7LpXGUHML/O98MiXznkgGvTEQNxZdp2qIQrTiinUgmV4ZRLR23ZpEibdJPX # kiOkr46SbWvksCXnRlTf8w== # =hec8 # -----END PGP SIGNATURE----- # gpg: Signature made Thu 22 Sep 2022 12:34:15 EDT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [full] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [full] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [full] # gpg: aka "Peter Maydell <peter@archaic.org.uk>" [unknown] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * tag 'pull-target-arm-20220922' of https://git.linaro.org/people/pmaydell/qemu-arm: (39 commits) configure: Avoid use of 'local' as it is non-POSIX configure: Check mkdir result directly, not via $? configure: Remove use of backtick `...` syntax configure: Add './' on front of glob of */config-devices.mak.d configure: Add missing quoting for some easy cases configure: Remove unused meson_args variable configure: Remove unused python_version variable tests/unit/test-vmstate: Avoid dynamic stack allocation ui/curses: Avoid dynamic stack allocation hw/usb/hcd-ohci: Use definition to avoid dynamic stack allocation hw/i386/multiboot: Avoid dynamic stack allocation hw/intc/xics: Avoid dynamic stack allocation hw/ppc/pnv: Avoid dynamic stack allocation hw/net/e1000e_core: Use definition to avoid dynamic stack allocation io/channel-websock: Replace strlen(const_str) by sizeof(const_str) - 1 chardev/baum: Avoid dynamic stack allocation chardev/baum: Use definitions to avoid dynamic stack allocation chardev/baum: Replace magic values by X_MAX / Y_MAX definitions hw/net/lan9118: Signal TSFL_INT flag when TX FIFO reaches specified level hw/acpi: Add ospm_status hook implementation for acpi-ged ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
+13
-9
@@ -87,6 +87,9 @@
|
||||
|
||||
#define BUF_SIZE 256
|
||||
|
||||
#define X_MAX 84
|
||||
#define Y_MAX 1
|
||||
|
||||
struct BaumChardev {
|
||||
Chardev parent;
|
||||
|
||||
@@ -244,11 +247,11 @@ static int baum_deferred_init(BaumChardev *baum)
|
||||
brlapi_perror("baum: brlapi__getDisplaySize");
|
||||
return 0;
|
||||
}
|
||||
if (baum->y > 1) {
|
||||
baum->y = 1;
|
||||
if (baum->y > Y_MAX) {
|
||||
baum->y = Y_MAX;
|
||||
}
|
||||
if (baum->x > 84) {
|
||||
baum->x = 84;
|
||||
if (baum->x > X_MAX) {
|
||||
baum->x = X_MAX;
|
||||
}
|
||||
|
||||
con = qemu_console_lookup_by_index(0);
|
||||
@@ -296,7 +299,8 @@ static void baum_chr_accept_input(struct Chardev *chr)
|
||||
static void baum_write_packet(BaumChardev *baum, const uint8_t *buf, int len)
|
||||
{
|
||||
Chardev *chr = CHARDEV(baum);
|
||||
uint8_t io_buf[1 + 2 * len], *cur = io_buf;
|
||||
g_autofree uint8_t *io_buf = g_malloc(1 + 2 * len);
|
||||
uint8_t *cur = io_buf;
|
||||
int room;
|
||||
*cur++ = ESC;
|
||||
while (len--)
|
||||
@@ -380,9 +384,9 @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
|
||||
switch (req) {
|
||||
case BAUM_REQ_DisplayData:
|
||||
{
|
||||
uint8_t cells[baum->x * baum->y], c;
|
||||
uint8_t text[baum->x * baum->y];
|
||||
uint8_t zero[baum->x * baum->y];
|
||||
uint8_t cells[X_MAX * Y_MAX], c;
|
||||
uint8_t text[X_MAX * Y_MAX];
|
||||
uint8_t zero[X_MAX * Y_MAX];
|
||||
int cursor = BRLAPI_CURSOR_OFF;
|
||||
int i;
|
||||
|
||||
@@ -405,7 +409,7 @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
|
||||
}
|
||||
timer_del(baum->cellCount_timer);
|
||||
|
||||
memset(zero, 0, sizeof(zero));
|
||||
memset(zero, 0, baum->x * baum->y);
|
||||
|
||||
brlapi_writeArguments_t wa = {
|
||||
.displayNumber = BRLAPI_DISPLAY_DEFAULT,
|
||||
|
||||
@@ -57,7 +57,7 @@ GNUmakefile: ;
|
||||
|
||||
EOF
|
||||
cd build
|
||||
exec $source_path/configure "$@"
|
||||
exec "$source_path/configure" "$@"
|
||||
fi
|
||||
|
||||
# Temporary directory used for files created while
|
||||
@@ -67,8 +67,7 @@ fi
|
||||
# it when configure exits.)
|
||||
TMPDIR1="config-temp"
|
||||
rm -rf "${TMPDIR1}"
|
||||
mkdir -p "${TMPDIR1}"
|
||||
if [ $? -ne 0 ]; then
|
||||
if ! mkdir -p "${TMPDIR1}"; then
|
||||
echo "ERROR: failed to create temporary directory"
|
||||
exit 1
|
||||
fi
|
||||
@@ -111,7 +110,7 @@ error_exit() {
|
||||
do_compiler() {
|
||||
# Run the compiler, capturing its output to the log. First argument
|
||||
# is compiler binary to execute.
|
||||
local compiler="$1"
|
||||
compiler="$1"
|
||||
shift
|
||||
if test -n "$BASH_VERSION"; then eval '
|
||||
echo >>config.log "
|
||||
@@ -311,7 +310,6 @@ pie=""
|
||||
coroutine=""
|
||||
plugins="$default_feature"
|
||||
meson=""
|
||||
meson_args=""
|
||||
ninja=""
|
||||
bindir="bin"
|
||||
skip_meson=no
|
||||
@@ -692,7 +690,7 @@ meson_option_build_array() {
|
||||
printf ']\n'
|
||||
}
|
||||
|
||||
. $source_path/scripts/meson-buildoptions.sh
|
||||
. "$source_path/scripts/meson-buildoptions.sh"
|
||||
|
||||
meson_options=
|
||||
meson_option_add() {
|
||||
@@ -712,7 +710,7 @@ for opt do
|
||||
case "$opt" in
|
||||
--help|-h) show_help=yes
|
||||
;;
|
||||
--version|-V) exec cat $source_path/VERSION
|
||||
--version|-V) exec cat "$source_path/VERSION"
|
||||
;;
|
||||
--prefix=*) prefix="$optarg"
|
||||
;;
|
||||
@@ -986,7 +984,7 @@ default_target_list=""
|
||||
mak_wilds=""
|
||||
|
||||
if [ "$linux_user" != no ]; then
|
||||
if [ "$targetos" = linux ] && [ -d $source_path/linux-user/include/host/$cpu ]; then
|
||||
if [ "$targetos" = linux ] && [ -d "$source_path/linux-user/include/host/$cpu" ]; then
|
||||
linux_user=yes
|
||||
elif [ "$linux_user" = yes ]; then
|
||||
error_exit "linux-user not supported on this architecture"
|
||||
@@ -996,7 +994,7 @@ if [ "$bsd_user" != no ]; then
|
||||
if [ "$bsd_user" = "" ]; then
|
||||
test $targetos = freebsd && bsd_user=yes
|
||||
fi
|
||||
if [ "$bsd_user" = yes ] && ! [ -d $source_path/bsd-user/$targetos ]; then
|
||||
if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$targetos" ]; then
|
||||
error_exit "bsd-user not supported on this host OS"
|
||||
fi
|
||||
fi
|
||||
@@ -1094,7 +1092,7 @@ exit 0
|
||||
fi
|
||||
|
||||
# Remove old dependency files to make sure that they get properly regenerated
|
||||
rm -f */config-devices.mak.d
|
||||
rm -f ./*/config-devices.mak.d
|
||||
|
||||
if test -z "$python"
|
||||
then
|
||||
@@ -1112,16 +1110,13 @@ if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
|
||||
"Use --python=/path/to/python to specify a supported Python."
|
||||
fi
|
||||
|
||||
# Preserve python version since some functionality is dependent on it
|
||||
python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null)
|
||||
|
||||
# Suppress writing compiled files
|
||||
python="$python -B"
|
||||
|
||||
if test -z "$meson"; then
|
||||
if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
|
||||
meson=meson
|
||||
elif test $git_submodules_action != 'ignore' ; then
|
||||
elif test "$git_submodules_action" != 'ignore' ; then
|
||||
meson=git
|
||||
elif test -e "${source_path}/meson/meson.py" ; then
|
||||
meson=internal
|
||||
@@ -1838,7 +1833,7 @@ esac
|
||||
container="no"
|
||||
if test $use_containers = "yes"; then
|
||||
if has "docker" || has "podman"; then
|
||||
container=$($python $source_path/tests/docker/docker.py probe)
|
||||
container=$($python "$source_path"/tests/docker/docker.py probe)
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -2070,7 +2065,6 @@ probe_target_compiler() {
|
||||
: ${container_cross_strip:=${container_cross_prefix}strip}
|
||||
done
|
||||
|
||||
local t try
|
||||
try=cross
|
||||
case "$target_arch:$cpu" in
|
||||
aarch64_be:aarch64 | \
|
||||
@@ -2083,8 +2077,8 @@ probe_target_compiler() {
|
||||
try='native cross' ;;
|
||||
esac
|
||||
eval "target_cflags=\${cross_cc_cflags_$target_arch}"
|
||||
for t in $try; do
|
||||
case $t in
|
||||
for thistry in $try; do
|
||||
case $thistry in
|
||||
native)
|
||||
target_cc=$cc
|
||||
target_ccas=$ccas
|
||||
@@ -2288,7 +2282,7 @@ if test "$QEMU_GA_DISTRO" = ""; then
|
||||
QEMU_GA_DISTRO=Linux
|
||||
fi
|
||||
if test "$QEMU_GA_VERSION" = ""; then
|
||||
QEMU_GA_VERSION=$(cat $source_path/VERSION)
|
||||
QEMU_GA_VERSION=$(cat "$source_path"/VERSION)
|
||||
fi
|
||||
|
||||
|
||||
@@ -2315,7 +2309,7 @@ LINKS="$LINKS python"
|
||||
LINKS="$LINKS contrib/plugins/Makefile "
|
||||
for f in $LINKS ; do
|
||||
if [ -e "$source_path/$f" ]; then
|
||||
mkdir -p `dirname ./$f`
|
||||
mkdir -p "$(dirname ./"$f")"
|
||||
symlink "$source_path/$f" "$f"
|
||||
fi
|
||||
done
|
||||
@@ -2537,7 +2531,7 @@ fi
|
||||
for target in $target_list; do
|
||||
target_dir="$target"
|
||||
target_name=$(echo $target | cut -d '-' -f 1)$EXESUF
|
||||
mkdir -p $target_dir
|
||||
mkdir -p "$target_dir"
|
||||
case $target in
|
||||
*-user) symlink "../qemu-$target_name" "$target_dir/qemu-$target_name" ;;
|
||||
*) symlink "../qemu-system-$target_name" "$target_dir/qemu-system-$target_name" ;;
|
||||
@@ -2572,14 +2566,14 @@ for target in $target_list; do
|
||||
config_target_mak=tests/tcg/config-$target.mak
|
||||
|
||||
echo "# Automatically generated by configure - do not modify" > $config_target_mak
|
||||
echo "TARGET_NAME=$arch" >> $config_target_mak
|
||||
echo "TARGET_NAME=$arch" >> "$config_target_mak"
|
||||
case $target in
|
||||
xtensa*-linux-user)
|
||||
# the toolchain is not complete with headers, only build softmmu tests
|
||||
continue
|
||||
;;
|
||||
*-softmmu)
|
||||
test -f $source_path/tests/tcg/$arch/Makefile.softmmu-target || continue
|
||||
test -f "$source_path/tests/tcg/$arch/Makefile.softmmu-target" || continue
|
||||
qemu="qemu-system-$arch"
|
||||
;;
|
||||
*-linux-user|*-bsd-user)
|
||||
@@ -2594,73 +2588,73 @@ for target in $target_list; do
|
||||
# compilers is a requirememt for adding a new test that needs a
|
||||
# compiler feature.
|
||||
|
||||
echo "BUILD_STATIC=$build_static" >> $config_target_mak
|
||||
write_target_makefile >> $config_target_mak
|
||||
echo "BUILD_STATIC=$build_static" >> "$config_target_mak"
|
||||
write_target_makefile >> "$config_target_mak"
|
||||
case $target in
|
||||
aarch64-*)
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-march=armv8.1-a+sve -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_SVE=y" >> "$config_target_mak"
|
||||
fi
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-march=armv8.1-a+sve2 -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_SVE2=y" >> "$config_target_mak"
|
||||
fi
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-march=armv8.3-a -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_3=y" >> "$config_target_mak"
|
||||
fi
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-mbranch-protection=standard -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_ARMV8_BTI=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_BTI=y" >> "$config_target_mak"
|
||||
fi
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-march=armv8.5-a+memtag -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_MTE=y" >> "$config_target_mak"
|
||||
fi
|
||||
;;
|
||||
ppc*)
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-mpower8-vector -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> "$config_target_mak"
|
||||
fi
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-mpower10 -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_POWER10=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_POWER10=y" >> "$config_target_mak"
|
||||
fi
|
||||
;;
|
||||
i386-linux-user)
|
||||
if do_compiler "$target_cc" $target_cflags \
|
||||
-Werror -fno-pie -o $TMPE $TMPC; then
|
||||
echo "CROSS_CC_HAS_I386_NOPIE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_I386_NOPIE=y" >> "$config_target_mak"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
elif test -n "$container_image"; then
|
||||
echo "build-tcg-tests-$target: docker-image-$container_image" >> $makefile
|
||||
echo "BUILD_STATIC=y" >> $config_target_mak
|
||||
write_container_target_makefile >> $config_target_mak
|
||||
echo "BUILD_STATIC=y" >> "$config_target_mak"
|
||||
write_container_target_makefile >> "$config_target_mak"
|
||||
case $target in
|
||||
aarch64-*)
|
||||
echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_BTI=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_SVE=y" >> "$config_target_mak"
|
||||
echo "CROSS_CC_HAS_SVE2=y" >> "$config_target_mak"
|
||||
echo "CROSS_CC_HAS_ARMV8_3=y" >> "$config_target_mak"
|
||||
echo "CROSS_CC_HAS_ARMV8_BTI=y" >> "$config_target_mak"
|
||||
echo "CROSS_CC_HAS_ARMV8_MTE=y" >> "$config_target_mak"
|
||||
;;
|
||||
ppc*)
|
||||
echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_POWER10=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> "$config_target_mak"
|
||||
echo "CROSS_CC_HAS_POWER10=y" >> "$config_target_mak"
|
||||
;;
|
||||
i386-linux-user)
|
||||
echo "CROSS_CC_HAS_I386_NOPIE=y" >> $config_target_mak
|
||||
echo "CROSS_CC_HAS_I386_NOPIE=y" >> "$config_target_mak"
|
||||
;;
|
||||
esac
|
||||
got_cross_cc=yes
|
||||
fi
|
||||
if test $got_cross_cc = yes; then
|
||||
mkdir -p tests/tcg/$target
|
||||
echo "QEMU=$PWD/$qemu" >> $config_target_mak
|
||||
echo "QEMU=$PWD/$qemu" >> "$config_target_mak"
|
||||
echo "run-tcg-tests-$target: $qemu\$(EXESUF)" >> $makefile
|
||||
tcg_tests_targets="$tcg_tests_targets $target"
|
||||
fi
|
||||
|
||||
@@ -267,6 +267,13 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list)
|
||||
{
|
||||
AcpiGedState *s = ACPI_GED(adev);
|
||||
|
||||
acpi_memory_ospm_status(&s->memhp_state, list);
|
||||
}
|
||||
|
||||
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||
{
|
||||
AcpiGedState *s = ACPI_GED(adev);
|
||||
@@ -409,6 +416,7 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
|
||||
hc->unplug_request = acpi_ged_unplug_request_cb;
|
||||
hc->unplug = acpi_ged_unplug_cb;
|
||||
|
||||
adevc->ospm_status = acpi_ged_ospm_status;
|
||||
adevc->send_event = acpi_ged_send_event;
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -163,6 +163,7 @@ int load_multiboot(X86MachineState *x86ms,
|
||||
uint8_t *mb_bootinfo_data;
|
||||
uint32_t cmdline_len;
|
||||
GList *mods = NULL;
|
||||
g_autofree char *kcmdline = NULL;
|
||||
|
||||
/* Ok, let's see if it is a multiboot image.
|
||||
The header is 12x32bit long, so the latest entry may be 8192 - 48. */
|
||||
@@ -362,9 +363,7 @@ int load_multiboot(X86MachineState *x86ms,
|
||||
}
|
||||
|
||||
/* Commandline support */
|
||||
char kcmdline[strlen(kernel_filename) + strlen(kernel_cmdline) + 2];
|
||||
snprintf(kcmdline, sizeof(kcmdline), "%s %s",
|
||||
kernel_filename, kernel_cmdline);
|
||||
kcmdline = g_strdup_printf("%s %s", kernel_filename, kernel_cmdline);
|
||||
stl_p(bootinfo + MBI_CMDLINE, mb_add_cmdline(&mbs, kcmdline));
|
||||
|
||||
stl_p(bootinfo + MBI_BOOTLOADER, mb_add_bootloader(&mbs, bootloader_name));
|
||||
|
||||
+1
-1
@@ -567,8 +567,8 @@ static void ics_reset_irq(ICSIRQState *irq)
|
||||
static void ics_reset(DeviceState *dev)
|
||||
{
|
||||
ICSState *ics = ICS(dev);
|
||||
g_autofree uint8_t *flags = g_malloc(ics->nr_irqs);
|
||||
int i;
|
||||
uint8_t flags[ics->nr_irqs];
|
||||
|
||||
for (i = 0; i < ics->nr_irqs; i++) {
|
||||
flags[i] = ics->irqs[i].flags;
|
||||
|
||||
@@ -696,30 +696,30 @@ static void update_rx_fifo(XlnxZynqMPCANState *s, const qemu_can_frame *frame)
|
||||
timestamp));
|
||||
|
||||
/* First 32 bit of the data. */
|
||||
fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA1_DB3_SHIFT,
|
||||
R_TXFIFO_DATA1_DB3_LENGTH,
|
||||
fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA1_DB3_SHIFT,
|
||||
R_RXFIFO_DATA1_DB3_LENGTH,
|
||||
frame->data[0]) |
|
||||
deposit32(0, R_TXFIFO_DATA1_DB2_SHIFT,
|
||||
R_TXFIFO_DATA1_DB2_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA1_DB2_SHIFT,
|
||||
R_RXFIFO_DATA1_DB2_LENGTH,
|
||||
frame->data[1]) |
|
||||
deposit32(0, R_TXFIFO_DATA1_DB1_SHIFT,
|
||||
R_TXFIFO_DATA1_DB1_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA1_DB1_SHIFT,
|
||||
R_RXFIFO_DATA1_DB1_LENGTH,
|
||||
frame->data[2]) |
|
||||
deposit32(0, R_TXFIFO_DATA1_DB0_SHIFT,
|
||||
R_TXFIFO_DATA1_DB0_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA1_DB0_SHIFT,
|
||||
R_RXFIFO_DATA1_DB0_LENGTH,
|
||||
frame->data[3]));
|
||||
/* Last 32 bit of the data. */
|
||||
fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA2_DB7_SHIFT,
|
||||
R_TXFIFO_DATA2_DB7_LENGTH,
|
||||
fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA2_DB7_SHIFT,
|
||||
R_RXFIFO_DATA2_DB7_LENGTH,
|
||||
frame->data[4]) |
|
||||
deposit32(0, R_TXFIFO_DATA2_DB6_SHIFT,
|
||||
R_TXFIFO_DATA2_DB6_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA2_DB6_SHIFT,
|
||||
R_RXFIFO_DATA2_DB6_LENGTH,
|
||||
frame->data[5]) |
|
||||
deposit32(0, R_TXFIFO_DATA2_DB5_SHIFT,
|
||||
R_TXFIFO_DATA2_DB5_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA2_DB5_SHIFT,
|
||||
R_RXFIFO_DATA2_DB5_LENGTH,
|
||||
frame->data[6]) |
|
||||
deposit32(0, R_TXFIFO_DATA2_DB4_SHIFT,
|
||||
R_TXFIFO_DATA2_DB4_LENGTH,
|
||||
deposit32(0, R_RXFIFO_DATA2_DB4_SHIFT,
|
||||
R_RXFIFO_DATA2_DB4_LENGTH,
|
||||
frame->data[7]));
|
||||
|
||||
ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
|
||||
|
||||
@@ -1622,15 +1622,16 @@ e1000e_rx_fix_l4_csum(E1000ECore *core, struct NetRxPkt *pkt)
|
||||
}
|
||||
}
|
||||
|
||||
/* Min. octets in an ethernet frame sans FCS */
|
||||
#define MIN_BUF_SIZE 60
|
||||
|
||||
ssize_t
|
||||
e1000e_receive_iov(E1000ECore *core, const struct iovec *iov, int iovcnt)
|
||||
{
|
||||
static const int maximum_ethernet_hdr_len = (14 + 4);
|
||||
/* Min. octets in an ethernet frame sans FCS */
|
||||
static const int min_buf_size = 60;
|
||||
|
||||
uint32_t n = 0;
|
||||
uint8_t min_buf[min_buf_size];
|
||||
uint8_t min_buf[MIN_BUF_SIZE];
|
||||
struct iovec min_iov;
|
||||
uint8_t *filter_buf;
|
||||
size_t size, orig_size;
|
||||
|
||||
@@ -696,6 +696,14 @@ static void do_tx_packet(lan9118_state *s)
|
||||
n = (s->tx_status_fifo_head + s->tx_status_fifo_used) & 511;
|
||||
s->tx_status_fifo[n] = status;
|
||||
s->tx_status_fifo_used++;
|
||||
|
||||
/*
|
||||
* Generate TSFL interrupt if TX FIFO level exceeds the level
|
||||
* specified in the FIFO_INT TX Status Level field.
|
||||
*/
|
||||
if (s->tx_status_fifo_used > ((s->fifo_int >> 16) & 0xff)) {
|
||||
s->int_sts |= TSFL_INT;
|
||||
}
|
||||
if (s->tx_status_fifo_used == 512) {
|
||||
s->int_sts |= TSFF_INT;
|
||||
/* TODO: Stop transmission. */
|
||||
|
||||
+2
-2
@@ -138,7 +138,7 @@ static void pnv_dt_core(PnvChip *chip, PnvCore *pc, void *fdt)
|
||||
int smt_threads = CPU_CORE(pc)->nr_threads;
|
||||
CPUPPCState *env = &cpu->env;
|
||||
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
|
||||
uint32_t servers_prop[smt_threads];
|
||||
g_autofree uint32_t *servers_prop = g_new(uint32_t, smt_threads);
|
||||
int i;
|
||||
uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
|
||||
0xffffffff, 0xffffffff};
|
||||
@@ -241,7 +241,7 @@ static void pnv_dt_core(PnvChip *chip, PnvCore *pc, void *fdt)
|
||||
servers_prop[i] = cpu_to_be32(pc->pir + i);
|
||||
}
|
||||
_FDT((fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
|
||||
servers_prop, sizeof(servers_prop))));
|
||||
servers_prop, sizeof(*servers_prop) * smt_threads)));
|
||||
}
|
||||
|
||||
static void pnv_dt_icp(PnvChip *chip, void *fdt, uint32_t pir,
|
||||
|
||||
+4
-4
@@ -177,8 +177,8 @@ static int spapr_fixup_cpu_smt_dt(void *fdt, int offset, PowerPCCPU *cpu,
|
||||
int smt_threads)
|
||||
{
|
||||
int i, ret = 0;
|
||||
uint32_t servers_prop[smt_threads];
|
||||
uint32_t gservers_prop[smt_threads * 2];
|
||||
g_autofree uint32_t *servers_prop = g_new(uint32_t, smt_threads);
|
||||
g_autofree uint32_t *gservers_prop = g_new(uint32_t, smt_threads * 2);
|
||||
int index = spapr_get_vcpu_id(cpu);
|
||||
|
||||
if (cpu->compat_pvr) {
|
||||
@@ -196,12 +196,12 @@ static int spapr_fixup_cpu_smt_dt(void *fdt, int offset, PowerPCCPU *cpu,
|
||||
gservers_prop[i*2 + 1] = 0;
|
||||
}
|
||||
ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
|
||||
servers_prop, sizeof(servers_prop));
|
||||
servers_prop, sizeof(*servers_prop) * smt_threads);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
ret = fdt_setprop(fdt, offset, "ibm,ppc-interrupt-gserver#s",
|
||||
gservers_prop, sizeof(gservers_prop));
|
||||
gservers_prop, sizeof(*gservers_prop) * smt_threads * 2);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -397,7 +397,7 @@ void spapr_phb_nvgpu_populate_pcidev_dt(PCIDevice *dev, void *fdt, int offset,
|
||||
continue;
|
||||
}
|
||||
if (dev == nvslot->gpdev) {
|
||||
uint32_t npus[nvslot->linknum];
|
||||
g_autofree uint32_t *npus = g_new(uint32_t, nvslot->linknum);
|
||||
|
||||
for (j = 0; j < nvslot->linknum; ++j) {
|
||||
PCIDevice *npdev = nvslot->links[j].npdev;
|
||||
|
||||
+4
-3
@@ -805,13 +805,14 @@ static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define HEX_CHAR_PER_LINE 16
|
||||
|
||||
static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
|
||||
{
|
||||
bool print16;
|
||||
bool printall;
|
||||
const int width = 16;
|
||||
int i;
|
||||
char tmp[3 * width + 1];
|
||||
char tmp[3 * HEX_CHAR_PER_LINE + 1];
|
||||
char *p = tmp;
|
||||
|
||||
print16 = !!trace_event_get_state_backends(TRACE_USB_OHCI_TD_PKT_SHORT);
|
||||
@@ -822,7 +823,7 @@ static void ohci_td_pkt(const char *msg, const uint8_t *buf, size_t len)
|
||||
}
|
||||
|
||||
for (i = 0; ; i++) {
|
||||
if (i && (!(i % width) || (i == len))) {
|
||||
if (i && (!(i % HEX_CHAR_PER_LINE) || (i == len))) {
|
||||
if (!printall) {
|
||||
trace_usb_ohci_td_pkt_short(msg, tmp);
|
||||
break;
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#define QIO_CHANNEL_WEBSOCK_CLIENT_KEY_LEN 24
|
||||
#define QIO_CHANNEL_WEBSOCK_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
|
||||
#define QIO_CHANNEL_WEBSOCK_GUID_LEN strlen(QIO_CHANNEL_WEBSOCK_GUID)
|
||||
#define QIO_CHANNEL_WEBSOCK_GUID_LEN (sizeof(QIO_CHANNEL_WEBSOCK_GUID) - 1)
|
||||
|
||||
#define QIO_CHANNEL_WEBSOCK_HEADER_PROTOCOL "sec-websocket-protocol"
|
||||
#define QIO_CHANNEL_WEBSOCK_HEADER_VERSION "sec-websocket-version"
|
||||
|
||||
+11
-16
@@ -3190,24 +3190,19 @@ static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
|
||||
MMUAccessType access_type, ARMMMUIdx mmu_idx)
|
||||
{
|
||||
hwaddr phys_addr;
|
||||
target_ulong page_size;
|
||||
int prot;
|
||||
bool ret;
|
||||
uint64_t par64;
|
||||
bool format64 = false;
|
||||
MemTxAttrs attrs = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
GetPhysAddrResult res = {};
|
||||
|
||||
ret = get_phys_addr(env, value, access_type, mmu_idx, &phys_addr, &attrs,
|
||||
&prot, &page_size, &fi, &cacheattrs);
|
||||
ret = get_phys_addr(env, value, access_type, mmu_idx, &res, &fi);
|
||||
|
||||
/*
|
||||
* ATS operations only do S1 or S1+S2 translations, so we never
|
||||
* have to deal with the ARMCacheAttrs format for S2 only.
|
||||
*/
|
||||
assert(!cacheattrs.is_s2_format);
|
||||
assert(!res.cacheattrs.is_s2_format);
|
||||
|
||||
if (ret) {
|
||||
/*
|
||||
@@ -3313,12 +3308,12 @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
|
||||
/* Create a 64-bit PAR */
|
||||
par64 = (1 << 11); /* LPAE bit always set */
|
||||
if (!ret) {
|
||||
par64 |= phys_addr & ~0xfffULL;
|
||||
if (!attrs.secure) {
|
||||
par64 |= res.phys & ~0xfffULL;
|
||||
if (!res.attrs.secure) {
|
||||
par64 |= (1 << 9); /* NS */
|
||||
}
|
||||
par64 |= (uint64_t)cacheattrs.attrs << 56; /* ATTR */
|
||||
par64 |= cacheattrs.shareability << 7; /* SH */
|
||||
par64 |= (uint64_t)res.cacheattrs.attrs << 56; /* ATTR */
|
||||
par64 |= res.cacheattrs.shareability << 7; /* SH */
|
||||
} else {
|
||||
uint32_t fsr = arm_fi_to_lfsc(&fi);
|
||||
|
||||
@@ -3338,13 +3333,13 @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
|
||||
*/
|
||||
if (!ret) {
|
||||
/* We do not set any attribute bits in the PAR */
|
||||
if (page_size == (1 << 24)
|
||||
if (res.page_size == (1 << 24)
|
||||
&& arm_feature(env, ARM_FEATURE_V7)) {
|
||||
par64 = (phys_addr & 0xff000000) | (1 << 1);
|
||||
par64 = (res.phys & 0xff000000) | (1 << 1);
|
||||
} else {
|
||||
par64 = phys_addr & 0xfffff000;
|
||||
par64 = res.phys & 0xfffff000;
|
||||
}
|
||||
if (!attrs.secure) {
|
||||
if (!res.attrs.secure) {
|
||||
par64 |= (1 << 9); /* NS */
|
||||
}
|
||||
} else {
|
||||
|
||||
+16
-10
@@ -1123,13 +1123,7 @@ typedef struct V8M_SAttributes {
|
||||
|
||||
void v8m_security_lookup(CPUARMState *env, uint32_t address,
|
||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||
V8M_SAttributes *sattrs);
|
||||
|
||||
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
|
||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||
hwaddr *phys_ptr, MemTxAttrs *txattrs,
|
||||
int *prot, bool *is_subpage,
|
||||
ARMMMUFaultInfo *fi, uint32_t *mregion);
|
||||
bool secure, V8M_SAttributes *sattrs);
|
||||
|
||||
/* Cacheability and shareability attributes for a memory access */
|
||||
typedef struct ARMCacheAttrs {
|
||||
@@ -1142,13 +1136,25 @@ typedef struct ARMCacheAttrs {
|
||||
bool is_s2_format:1;
|
||||
} ARMCacheAttrs;
|
||||
|
||||
/* Fields that are valid upon success. */
|
||||
typedef struct GetPhysAddrResult {
|
||||
hwaddr phys;
|
||||
target_ulong page_size;
|
||||
int prot;
|
||||
MemTxAttrs attrs;
|
||||
ARMCacheAttrs cacheattrs;
|
||||
} GetPhysAddrResult;
|
||||
|
||||
bool get_phys_addr(CPUARMState *env, target_ulong address,
|
||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||
hwaddr *phys_ptr, MemTxAttrs *attrs, int *prot,
|
||||
target_ulong *page_size,
|
||||
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
|
||||
GetPhysAddrResult *result, ARMMMUFaultInfo *fi)
|
||||
__attribute__((nonnull));
|
||||
|
||||
bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
|
||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||
bool is_secure, GetPhysAddrResult *result,
|
||||
ARMMMUFaultInfo *fi, uint32_t *mregion);
|
||||
|
||||
void arm_log_exception(CPUState *cs);
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
+29
-49
@@ -183,19 +183,14 @@ static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
|
||||
{
|
||||
CPUState *cs = CPU(cpu);
|
||||
CPUARMState *env = &cpu->env;
|
||||
MemTxAttrs attrs = {};
|
||||
MemTxResult txres;
|
||||
target_ulong page_size;
|
||||
hwaddr physaddr;
|
||||
int prot;
|
||||
GetPhysAddrResult res = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
|
||||
int exc;
|
||||
bool exc_secure;
|
||||
|
||||
if (get_phys_addr(env, addr, MMU_DATA_STORE, mmu_idx, &physaddr,
|
||||
&attrs, &prot, &page_size, &fi, &cacheattrs)) {
|
||||
if (get_phys_addr(env, addr, MMU_DATA_STORE, mmu_idx, &res, &fi)) {
|
||||
/* MPU/SAU lookup failed */
|
||||
if (fi.type == ARMFault_QEMU_SFault) {
|
||||
if (mode == STACK_LAZYFP) {
|
||||
@@ -228,8 +223,8 @@ static bool v7m_stack_write(ARMCPU *cpu, uint32_t addr, uint32_t value,
|
||||
}
|
||||
goto pend_fault;
|
||||
}
|
||||
address_space_stl_le(arm_addressspace(cs, attrs), physaddr, value,
|
||||
attrs, &txres);
|
||||
address_space_stl_le(arm_addressspace(cs, res.attrs), res.phys, value,
|
||||
res.attrs, &txres);
|
||||
if (txres != MEMTX_OK) {
|
||||
/* BusFault trying to write the data */
|
||||
if (mode == STACK_LAZYFP) {
|
||||
@@ -276,20 +271,15 @@ static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
|
||||
{
|
||||
CPUState *cs = CPU(cpu);
|
||||
CPUARMState *env = &cpu->env;
|
||||
MemTxAttrs attrs = {};
|
||||
MemTxResult txres;
|
||||
target_ulong page_size;
|
||||
hwaddr physaddr;
|
||||
int prot;
|
||||
GetPhysAddrResult res = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
bool secure = mmu_idx & ARM_MMU_IDX_M_S;
|
||||
int exc;
|
||||
bool exc_secure;
|
||||
uint32_t value;
|
||||
|
||||
if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &physaddr,
|
||||
&attrs, &prot, &page_size, &fi, &cacheattrs)) {
|
||||
if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &res, &fi)) {
|
||||
/* MPU/SAU lookup failed */
|
||||
if (fi.type == ARMFault_QEMU_SFault) {
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
@@ -308,8 +298,8 @@ static bool v7m_stack_read(ARMCPU *cpu, uint32_t *dest, uint32_t addr,
|
||||
goto pend_fault;
|
||||
}
|
||||
|
||||
value = address_space_ldl(arm_addressspace(cs, attrs), physaddr,
|
||||
attrs, &txres);
|
||||
value = address_space_ldl(arm_addressspace(cs, res.attrs), res.phys,
|
||||
res.attrs, &txres);
|
||||
if (txres != MEMTX_OK) {
|
||||
/* BusFault trying to read the data */
|
||||
qemu_log_mask(CPU_LOG_INT, "...BusFault with BFSR.UNSTKERR\n");
|
||||
@@ -699,7 +689,8 @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
|
||||
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
|
||||
V8M_SAttributes sattrs = {};
|
||||
|
||||
v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, &sattrs);
|
||||
v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
|
||||
targets_secure, &sattrs);
|
||||
if (sattrs.ns) {
|
||||
attrs.secure = false;
|
||||
} else if (!targets_secure) {
|
||||
@@ -2008,15 +1999,12 @@ static bool v7m_read_half_insn(ARMCPU *cpu, ARMMMUIdx mmu_idx,
|
||||
CPUState *cs = CPU(cpu);
|
||||
CPUARMState *env = &cpu->env;
|
||||
V8M_SAttributes sattrs = {};
|
||||
MemTxAttrs attrs = {};
|
||||
GetPhysAddrResult res = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
MemTxResult txres;
|
||||
target_ulong page_size;
|
||||
hwaddr physaddr;
|
||||
int prot;
|
||||
|
||||
v8m_security_lookup(env, addr, MMU_INST_FETCH, mmu_idx, &sattrs);
|
||||
v8m_security_lookup(env, addr, MMU_INST_FETCH, mmu_idx,
|
||||
regime_is_secure(env, mmu_idx), &sattrs);
|
||||
if (!sattrs.nsc || sattrs.ns) {
|
||||
/*
|
||||
* This must be the second half of the insn, and it straddles a
|
||||
@@ -2028,16 +2016,15 @@ static bool v7m_read_half_insn(ARMCPU *cpu, ARMMMUIdx mmu_idx,
|
||||
"...really SecureFault with SFSR.INVEP\n");
|
||||
return false;
|
||||
}
|
||||
if (get_phys_addr(env, addr, MMU_INST_FETCH, mmu_idx, &physaddr,
|
||||
&attrs, &prot, &page_size, &fi, &cacheattrs)) {
|
||||
if (get_phys_addr(env, addr, MMU_INST_FETCH, mmu_idx, &res, &fi)) {
|
||||
/* the MPU lookup failed */
|
||||
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_IACCVIOL_MASK;
|
||||
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_MEM, env->v7m.secure);
|
||||
qemu_log_mask(CPU_LOG_INT, "...really MemManage with CFSR.IACCVIOL\n");
|
||||
return false;
|
||||
}
|
||||
*insn = address_space_lduw_le(arm_addressspace(cs, attrs), physaddr,
|
||||
attrs, &txres);
|
||||
*insn = address_space_lduw_le(arm_addressspace(cs, res.attrs), res.phys,
|
||||
res.attrs, &txres);
|
||||
if (txres != MEMTX_OK) {
|
||||
env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_IBUSERR_MASK;
|
||||
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_BUS, false);
|
||||
@@ -2060,17 +2047,12 @@ static bool v7m_read_sg_stack_word(ARMCPU *cpu, ARMMMUIdx mmu_idx,
|
||||
*/
|
||||
CPUState *cs = CPU(cpu);
|
||||
CPUARMState *env = &cpu->env;
|
||||
MemTxAttrs attrs = {};
|
||||
MemTxResult txres;
|
||||
target_ulong page_size;
|
||||
hwaddr physaddr;
|
||||
int prot;
|
||||
GetPhysAddrResult res = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
uint32_t value;
|
||||
|
||||
if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &physaddr,
|
||||
&attrs, &prot, &page_size, &fi, &cacheattrs)) {
|
||||
if (get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &res, &fi)) {
|
||||
/* MPU/SAU lookup failed */
|
||||
if (fi.type == ARMFault_QEMU_SFault) {
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
@@ -2088,8 +2070,8 @@ static bool v7m_read_sg_stack_word(ARMCPU *cpu, ARMMMUIdx mmu_idx,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
value = address_space_ldl(arm_addressspace(cs, attrs), physaddr,
|
||||
attrs, &txres);
|
||||
value = address_space_ldl(arm_addressspace(cs, res.attrs), res.phys,
|
||||
res.attrs, &txres);
|
||||
if (txres != MEMTX_OK) {
|
||||
/* BusFault trying to read the data */
|
||||
qemu_log_mask(CPU_LOG_INT,
|
||||
@@ -2790,15 +2772,10 @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
|
||||
V8M_SAttributes sattrs = {};
|
||||
uint32_t tt_resp;
|
||||
bool r, rw, nsr, nsrw, mrvalid;
|
||||
int prot;
|
||||
ARMMMUFaultInfo fi = {};
|
||||
MemTxAttrs attrs = {};
|
||||
hwaddr phys_addr;
|
||||
ARMMMUIdx mmu_idx;
|
||||
uint32_t mregion;
|
||||
bool targetpriv;
|
||||
bool targetsec = env->v7m.secure;
|
||||
bool is_subpage;
|
||||
|
||||
/*
|
||||
* Work out what the security state and privilege level we're
|
||||
@@ -2829,18 +2806,20 @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
|
||||
* inspecting the other MPU state.
|
||||
*/
|
||||
if (arm_current_el(env) != 0 || alt) {
|
||||
GetPhysAddrResult res = {};
|
||||
ARMMMUFaultInfo fi = {};
|
||||
|
||||
/* We can ignore the return value as prot is always set */
|
||||
pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
|
||||
&phys_addr, &attrs, &prot, &is_subpage,
|
||||
&fi, &mregion);
|
||||
pmsav8_mpu_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, targetsec,
|
||||
&res, &fi, &mregion);
|
||||
if (mregion == -1) {
|
||||
mrvalid = false;
|
||||
mregion = 0;
|
||||
} else {
|
||||
mrvalid = true;
|
||||
}
|
||||
r = prot & PAGE_READ;
|
||||
rw = prot & PAGE_WRITE;
|
||||
r = res.prot & PAGE_READ;
|
||||
rw = res.prot & PAGE_WRITE;
|
||||
} else {
|
||||
r = false;
|
||||
rw = false;
|
||||
@@ -2849,7 +2828,8 @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
|
||||
}
|
||||
|
||||
if (env->v7m.secure) {
|
||||
v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx, &sattrs);
|
||||
v8m_security_lookup(env, addr, MMU_DATA_LOAD, mmu_idx,
|
||||
targetsec, &sattrs);
|
||||
nsr = sattrs.ns && r;
|
||||
nsrw = sattrs.ns && rw;
|
||||
} else {
|
||||
|
||||
+171
-193
File diff suppressed because it is too large
Load Diff
+9
-13
@@ -209,11 +209,8 @@ bool arm_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
ARMMMUFaultInfo fi = {};
|
||||
hwaddr phys_addr;
|
||||
target_ulong page_size;
|
||||
int prot, ret;
|
||||
MemTxAttrs attrs = {};
|
||||
ARMCacheAttrs cacheattrs = {};
|
||||
GetPhysAddrResult res = {};
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Walk the page table and (if the mapping exists) add the page
|
||||
@@ -223,25 +220,24 @@ bool arm_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||
*/
|
||||
ret = get_phys_addr(&cpu->env, address, access_type,
|
||||
core_to_arm_mmu_idx(&cpu->env, mmu_idx),
|
||||
&phys_addr, &attrs, &prot, &page_size,
|
||||
&fi, &cacheattrs);
|
||||
&res, &fi);
|
||||
if (likely(!ret)) {
|
||||
/*
|
||||
* Map a single [sub]page. Regions smaller than our declared
|
||||
* target page size are handled specially, so for those we
|
||||
* pass in the exact addresses.
|
||||
*/
|
||||
if (page_size >= TARGET_PAGE_SIZE) {
|
||||
phys_addr &= TARGET_PAGE_MASK;
|
||||
if (res.page_size >= TARGET_PAGE_SIZE) {
|
||||
res.phys &= TARGET_PAGE_MASK;
|
||||
address &= TARGET_PAGE_MASK;
|
||||
}
|
||||
/* Notice and record tagged memory. */
|
||||
if (cpu_isar_feature(aa64_mte, cpu) && cacheattrs.attrs == 0xf0) {
|
||||
arm_tlb_mte_tagged(&attrs) = true;
|
||||
if (cpu_isar_feature(aa64_mte, cpu) && res.cacheattrs.attrs == 0xf0) {
|
||||
arm_tlb_mte_tagged(&res.attrs) = true;
|
||||
}
|
||||
|
||||
tlb_set_page_with_attrs(cs, address, phys_addr, attrs,
|
||||
prot, mmu_idx, page_size);
|
||||
tlb_set_page_with_attrs(cs, address, res.phys, res.attrs,
|
||||
res.prot, mmu_idx, res.page_size);
|
||||
return true;
|
||||
} else if (probe) {
|
||||
return false;
|
||||
|
||||
@@ -584,7 +584,11 @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
|
||||
case 3:
|
||||
return false;
|
||||
case 4:
|
||||
align = pow2_align(size + 2);
|
||||
if (size == 2) {
|
||||
align = pow2_align(3);
|
||||
} else {
|
||||
align = pow2_align(size + 2);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
|
||||
@@ -87,17 +87,16 @@ static void save_buffer(const uint8_t *buf, size_t buf_size)
|
||||
static void compare_vmstate(const uint8_t *wire, size_t size)
|
||||
{
|
||||
QEMUFile *f = open_test_file(false);
|
||||
uint8_t result[size];
|
||||
g_autofree uint8_t *result = g_malloc(size);
|
||||
|
||||
/* read back as binary */
|
||||
|
||||
g_assert_cmpint(qemu_get_buffer(f, result, sizeof(result)), ==,
|
||||
sizeof(result));
|
||||
g_assert_cmpint(qemu_get_buffer(f, result, size), ==, size);
|
||||
g_assert(!qemu_file_get_error(f));
|
||||
|
||||
/* Compare that what is on the file is the same that what we
|
||||
expected to be there */
|
||||
SUCCESS(memcmp(result, wire, sizeof(result)));
|
||||
SUCCESS(memcmp(result, wire, size));
|
||||
|
||||
/* Must reach EOF */
|
||||
qemu_get_byte(f);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user