mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
hw/arm/armv7m: Expose and access System Control Space as little endian
We only build ARM system emulators using little
endianness, so the MO_TE definition always expands to
MO_LE, and DEVICE_TARGET_ENDIAN to DEVICE_LITTLE_ENDIAN.
Replace the definitions by their expanded value, making
it closer to the Armv7-M Architecture Reference Manual
(ARM DDI 0403E) description:
The System Control Space (SCS, address range 0xE000E000 to
0xE000EFFF) is a memory-mapped 4KB address space that provides
32-bit registers for configuration, status reporting and control.
All accesses to the SCS are little endian.
Fixes: d5d680cacc
("memory: Access MemoryRegion with endianness")
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20250312104821.1012-1-philmd@linaro.org>
This commit is contained in:
parent
0f15892aca
commit
8dcfb54090
1 changed files with 7 additions and 7 deletions
|
@ -140,7 +140,7 @@ static MemTxResult v7m_sysreg_ns_write(void *opaque, hwaddr addr,
|
||||||
/* S accesses to the alias act like NS accesses to the real region */
|
/* S accesses to the alias act like NS accesses to the real region */
|
||||||
attrs.secure = 0;
|
attrs.secure = 0;
|
||||||
return memory_region_dispatch_write(mr, addr, value,
|
return memory_region_dispatch_write(mr, addr, value,
|
||||||
size_memop(size) | MO_TE, attrs);
|
size_memop(size) | MO_LE, attrs);
|
||||||
} else {
|
} else {
|
||||||
/* NS attrs are RAZ/WI for privileged, and BusFault for user */
|
/* NS attrs are RAZ/WI for privileged, and BusFault for user */
|
||||||
if (attrs.user) {
|
if (attrs.user) {
|
||||||
|
@ -160,7 +160,7 @@ static MemTxResult v7m_sysreg_ns_read(void *opaque, hwaddr addr,
|
||||||
/* S accesses to the alias act like NS accesses to the real region */
|
/* S accesses to the alias act like NS accesses to the real region */
|
||||||
attrs.secure = 0;
|
attrs.secure = 0;
|
||||||
return memory_region_dispatch_read(mr, addr, data,
|
return memory_region_dispatch_read(mr, addr, data,
|
||||||
size_memop(size) | MO_TE, attrs);
|
size_memop(size) | MO_LE, attrs);
|
||||||
} else {
|
} else {
|
||||||
/* NS attrs are RAZ/WI for privileged, and BusFault for user */
|
/* NS attrs are RAZ/WI for privileged, and BusFault for user */
|
||||||
if (attrs.user) {
|
if (attrs.user) {
|
||||||
|
@ -174,7 +174,7 @@ static MemTxResult v7m_sysreg_ns_read(void *opaque, hwaddr addr,
|
||||||
static const MemoryRegionOps v7m_sysreg_ns_ops = {
|
static const MemoryRegionOps v7m_sysreg_ns_ops = {
|
||||||
.read_with_attrs = v7m_sysreg_ns_read,
|
.read_with_attrs = v7m_sysreg_ns_read,
|
||||||
.write_with_attrs = v7m_sysreg_ns_write,
|
.write_with_attrs = v7m_sysreg_ns_write,
|
||||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
static MemTxResult v7m_systick_write(void *opaque, hwaddr addr,
|
static MemTxResult v7m_systick_write(void *opaque, hwaddr addr,
|
||||||
|
@ -187,7 +187,7 @@ static MemTxResult v7m_systick_write(void *opaque, hwaddr addr,
|
||||||
/* Direct the access to the correct systick */
|
/* Direct the access to the correct systick */
|
||||||
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->systick[attrs.secure]), 0);
|
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->systick[attrs.secure]), 0);
|
||||||
return memory_region_dispatch_write(mr, addr, value,
|
return memory_region_dispatch_write(mr, addr, value,
|
||||||
size_memop(size) | MO_TE, attrs);
|
size_memop(size) | MO_LE, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MemTxResult v7m_systick_read(void *opaque, hwaddr addr,
|
static MemTxResult v7m_systick_read(void *opaque, hwaddr addr,
|
||||||
|
@ -199,14 +199,14 @@ static MemTxResult v7m_systick_read(void *opaque, hwaddr addr,
|
||||||
|
|
||||||
/* Direct the access to the correct systick */
|
/* Direct the access to the correct systick */
|
||||||
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->systick[attrs.secure]), 0);
|
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->systick[attrs.secure]), 0);
|
||||||
return memory_region_dispatch_read(mr, addr, data, size_memop(size) | MO_TE,
|
return memory_region_dispatch_read(mr, addr, data,
|
||||||
attrs);
|
size_memop(size) | MO_LE, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const MemoryRegionOps v7m_systick_ops = {
|
static const MemoryRegionOps v7m_systick_ops = {
|
||||||
.read_with_attrs = v7m_systick_read,
|
.read_with_attrs = v7m_systick_read,
|
||||||
.write_with_attrs = v7m_systick_write,
|
.write_with_attrs = v7m_systick_write,
|
||||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue