mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-target-arm-20230502-2' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue: * Support building Arm targets with CONFIG_TCG=no (ie KVM only) * hw/net: npcm7xx_emc: set MAC in register space * hw/arm/bcm2835_property: Implement "get command line" message * Deprecate the '-singlestep' command line option in favour of '-one-insn-per-tb' and '-accel one-insn-per-tb=on' * Deprecate 'singlestep' member of QMP StatusInfo struct * docs/about/deprecated.rst: Add "since 7.1" tag to dtb-kaslr-seed deprecation * hw/net/msf2-emac: Don't modify descriptor in-place in emac_store_desc() * raspi, aspeed: Write bootloader code correctly on big-endian hosts * hw/intc/allwinner-a10-pic: Fix bug on big-endian hosts * Fix bug in A32 ERET on big-endian hosts that caused guest crash * hw/sd/allwinner-sdhost: Correctly byteswap descriptor fields * hw/net/allwinner-sun8i-emac: Correctly byteswap descriptor fields # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmRRIqoZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3uHxEACkO5NYXhah9KnztwhEjAUH # CnM6N9IHa4iEF7doWuiS39ZP4bXxCHnX4A1GqGRhsoub5PeiXxucTXlvkwWpOfct # pX78wHW18pVNJ2jlaly0c9cEI71ojT4zbXC3kjD9f/qHx2qI3rs3Sgb6BYC8QNnx # P/EHeefrnjwgGhBvzAJ8ATO/jpMYXukuxzjbIP0/7lqB5UxcNxv5rMTTansMO46r # JN5NdOEM8M8DoJHrHR9K3+Y2Vr1XjOowDPSF8+4rRkJB2v/3415V9bInEsTAvhQu # Ftua72vjVhTRfvgLXPc9C9S5sx6KHi+NdHfl/D7eL8B4aGHtBaUXv7pJrXUZYyLy # XNztXUx5EuzxXVN2mg8PYyasnEGjNbTUckAD40iow+DSgemB+MVJRp8f7Rb2yRHh # YuajDs77NUb9rVzozM+TTJkHfgLDkWCqX2Jm2kAea/gwowzdFCVosAs0cI+cDiBb # xQUMpERGBE2QJk/+KKc5xmIHUnXZCFTC/ieY2mpr8G6upDspzP254EjNGUCgIZmW # gYI/UTSX+f7M/+fYRgtSCdJ4LYkqdxUuGfyKccc4S2F2cCuQDGURRp4jHuI1cLyt # lkrgD1Hj3d9d8ZiMwmXDtiEsJhxDmuVmikmviigfhjLZ0QBd7FdpNz7gQR3lfDwl # YEGeFrhW2MHutjWSwxQWwQ== # =ua3Q # -----END PGP SIGNATURE----- # gpg: Signature made Tue 02 May 2023 03:48:10 PM BST # 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] * tag 'pull-target-arm-20230502-2' of https://git.linaro.org/people/pmaydell/qemu-arm: (34 commits) hw/net/allwinner-sun8i-emac: Correctly byteswap descriptor fields hw/sd/allwinner-sdhost: Correctly byteswap descriptor fields target/arm: Add compile time asserts to load/store_cpu_field macros target/arm: Define and use new load_cpu_field_low32() hw/intc/allwinner-a10-pic: Don't use set_bit()/clear_bit() hw/arm/raspi: Use arm_write_bootloader() to write boot code hw/arm/aspeed: Use arm_write_bootloader() to write the bootloader hw/arm/boot: Make write_bootloader() public as arm_write_bootloader() hw/net/msf2-emac: Don't modify descriptor in-place in emac_store_desc() docs/about/deprecated.rst: Add "since 7.1" tag to dtb-kaslr-seed deprecation qmp: Deprecate 'singlestep' member of StatusInfo qapi/run-state.json: Fix missing newline at end of file hmp: Add 'one-insn-per-tb' command equivalent to 'singlestep' accel/tcg: Report one-insn-per-tb in 'info jit', not 'info status' Document that -singlestep command line option is deprecated bsd-user: Add '-one-insn-per-tb' option equivalent to '-singlestep' linux-user: Add '-one-insn-per-tb' option equivalent to '-singlestep' accel/tcg: Use one_insn_per_tb global instead of old singlestep global softmmu: Don't use 'singlestep' global in QMP and HMP commands make one-insn-per-tb an accel option ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -159,7 +159,7 @@ uint32_t curr_cflags(CPUState *cpu)
|
||||
*/
|
||||
if (unlikely(cpu->singlestep_enabled)) {
|
||||
cflags |= CF_NO_GOTO_TB | CF_NO_GOTO_PTR | CF_SINGLE_STEP | 1;
|
||||
} else if (singlestep) {
|
||||
} else if (qatomic_read(&one_insn_per_tb)) {
|
||||
cflags |= CF_NO_GOTO_TB | 1;
|
||||
} else if (qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) {
|
||||
cflags |= CF_NO_GOTO_TB;
|
||||
|
||||
@@ -67,4 +67,6 @@ static inline target_ulong log_pc(CPUState *cpu, const TranslationBlock *tb)
|
||||
extern int64_t max_delay;
|
||||
extern int64_t max_advance;
|
||||
|
||||
extern bool one_insn_per_tb;
|
||||
|
||||
#endif /* ACCEL_TCG_INTERNAL_H */
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/accel.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/type-helpers.h"
|
||||
#include "qapi/qapi-commands-machine.h"
|
||||
@@ -36,6 +37,18 @@ static void dump_drift_info(GString *buf)
|
||||
}
|
||||
}
|
||||
|
||||
static void dump_accel_info(GString *buf)
|
||||
{
|
||||
AccelState *accel = current_accel();
|
||||
bool one_insn_per_tb = object_property_get_bool(OBJECT(accel),
|
||||
"one-insn-per-tb",
|
||||
&error_fatal);
|
||||
|
||||
g_string_append_printf(buf, "Accelerator settings:\n");
|
||||
g_string_append_printf(buf, "one-insn-per-tb: %s\n\n",
|
||||
one_insn_per_tb ? "on" : "off");
|
||||
}
|
||||
|
||||
HumanReadableText *qmp_x_query_jit(Error **errp)
|
||||
{
|
||||
g_autoptr(GString) buf = g_string_new("");
|
||||
@@ -45,6 +58,7 @@ HumanReadableText *qmp_x_query_jit(Error **errp)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dump_accel_info(buf);
|
||||
dump_exec_info(buf);
|
||||
dump_drift_info(buf);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/accel.h"
|
||||
#include "qemu/atomic.h"
|
||||
#include "qapi/qapi-builtin-visit.h"
|
||||
#include "qemu/units.h"
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
@@ -42,6 +43,7 @@ struct TCGState {
|
||||
AccelState parent_obj;
|
||||
|
||||
bool mttcg_enabled;
|
||||
bool one_insn_per_tb;
|
||||
int splitwx_enabled;
|
||||
unsigned long tb_size;
|
||||
};
|
||||
@@ -109,6 +111,7 @@ static void tcg_accel_instance_init(Object *obj)
|
||||
}
|
||||
|
||||
bool mttcg_enabled;
|
||||
bool one_insn_per_tb;
|
||||
|
||||
static int tcg_init_machine(MachineState *ms)
|
||||
{
|
||||
@@ -208,6 +211,20 @@ static void tcg_set_splitwx(Object *obj, bool value, Error **errp)
|
||||
s->splitwx_enabled = value;
|
||||
}
|
||||
|
||||
static bool tcg_get_one_insn_per_tb(Object *obj, Error **errp)
|
||||
{
|
||||
TCGState *s = TCG_STATE(obj);
|
||||
return s->one_insn_per_tb;
|
||||
}
|
||||
|
||||
static void tcg_set_one_insn_per_tb(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
TCGState *s = TCG_STATE(obj);
|
||||
s->one_insn_per_tb = value;
|
||||
/* Set the global also: this changes the behaviour */
|
||||
qatomic_set(&one_insn_per_tb, value);
|
||||
}
|
||||
|
||||
static int tcg_gdbstub_supported_sstep_flags(void)
|
||||
{
|
||||
/*
|
||||
@@ -245,6 +262,12 @@ static void tcg_accel_class_init(ObjectClass *oc, void *data)
|
||||
tcg_get_splitwx, tcg_set_splitwx);
|
||||
object_class_property_set_description(oc, "split-wx",
|
||||
"Map jit pages into separate RW and RX regions");
|
||||
|
||||
object_class_property_add_bool(oc, "one-insn-per-tb",
|
||||
tcg_get_one_insn_per_tb,
|
||||
tcg_set_one_insn_per_tb);
|
||||
object_class_property_set_description(oc, "one-insn-per-tb",
|
||||
"Only put one guest insn in each translation block");
|
||||
}
|
||||
|
||||
static const TypeInfo tcg_accel_type = {
|
||||
|
||||
+9
-5
@@ -49,7 +49,7 @@
|
||||
#include "host-os.h"
|
||||
#include "target_arch_cpu.h"
|
||||
|
||||
int singlestep;
|
||||
static bool opt_one_insn_per_tb;
|
||||
uintptr_t guest_base;
|
||||
bool have_guest_base;
|
||||
/*
|
||||
@@ -162,7 +162,8 @@ static void usage(void)
|
||||
"-d item1[,...] enable logging of specified items\n"
|
||||
" (use '-d help' for a list of log items)\n"
|
||||
"-D logfile write logs to 'logfile' (default stderr)\n"
|
||||
"-singlestep always run in singlestep mode\n"
|
||||
"-one-insn-per-tb run with one guest instruction per emulated TB\n"
|
||||
"-singlestep deprecated synonym for -one-insn-per-tb\n"
|
||||
"-strace log system calls\n"
|
||||
"-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
||||
" specify tracing options\n"
|
||||
@@ -385,8 +386,8 @@ int main(int argc, char **argv)
|
||||
(void) envlist_unsetenv(envlist, "LD_PRELOAD");
|
||||
} else if (!strcmp(r, "seed")) {
|
||||
seed_optarg = optarg;
|
||||
} else if (!strcmp(r, "singlestep")) {
|
||||
singlestep = 1;
|
||||
} else if (!strcmp(r, "singlestep") || !strcmp(r, "one-insn-per-tb")) {
|
||||
opt_one_insn_per_tb = true;
|
||||
} else if (!strcmp(r, "strace")) {
|
||||
do_strace = 1;
|
||||
} else if (!strcmp(r, "trace")) {
|
||||
@@ -444,9 +445,12 @@ int main(int argc, char **argv)
|
||||
|
||||
/* init tcg before creating CPUs and to get qemu_host_page_size */
|
||||
{
|
||||
AccelClass *ac = ACCEL_GET_CLASS(current_accel());
|
||||
AccelState *accel = current_accel();
|
||||
AccelClass *ac = ACCEL_GET_CLASS(accel);
|
||||
|
||||
accel_init_interfaces(ac);
|
||||
object_property_set_bool(OBJECT(accel), "one-insn-per-tb",
|
||||
opt_one_insn_per_tb, &error_abort);
|
||||
ac->init_machine(NULL);
|
||||
}
|
||||
cpu = cpu_create(cpu_type);
|
||||
|
||||
@@ -2,7 +2,3 @@
|
||||
|
||||
# We support all the 32 bit boards so need all their config
|
||||
include ../arm-softmmu/default.mak
|
||||
|
||||
CONFIG_XLNX_ZYNQMP_ARM=y
|
||||
CONFIG_XLNX_VERSAL=y
|
||||
CONFIG_SBSA_REF=y
|
||||
|
||||
@@ -4,42 +4,3 @@
|
||||
# CONFIG_TEST_DEVICES=n
|
||||
|
||||
CONFIG_ARM_VIRT=y
|
||||
CONFIG_CUBIEBOARD=y
|
||||
CONFIG_EXYNOS4=y
|
||||
CONFIG_HIGHBANK=y
|
||||
CONFIG_INTEGRATOR=y
|
||||
CONFIG_FSL_IMX31=y
|
||||
CONFIG_MUSICPAL=y
|
||||
CONFIG_MUSCA=y
|
||||
CONFIG_CHEETAH=y
|
||||
CONFIG_SX1=y
|
||||
CONFIG_NSERIES=y
|
||||
CONFIG_STELLARIS=y
|
||||
CONFIG_STM32VLDISCOVERY=y
|
||||
CONFIG_REALVIEW=y
|
||||
CONFIG_VERSATILE=y
|
||||
CONFIG_VEXPRESS=y
|
||||
CONFIG_ZYNQ=y
|
||||
CONFIG_MAINSTONE=y
|
||||
CONFIG_GUMSTIX=y
|
||||
CONFIG_SPITZ=y
|
||||
CONFIG_TOSA=y
|
||||
CONFIG_Z2=y
|
||||
CONFIG_NPCM7XX=y
|
||||
CONFIG_COLLIE=y
|
||||
CONFIG_ASPEED_SOC=y
|
||||
CONFIG_NETDUINO2=y
|
||||
CONFIG_NETDUINOPLUS2=y
|
||||
CONFIG_OLIMEX_STM32_H405=y
|
||||
CONFIG_MPS2=y
|
||||
CONFIG_RASPI=y
|
||||
CONFIG_DIGIC=y
|
||||
CONFIG_SABRELITE=y
|
||||
CONFIG_EMCRAFT_SF2=y
|
||||
CONFIG_MICROBIT=y
|
||||
CONFIG_FSL_IMX25=y
|
||||
CONFIG_FSL_IMX7=y
|
||||
CONFIG_FSL_IMX6UL=y
|
||||
CONFIG_SEMIHOSTING=y
|
||||
CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y
|
||||
CONFIG_ALLWINNER_H3=y
|
||||
|
||||
@@ -111,6 +111,22 @@ Use ``-machine acpi=off`` instead.
|
||||
The HAXM project has been retired (see https://github.com/intel/haxm#status).
|
||||
Use "whpx" (on Windows) or "hvf" (on macOS) instead.
|
||||
|
||||
``-singlestep`` (since 8.1)
|
||||
'''''''''''''''''''''''''''
|
||||
|
||||
The ``-singlestep`` option has been turned into an accelerator property,
|
||||
and given a name that better reflects what it actually does.
|
||||
Use ``-accel tcg,one-insn-per-tb=on`` instead.
|
||||
|
||||
User-mode emulator command line arguments
|
||||
-----------------------------------------
|
||||
|
||||
``-singlestep`` (since 8.1)
|
||||
'''''''''''''''''''''''''''
|
||||
|
||||
The ``-singlestep`` option has been given a name that better reflects
|
||||
what it actually does. For both linux-user and bsd-user, use the
|
||||
new ``-one-insn-per-tb`` option instead.
|
||||
|
||||
QEMU Machine Protocol (QMP) commands
|
||||
------------------------------------
|
||||
@@ -183,6 +199,29 @@ accepted incorrect commands will return an error. Users should make sure that
|
||||
all arguments passed to ``device_add`` are consistent with the documented
|
||||
property types.
|
||||
|
||||
``StatusInfo`` member ``singlestep`` (since 8.1)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
The ``singlestep`` member of the ``StatusInfo`` returned from the
|
||||
``query-status`` command is deprecated. This member has a confusing
|
||||
name and it never did what the documentation claimed or what its name
|
||||
suggests. We do not believe that anybody is actually using the
|
||||
information provided in this member.
|
||||
|
||||
The information it reports is whether the TCG JIT is in "one
|
||||
instruction per translated block" mode (which can be set on the
|
||||
command line or via the HMP, but not via QMP). The information remains
|
||||
available via the HMP 'info jit' command.
|
||||
|
||||
Human Monitor Protocol (HMP) commands
|
||||
-------------------------------------
|
||||
|
||||
``singlestep`` (since 8.1)
|
||||
''''''''''''''''''''''''''
|
||||
|
||||
The ``singlestep`` command has been replaced by the ``one-insn-per-tb``
|
||||
command, which has the same behaviour but a less misleading name.
|
||||
|
||||
Host Architectures
|
||||
------------------
|
||||
|
||||
@@ -219,8 +258,8 @@ Use the more generic event ``DEVICE_UNPLUG_GUEST_ERROR`` instead.
|
||||
System emulator machines
|
||||
------------------------
|
||||
|
||||
Arm ``virt`` machine ``dtb-kaslr-seed`` property
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
Arm ``virt`` machine ``dtb-kaslr-seed`` property (since 7.1)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
The ``dtb-kaslr-seed`` property on the ``virt`` board has been
|
||||
deprecated; use the new name ``dtb-randomness`` instead. The new name
|
||||
|
||||
+12
-2
@@ -93,8 +93,13 @@ Debug options:
|
||||
``-g port``
|
||||
Wait gdb connection to port
|
||||
|
||||
``-one-insn-per-tb``
|
||||
Run the emulation with one guest instruction per translation block.
|
||||
This slows down emulation a lot, but can be useful in some situations,
|
||||
such as when trying to analyse the logs produced by the ``-d`` option.
|
||||
|
||||
``-singlestep``
|
||||
Run the emulation in single step mode.
|
||||
This is a deprecated synonym for the ``-one-insn-per-tb`` option.
|
||||
|
||||
Environment variables:
|
||||
|
||||
@@ -242,5 +247,10 @@ Debug options:
|
||||
``-p pagesize``
|
||||
Act as if the host page size was 'pagesize' bytes
|
||||
|
||||
``-one-insn-per-tb``
|
||||
Run the emulation with one guest instruction per translation block.
|
||||
This slows down emulation a lot, but can be useful in some situations,
|
||||
such as when trying to analyse the logs produced by the ``-d`` option.
|
||||
|
||||
``-singlestep``
|
||||
Run the emulation in single step mode.
|
||||
This is a deprecated synonym for the ``-one-insn-per-tb`` option.
|
||||
|
||||
+21
-4
@@ -378,18 +378,35 @@ SRST
|
||||
only *tag* as parameter.
|
||||
ERST
|
||||
|
||||
{
|
||||
.name = "one-insn-per-tb",
|
||||
.args_type = "option:s?",
|
||||
.params = "[on|off]",
|
||||
.help = "run emulation with one guest instruction per translation block",
|
||||
.cmd = hmp_one_insn_per_tb,
|
||||
},
|
||||
|
||||
SRST
|
||||
``one-insn-per-tb [off]``
|
||||
Run the emulation with one guest instruction per translation block.
|
||||
This slows down emulation a lot, but can be useful in some situations,
|
||||
such as when trying to analyse the logs produced by the ``-d`` option.
|
||||
This only has an effect when using TCG, not with KVM or other accelerators.
|
||||
|
||||
If called with option off, the emulation returns to normal mode.
|
||||
ERST
|
||||
|
||||
{
|
||||
.name = "singlestep",
|
||||
.args_type = "option:s?",
|
||||
.params = "[on|off]",
|
||||
.help = "run emulation in singlestep mode or switch to normal mode",
|
||||
.cmd = hmp_singlestep,
|
||||
.help = "deprecated synonym for one-insn-per-tb",
|
||||
.cmd = hmp_one_insn_per_tb,
|
||||
},
|
||||
|
||||
SRST
|
||||
``singlestep [off]``
|
||||
Run the emulation in single step mode.
|
||||
If called with option off, the emulation returns to normal mode.
|
||||
This is a deprecated synonym for the one-insn-per-tb command.
|
||||
ERST
|
||||
|
||||
{
|
||||
|
||||
+41
-2
@@ -35,20 +35,24 @@ config ARM_VIRT
|
||||
|
||||
config CHEETAH
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select OMAP
|
||||
select TSC210X
|
||||
|
||||
config CUBIEBOARD
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ALLWINNER_A10
|
||||
|
||||
config DIGIC
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select PTIMER
|
||||
select PFLASH_CFI02
|
||||
|
||||
config EXYNOS4
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select A9MPCORE
|
||||
select I2C
|
||||
@@ -61,6 +65,7 @@ config EXYNOS4
|
||||
|
||||
config HIGHBANK
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select A9MPCORE
|
||||
select A15MPCORE
|
||||
select AHCI
|
||||
@@ -75,6 +80,7 @@ config HIGHBANK
|
||||
|
||||
config INTEGRATOR
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ARM_TIMER
|
||||
select INTEGRATOR_DEBUG
|
||||
select PL011 # UART
|
||||
@@ -87,12 +93,14 @@ config INTEGRATOR
|
||||
|
||||
config MAINSTONE
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select PXA2XX
|
||||
select PFLASH_CFI01
|
||||
select SMC91C111
|
||||
|
||||
config MUSCA
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ARMSSE
|
||||
select PL011
|
||||
select PL031
|
||||
@@ -104,6 +112,7 @@ config MARVELL_88W8618
|
||||
|
||||
config MUSICPAL
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select OR_IRQ
|
||||
select BITBANG_I2C
|
||||
select MARVELL_88W8618
|
||||
@@ -114,18 +123,22 @@ config MUSICPAL
|
||||
|
||||
config NETDUINO2
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select STM32F205_SOC
|
||||
|
||||
config NETDUINOPLUS2
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select STM32F405_SOC
|
||||
|
||||
config OLIMEX_STM32_H405
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select STM32F405_SOC
|
||||
|
||||
config NSERIES
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select OMAP
|
||||
select TMP105 # temperature sensor
|
||||
select BLIZZARD # LCD/TV controller
|
||||
@@ -158,12 +171,14 @@ config PXA2XX
|
||||
|
||||
config GUMSTIX
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select PFLASH_CFI01
|
||||
select SMC91C111
|
||||
select PXA2XX
|
||||
|
||||
config TOSA
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ZAURUS # scoop
|
||||
select MICRODRIVE
|
||||
select PXA2XX
|
||||
@@ -171,6 +186,7 @@ config TOSA
|
||||
|
||||
config SPITZ
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ADS7846 # touch-screen controller
|
||||
select MAX111X # A/D converter
|
||||
select WM8750 # audio codec
|
||||
@@ -183,6 +199,7 @@ config SPITZ
|
||||
|
||||
config Z2
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select PFLASH_CFI01
|
||||
select WM8750
|
||||
select PL011 # UART
|
||||
@@ -190,6 +207,7 @@ config Z2
|
||||
|
||||
config REALVIEW
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply PCI_DEVICES
|
||||
imply PCI_TESTDEV
|
||||
imply I2C_DEVICES
|
||||
@@ -218,6 +236,7 @@ config REALVIEW
|
||||
|
||||
config SBSA_REF
|
||||
bool
|
||||
default y if TCG && AARCH64
|
||||
imply PCI_DEVICES
|
||||
select AHCI
|
||||
select ARM_SMMUV3
|
||||
@@ -233,11 +252,13 @@ config SBSA_REF
|
||||
|
||||
config SABRELITE
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select FSL_IMX6
|
||||
select SSI_M25P80
|
||||
|
||||
config STELLARIS
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select ARM_V7M
|
||||
select CMSDK_APB_WATCHDOG
|
||||
@@ -255,6 +276,7 @@ config STELLARIS
|
||||
|
||||
config STM32VLDISCOVERY
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select STM32F100_SOC
|
||||
|
||||
config STRONGARM
|
||||
@@ -263,16 +285,19 @@ config STRONGARM
|
||||
|
||||
config COLLIE
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select PFLASH_CFI01
|
||||
select ZAURUS # scoop
|
||||
select STRONGARM
|
||||
|
||||
config SX1
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select OMAP
|
||||
|
||||
config VERSATILE
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ARM_TIMER # sp804
|
||||
select PFLASH_CFI01
|
||||
select LSI_SCSI_PCI
|
||||
@@ -284,6 +309,7 @@ config VERSATILE
|
||||
|
||||
config VEXPRESS
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select A9MPCORE
|
||||
select A15MPCORE
|
||||
select ARM_MPTIMER
|
||||
@@ -299,6 +325,7 @@ config VEXPRESS
|
||||
|
||||
config ZYNQ
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select A9MPCORE
|
||||
select CADENCE # UART
|
||||
select PFLASH_CFI02
|
||||
@@ -315,9 +342,8 @@ config ZYNQ
|
||||
config ARM_V7M
|
||||
bool
|
||||
# currently v7M must be included in a TCG build due to translate.c
|
||||
default y if TCG && (ARM || AARCH64)
|
||||
default y if TCG && ARM
|
||||
select PTIMER
|
||||
select ARM_COMPATIBLE_SEMIHOSTING
|
||||
|
||||
config ALLWINNER_A10
|
||||
bool
|
||||
@@ -335,6 +361,7 @@ config ALLWINNER_A10
|
||||
|
||||
config ALLWINNER_H3
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select ALLWINNER_A10_PIT
|
||||
select ALLWINNER_SUN8I_EMAC
|
||||
select ALLWINNER_I2C
|
||||
@@ -349,6 +376,7 @@ config ALLWINNER_H3
|
||||
|
||||
config RASPI
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select FRAMEBUFFER
|
||||
select PL011 # UART
|
||||
select SDHCI
|
||||
@@ -379,6 +407,7 @@ config STM32F405_SOC
|
||||
|
||||
config XLNX_ZYNQMP_ARM
|
||||
bool
|
||||
default y if TCG && AARCH64
|
||||
select AHCI
|
||||
select ARM_GIC
|
||||
select CADENCE
|
||||
@@ -396,6 +425,7 @@ config XLNX_ZYNQMP_ARM
|
||||
|
||||
config XLNX_VERSAL
|
||||
bool
|
||||
default y if TCG && AARCH64
|
||||
select ARM_GIC
|
||||
select PL011
|
||||
select CADENCE
|
||||
@@ -409,6 +439,7 @@ config XLNX_VERSAL
|
||||
|
||||
config NPCM7XX
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select A9MPCORE
|
||||
select ADM1272
|
||||
select ARM_GIC
|
||||
@@ -425,6 +456,7 @@ config NPCM7XX
|
||||
|
||||
config FSL_IMX25
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select IMX
|
||||
select IMX_FEC
|
||||
@@ -434,6 +466,7 @@ config FSL_IMX25
|
||||
|
||||
config FSL_IMX31
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select SERIAL
|
||||
select IMX
|
||||
@@ -454,6 +487,7 @@ config FSL_IMX6
|
||||
|
||||
config ASPEED_SOC
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select DS1338
|
||||
select FTGMAC100
|
||||
select I2C
|
||||
@@ -474,6 +508,7 @@ config ASPEED_SOC
|
||||
|
||||
config MPS2
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select ARMSSE
|
||||
select LAN9118
|
||||
@@ -489,6 +524,7 @@ config MPS2
|
||||
|
||||
config FSL_IMX7
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
imply I2C_DEVICES
|
||||
@@ -507,6 +543,7 @@ config ARM_SMMUV3
|
||||
|
||||
config FSL_IMX6UL
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
imply I2C_DEVICES
|
||||
select A15MPCORE
|
||||
select IMX
|
||||
@@ -518,6 +555,7 @@ config FSL_IMX6UL
|
||||
|
||||
config MICROBIT
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select NRF51_SOC
|
||||
|
||||
config NRF51_SOC
|
||||
@@ -529,6 +567,7 @@ config NRF51_SOC
|
||||
|
||||
config EMCRAFT_SF2
|
||||
bool
|
||||
default y if TCG && ARM
|
||||
select MSF2
|
||||
select SSI_M25P80
|
||||
|
||||
|
||||
+20
-18
@@ -200,33 +200,35 @@ struct AspeedMachineState {
|
||||
static void aspeed_write_smpboot(ARMCPU *cpu,
|
||||
const struct arm_boot_info *info)
|
||||
{
|
||||
static const uint32_t poll_mailbox_ready[] = {
|
||||
AddressSpace *as = arm_boot_address_space(cpu, info);
|
||||
static const ARMInsnFixup poll_mailbox_ready[] = {
|
||||
/*
|
||||
* r2 = per-cpu go sign value
|
||||
* r1 = AST_SMP_MBOX_FIELD_ENTRY
|
||||
* r0 = AST_SMP_MBOX_FIELD_GOSIGN
|
||||
*/
|
||||
0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 */
|
||||
0xe21000ff, /* ands r0, r0, #255 */
|
||||
0xe59f201c, /* ldr r2, [pc, #28] */
|
||||
0xe1822000, /* orr r2, r2, r0 */
|
||||
{ 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5 */
|
||||
{ 0xe21000ff }, /* ands r0, r0, #255 */
|
||||
{ 0xe59f201c }, /* ldr r2, [pc, #28] */
|
||||
{ 0xe1822000 }, /* orr r2, r2, r0 */
|
||||
|
||||
0xe59f1018, /* ldr r1, [pc, #24] */
|
||||
0xe59f0018, /* ldr r0, [pc, #24] */
|
||||
{ 0xe59f1018 }, /* ldr r1, [pc, #24] */
|
||||
{ 0xe59f0018 }, /* ldr r0, [pc, #24] */
|
||||
|
||||
0xe320f002, /* wfe */
|
||||
0xe5904000, /* ldr r4, [r0] */
|
||||
0xe1520004, /* cmp r2, r4 */
|
||||
0x1afffffb, /* bne <wfe> */
|
||||
0xe591f000, /* ldr pc, [r1] */
|
||||
AST_SMP_MBOX_GOSIGN,
|
||||
AST_SMP_MBOX_FIELD_ENTRY,
|
||||
AST_SMP_MBOX_FIELD_GOSIGN,
|
||||
{ 0xe320f002 }, /* wfe */
|
||||
{ 0xe5904000 }, /* ldr r4, [r0] */
|
||||
{ 0xe1520004 }, /* cmp r2, r4 */
|
||||
{ 0x1afffffb }, /* bne <wfe> */
|
||||
{ 0xe591f000 }, /* ldr pc, [r1] */
|
||||
{ AST_SMP_MBOX_GOSIGN },
|
||||
{ AST_SMP_MBOX_FIELD_ENTRY },
|
||||
{ AST_SMP_MBOX_FIELD_GOSIGN },
|
||||
{ 0, FIXUP_TERMINATOR }
|
||||
};
|
||||
static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
|
||||
|
||||
rom_add_blob_fixed("aspeed.smpboot", poll_mailbox_ready,
|
||||
sizeof(poll_mailbox_ready),
|
||||
info->smp_loader_start);
|
||||
arm_write_bootloader("aspeed.smpboot", as, info->smp_loader_start,
|
||||
poll_mailbox_ready, fixupcontext);
|
||||
}
|
||||
|
||||
static void aspeed_reset_secondary(ARMCPU *cpu,
|
||||
|
||||
@@ -90,6 +90,8 @@ static void bcm2835_peripherals_init(Object *obj)
|
||||
TYPE_BCM2835_PROPERTY);
|
||||
object_property_add_alias(obj, "board-rev", OBJECT(&s->property),
|
||||
"board-rev");
|
||||
object_property_add_alias(obj, "command-line", OBJECT(&s->property),
|
||||
"command-line");
|
||||
|
||||
object_property_add_const_link(OBJECT(&s->property), "fb",
|
||||
OBJECT(&s->fb));
|
||||
|
||||
@@ -55,6 +55,8 @@ static void bcm2836_init(Object *obj)
|
||||
TYPE_BCM2835_PERIPHERALS);
|
||||
object_property_add_alias(obj, "board-rev", OBJECT(&s->peripherals),
|
||||
"board-rev");
|
||||
object_property_add_alias(obj, "command-line", OBJECT(&s->peripherals),
|
||||
"command-line");
|
||||
object_property_add_alias(obj, "vcram-size", OBJECT(&s->peripherals),
|
||||
"vcram-size");
|
||||
}
|
||||
|
||||
+8
-27
@@ -60,26 +60,6 @@ AddressSpace *arm_boot_address_space(ARMCPU *cpu,
|
||||
return cpu_get_address_space(cs, asidx);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
FIXUP_NONE = 0, /* do nothing */
|
||||
FIXUP_TERMINATOR, /* end of insns */
|
||||
FIXUP_BOARDID, /* overwrite with board ID number */
|
||||
FIXUP_BOARD_SETUP, /* overwrite with board specific setup code address */
|
||||
FIXUP_ARGPTR_LO, /* overwrite with pointer to kernel args */
|
||||
FIXUP_ARGPTR_HI, /* overwrite with pointer to kernel args (high half) */
|
||||
FIXUP_ENTRYPOINT_LO, /* overwrite with kernel entry point */
|
||||
FIXUP_ENTRYPOINT_HI, /* overwrite with kernel entry point (high half) */
|
||||
FIXUP_GIC_CPU_IF, /* overwrite with GIC CPU interface address */
|
||||
FIXUP_BOOTREG, /* overwrite with boot register address */
|
||||
FIXUP_DSB, /* overwrite with correct DSB insn for cpu */
|
||||
FIXUP_MAX,
|
||||
} FixupType;
|
||||
|
||||
typedef struct ARMInsnFixup {
|
||||
uint32_t insn;
|
||||
FixupType fixup;
|
||||
} ARMInsnFixup;
|
||||
|
||||
static const ARMInsnFixup bootloader_aarch64[] = {
|
||||
{ 0x580000c0 }, /* ldr x0, arg ; Load the lower 32-bits of DTB */
|
||||
{ 0xaa1f03e1 }, /* mov x1, xzr */
|
||||
@@ -150,9 +130,10 @@ static const ARMInsnFixup smpboot[] = {
|
||||
{ 0, FIXUP_TERMINATOR }
|
||||
};
|
||||
|
||||
static void write_bootloader(const char *name, hwaddr addr,
|
||||
const ARMInsnFixup *insns, uint32_t *fixupcontext,
|
||||
AddressSpace *as)
|
||||
void arm_write_bootloader(const char *name,
|
||||
AddressSpace *as, hwaddr addr,
|
||||
const ARMInsnFixup *insns,
|
||||
const uint32_t *fixupcontext)
|
||||
{
|
||||
/* Fix up the specified bootloader fragment and write it into
|
||||
* guest memory using rom_add_blob_fixed(). fixupcontext is
|
||||
@@ -214,8 +195,8 @@ static void default_write_secondary(ARMCPU *cpu,
|
||||
fixupcontext[FIXUP_DSB] = CP15_DSB_INSN;
|
||||
}
|
||||
|
||||
write_bootloader("smpboot", info->smp_loader_start,
|
||||
smpboot, fixupcontext, as);
|
||||
arm_write_bootloader("smpboot", as, info->smp_loader_start,
|
||||
smpboot, fixupcontext);
|
||||
}
|
||||
|
||||
void arm_write_secure_board_setup_dummy_smc(ARMCPU *cpu,
|
||||
@@ -1186,8 +1167,8 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
|
||||
fixupcontext[FIXUP_ENTRYPOINT_LO] = entry;
|
||||
fixupcontext[FIXUP_ENTRYPOINT_HI] = entry >> 32;
|
||||
|
||||
write_bootloader("bootloader", info->loader_start,
|
||||
primary_loader, fixupcontext, as);
|
||||
arm_write_bootloader("bootloader", as, info->loader_start,
|
||||
primary_loader, fixupcontext);
|
||||
|
||||
if (info->write_board_setup) {
|
||||
info->write_board_setup(cpu, info);
|
||||
|
||||
+36
-30
@@ -16,6 +16,7 @@
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/arm/boot.h"
|
||||
#include "hw/arm/bcm2836.h"
|
||||
#include "hw/registerfields.h"
|
||||
#include "qemu/error-report.h"
|
||||
@@ -124,20 +125,22 @@ static const char *board_type(uint32_t board_rev)
|
||||
|
||||
static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
{
|
||||
static const uint32_t smpboot[] = {
|
||||
0xe1a0e00f, /* mov lr, pc */
|
||||
0xe3a0fe00 + (BOARDSETUP_ADDR >> 4), /* mov pc, BOARDSETUP_ADDR */
|
||||
0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5;get core ID */
|
||||
0xe7e10050, /* ubfx r0, r0, #0, #2 ;extract LSB */
|
||||
0xe59f5014, /* ldr r5, =0x400000CC ;load mbox base */
|
||||
0xe320f001, /* 1: yield */
|
||||
0xe7953200, /* ldr r3, [r5, r0, lsl #4] ;read mbox for our core*/
|
||||
0xe3530000, /* cmp r3, #0 ;spin while zero */
|
||||
0x0afffffb, /* beq 1b */
|
||||
0xe7853200, /* str r3, [r5, r0, lsl #4] ;clear mbox */
|
||||
0xe12fff13, /* bx r3 ;jump to target */
|
||||
0x400000cc, /* (constant: mailbox 3 read/clear base) */
|
||||
static const ARMInsnFixup smpboot[] = {
|
||||
{ 0xe1a0e00f }, /* mov lr, pc */
|
||||
{ 0xe3a0fe00 + (BOARDSETUP_ADDR >> 4) }, /* mov pc, BOARDSETUP_ADDR */
|
||||
{ 0xee100fb0 }, /* mrc p15, 0, r0, c0, c0, 5;get core ID */
|
||||
{ 0xe7e10050 }, /* ubfx r0, r0, #0, #2 ;extract LSB */
|
||||
{ 0xe59f5014 }, /* ldr r5, =0x400000CC ;load mbox base */
|
||||
{ 0xe320f001 }, /* 1: yield */
|
||||
{ 0xe7953200 }, /* ldr r3, [r5, r0, lsl #4] ;read mbox for our core */
|
||||
{ 0xe3530000 }, /* cmp r3, #0 ;spin while zero */
|
||||
{ 0x0afffffb }, /* beq 1b */
|
||||
{ 0xe7853200 }, /* str r3, [r5, r0, lsl #4] ;clear mbox */
|
||||
{ 0xe12fff13 }, /* bx r3 ;jump to target */
|
||||
{ 0x400000cc }, /* (constant: mailbox 3 read/clear base) */
|
||||
{ 0, FIXUP_TERMINATOR }
|
||||
};
|
||||
static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
|
||||
|
||||
/* check that we don't overrun board setup vectors */
|
||||
QEMU_BUILD_BUG_ON(SMPBOOT_ADDR + sizeof(smpboot) > MVBAR_ADDR);
|
||||
@@ -145,9 +148,8 @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
QEMU_BUILD_BUG_ON((BOARDSETUP_ADDR & 0xf) != 0
|
||||
|| (BOARDSETUP_ADDR >> 4) >= 0x100);
|
||||
|
||||
rom_add_blob_fixed_as("raspi_smpboot", smpboot, sizeof(smpboot),
|
||||
info->smp_loader_start,
|
||||
arm_boot_address_space(cpu, info));
|
||||
arm_write_bootloader("raspi_smpboot", arm_boot_address_space(cpu, info),
|
||||
info->smp_loader_start, smpboot, fixupcontext);
|
||||
}
|
||||
|
||||
static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
@@ -161,26 +163,28 @@ static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
* the primary CPU goes into the kernel. We put these variables inside
|
||||
* a rom blob, so that the reset for ROM contents zeroes them for us.
|
||||
*/
|
||||
static const uint32_t smpboot[] = {
|
||||
0xd2801b05, /* mov x5, 0xd8 */
|
||||
0xd53800a6, /* mrs x6, mpidr_el1 */
|
||||
0x924004c6, /* and x6, x6, #0x3 */
|
||||
0xd503205f, /* spin: wfe */
|
||||
0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
|
||||
0xb4ffffc4, /* cbz x4, spin */
|
||||
0xd2800000, /* mov x0, #0x0 */
|
||||
0xd2800001, /* mov x1, #0x0 */
|
||||
0xd2800002, /* mov x2, #0x0 */
|
||||
0xd2800003, /* mov x3, #0x0 */
|
||||
0xd61f0080, /* br x4 */
|
||||
static const ARMInsnFixup smpboot[] = {
|
||||
{ 0xd2801b05 }, /* mov x5, 0xd8 */
|
||||
{ 0xd53800a6 }, /* mrs x6, mpidr_el1 */
|
||||
{ 0x924004c6 }, /* and x6, x6, #0x3 */
|
||||
{ 0xd503205f }, /* spin: wfe */
|
||||
{ 0xf86678a4 }, /* ldr x4, [x5,x6,lsl #3] */
|
||||
{ 0xb4ffffc4 }, /* cbz x4, spin */
|
||||
{ 0xd2800000 }, /* mov x0, #0x0 */
|
||||
{ 0xd2800001 }, /* mov x1, #0x0 */
|
||||
{ 0xd2800002 }, /* mov x2, #0x0 */
|
||||
{ 0xd2800003 }, /* mov x3, #0x0 */
|
||||
{ 0xd61f0080 }, /* br x4 */
|
||||
{ 0, FIXUP_TERMINATOR }
|
||||
};
|
||||
static const uint32_t fixupcontext[FIXUP_MAX] = { 0 };
|
||||
|
||||
static const uint64_t spintables[] = {
|
||||
0, 0, 0, 0
|
||||
};
|
||||
|
||||
rom_add_blob_fixed_as("raspi_smpboot", smpboot, sizeof(smpboot),
|
||||
info->smp_loader_start, as);
|
||||
arm_write_bootloader("raspi_smpboot", as, info->smp_loader_start,
|
||||
smpboot, fixupcontext);
|
||||
rom_add_blob_fixed_as("raspi_spintables", spintables, sizeof(spintables),
|
||||
SPINTABLE_ADDR, as);
|
||||
}
|
||||
@@ -280,6 +284,8 @@ static void raspi_machine_init(MachineState *machine)
|
||||
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(machine->ram));
|
||||
object_property_set_int(OBJECT(&s->soc), "board-rev", board_rev,
|
||||
&error_abort);
|
||||
object_property_set_str(OBJECT(&s->soc), "command-line",
|
||||
machine->kernel_cmdline, &error_abort);
|
||||
qdev_realize(DEVICE(&s->soc), NULL, &error_fatal);
|
||||
|
||||
/* Create and plug in the SD cards */
|
||||
|
||||
+3
-3
@@ -206,16 +206,16 @@ static const int a15irqmap[] = {
|
||||
static const char *valid_cpus[] = {
|
||||
#ifdef CONFIG_TCG
|
||||
ARM_CPU_TYPE_NAME("cortex-a7"),
|
||||
#endif
|
||||
ARM_CPU_TYPE_NAME("cortex-a15"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a35"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a53"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a55"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a57"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a72"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a76"),
|
||||
ARM_CPU_TYPE_NAME("a64fx"),
|
||||
ARM_CPU_TYPE_NAME("neoverse-n1"),
|
||||
#endif
|
||||
ARM_CPU_TYPE_NAME("cortex-a53"),
|
||||
ARM_CPU_TYPE_NAME("cortex-a57"),
|
||||
ARM_CPU_TYPE_NAME("host"),
|
||||
ARM_CPU_TYPE_NAME("max"),
|
||||
};
|
||||
|
||||
@@ -49,12 +49,9 @@ static void aw_a10_pic_update(AwA10PICState *s)
|
||||
static void aw_a10_pic_set_irq(void *opaque, int irq, int level)
|
||||
{
|
||||
AwA10PICState *s = opaque;
|
||||
uint32_t *pending_reg = &s->irq_pending[irq / 32];
|
||||
|
||||
if (level) {
|
||||
set_bit(irq % 32, (void *)&s->irq_pending[irq / 32]);
|
||||
} else {
|
||||
clear_bit(irq % 32, (void *)&s->irq_pending[irq / 32]);
|
||||
}
|
||||
*pending_reg = deposit32(*pending_reg, irq % 32, 1, level);
|
||||
aw_a10_pic_update(s);
|
||||
}
|
||||
|
||||
|
||||
@@ -282,7 +282,17 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
|
||||
break;
|
||||
|
||||
case 0x00050001: /* Get command line */
|
||||
resplen = 0;
|
||||
/*
|
||||
* We follow the firmware behaviour: no NUL terminator is
|
||||
* written to the buffer, and if the buffer is too short
|
||||
* we report the required length in the response header
|
||||
* and copy nothing to the buffer.
|
||||
*/
|
||||
resplen = strlen(s->command_line);
|
||||
if (bufsize >= resplen)
|
||||
address_space_write(&s->dma_as, value + 12,
|
||||
MEMTXATTRS_UNSPECIFIED, s->command_line,
|
||||
resplen);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -420,6 +430,7 @@ static void bcm2835_property_realize(DeviceState *dev, Error **errp)
|
||||
|
||||
static Property bcm2835_property_props[] = {
|
||||
DEFINE_PROP_UINT32("board-rev", BCM2835PropertyState, board_rev, 0),
|
||||
DEFINE_PROP_STRING("command-line", BCM2835PropertyState, command_line),
|
||||
DEFINE_PROP_END_OF_LIST()
|
||||
};
|
||||
|
||||
|
||||
@@ -350,8 +350,13 @@ static void allwinner_sun8i_emac_get_desc(AwSun8iEmacState *s,
|
||||
FrameDescriptor *desc,
|
||||
uint32_t phys_addr)
|
||||
{
|
||||
dma_memory_read(&s->dma_as, phys_addr, desc, sizeof(*desc),
|
||||
uint32_t desc_words[4];
|
||||
dma_memory_read(&s->dma_as, phys_addr, &desc_words, sizeof(desc_words),
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
desc->status = le32_to_cpu(desc_words[0]);
|
||||
desc->status2 = le32_to_cpu(desc_words[1]);
|
||||
desc->addr = le32_to_cpu(desc_words[2]);
|
||||
desc->next = le32_to_cpu(desc_words[3]);
|
||||
}
|
||||
|
||||
static uint32_t allwinner_sun8i_emac_next_desc(AwSun8iEmacState *s,
|
||||
@@ -400,10 +405,15 @@ static uint32_t allwinner_sun8i_emac_tx_desc(AwSun8iEmacState *s,
|
||||
}
|
||||
|
||||
static void allwinner_sun8i_emac_flush_desc(AwSun8iEmacState *s,
|
||||
FrameDescriptor *desc,
|
||||
const FrameDescriptor *desc,
|
||||
uint32_t phys_addr)
|
||||
{
|
||||
dma_memory_write(&s->dma_as, phys_addr, desc, sizeof(*desc),
|
||||
uint32_t desc_words[4];
|
||||
desc_words[0] = cpu_to_le32(desc->status);
|
||||
desc_words[1] = cpu_to_le32(desc->status2);
|
||||
desc_words[2] = cpu_to_le32(desc->addr);
|
||||
desc_words[3] = cpu_to_le32(desc->next);
|
||||
dma_memory_write(&s->dma_as, phys_addr, &desc_words, sizeof(desc_words),
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
}
|
||||
|
||||
@@ -638,8 +648,7 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
|
||||
break;
|
||||
case REG_TX_CUR_BUF: /* Transmit Current Buffer */
|
||||
if (s->tx_desc_curr != 0) {
|
||||
dma_memory_read(&s->dma_as, s->tx_desc_curr, &desc, sizeof(desc),
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
allwinner_sun8i_emac_get_desc(s, &desc, s->tx_desc_curr);
|
||||
value = desc.addr;
|
||||
} else {
|
||||
value = 0;
|
||||
@@ -652,8 +661,7 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
|
||||
break;
|
||||
case REG_RX_CUR_BUF: /* Receive Current Buffer */
|
||||
if (s->rx_desc_curr != 0) {
|
||||
dma_memory_read(&s->dma_as, s->rx_desc_curr, &desc, sizeof(desc),
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
allwinner_sun8i_emac_get_desc(s, &desc, s->rx_desc_curr);
|
||||
value = desc.addr;
|
||||
} else {
|
||||
value = 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user