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-20150427' into staging
target-arm queue: * memory system updates to support transaction attributes * set user-mode and secure attributes for accesses made by ARM CPUs * rename c1_coproc to cpacr_el1 * adjust id_aa64pfr0 when has_el3 CPU property disabled * allow ARMv8 SCR.SMD updates # gpg: Signature made Mon Apr 27 16:14:30 2015 BST using RSA key ID 14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" * remotes/pmaydell/tags/pull-target-arm-20150427: Allow ARMv8 SCR.SMD updates target-arm: Adjust id_aa64pfr0 when has_el3 CPU property disabled target-arm: rename c1_coproc to cpacr_el1 target-arm: Check watchpoints against CPU security state target-arm: Use attribute info to handle user-only watchpoints target-arm: Add user-mode transaction attribute target-arm: Use correct memory attributes for page table walks target-arm: Honour NS bits in page tables Switch non-CPU callers from ld/st*_phys to address_space_ld/st* exec.c: Capture the memory attributes for a watchpoint hit exec.c: Add new address_space_ld*/st* functions exec.c: Make address_space_rw take transaction attributes exec.c: Convert subpage memory ops to _with_attrs Add MemTxAttrs to the IOTLB Make CPU iotlb a structure rather than a plain hwaddr memory: Replace io_mem_read/write with memory_region_dispatch_read/write memory: Define API for MemoryRegionOps to take attrs and return status Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -249,9 +249,9 @@ static void tlb_add_large_page(CPUArchState *env, target_ulong vaddr,
|
||||
* Called from TCG-generated code, which is under an RCU read-side
|
||||
* critical section.
|
||||
*/
|
||||
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
|
||||
hwaddr paddr, int prot,
|
||||
int mmu_idx, target_ulong size)
|
||||
void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
|
||||
hwaddr paddr, MemTxAttrs attrs, int prot,
|
||||
int mmu_idx, target_ulong size)
|
||||
{
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
MemoryRegionSection *section;
|
||||
@@ -301,7 +301,8 @@ void tlb_set_page(CPUState *cpu, target_ulong vaddr,
|
||||
env->iotlb_v[mmu_idx][vidx] = env->iotlb[mmu_idx][index];
|
||||
|
||||
/* refill the tlb */
|
||||
env->iotlb[mmu_idx][index] = iotlb - vaddr;
|
||||
env->iotlb[mmu_idx][index].addr = iotlb - vaddr;
|
||||
env->iotlb[mmu_idx][index].attrs = attrs;
|
||||
te->addend = addend - vaddr;
|
||||
if (prot & PAGE_READ) {
|
||||
te->addr_read = address;
|
||||
@@ -331,6 +332,17 @@ void tlb_set_page(CPUState *cpu, target_ulong vaddr,
|
||||
}
|
||||
}
|
||||
|
||||
/* Add a new TLB entry, but without specifying the memory
|
||||
* transaction attributes to be used.
|
||||
*/
|
||||
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
|
||||
hwaddr paddr, int prot,
|
||||
int mmu_idx, target_ulong size)
|
||||
{
|
||||
tlb_set_page_with_attrs(cpu, vaddr, paddr, MEMTXATTRS_UNSPECIFIED,
|
||||
prot, mmu_idx, size);
|
||||
}
|
||||
|
||||
/* NOTE: this function can trigger an exception */
|
||||
/* NOTE2: the returned address is not exactly the physical address: it
|
||||
* is actually a ram_addr_t (in system mode; the user mode emulation
|
||||
@@ -349,7 +361,7 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr)
|
||||
(addr & TARGET_PAGE_MASK))) {
|
||||
cpu_ldub_code(env1, addr);
|
||||
}
|
||||
pd = env1->iotlb[mmu_idx][page_index] & ~TARGET_PAGE_MASK;
|
||||
pd = env1->iotlb[mmu_idx][page_index].addr & ~TARGET_PAGE_MASK;
|
||||
mr = iotlb_to_region(cpu, pd);
|
||||
if (memory_region_is_unassigned(mr)) {
|
||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||
|
||||
+2
-1
@@ -28,7 +28,8 @@ int dma_memory_set(AddressSpace *as, dma_addr_t addr, uint8_t c, dma_addr_t len)
|
||||
memset(fillbuf, c, FILLBUF_SIZE);
|
||||
while (len > 0) {
|
||||
l = len < FILLBUF_SIZE ? len : FILLBUF_SIZE;
|
||||
error |= address_space_rw(as, addr, fillbuf, l, true);
|
||||
error |= address_space_rw(as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
fillbuf, l, true);
|
||||
len -= l;
|
||||
addr += l;
|
||||
}
|
||||
|
||||
+6
-3
@@ -157,9 +157,12 @@ static void clipper_init(MachineState *machine)
|
||||
load_image_targphys(initrd_filename, initrd_base,
|
||||
ram_size - initrd_base);
|
||||
|
||||
stq_phys(&address_space_memory,
|
||||
param_offset + 0x100, initrd_base + 0xfffffc0000000000ULL);
|
||||
stq_phys(&address_space_memory, param_offset + 0x108, initrd_size);
|
||||
address_space_stq(&address_space_memory, param_offset + 0x100,
|
||||
initrd_base + 0xfffffc0000000000ULL,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
address_space_stq(&address_space_memory, param_offset + 0x108,
|
||||
initrd_size, MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -613,7 +613,8 @@ static bool make_iommu_tlbe(hwaddr taddr, hwaddr mask, IOMMUTLBEntry *ret)
|
||||
translation, given the address of the PTE. */
|
||||
static bool pte_translate(hwaddr pte_addr, IOMMUTLBEntry *ret)
|
||||
{
|
||||
uint64_t pte = ldq_phys(&address_space_memory, pte_addr);
|
||||
uint64_t pte = address_space_ldq(&address_space_memory, pte_addr,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
|
||||
/* Check valid bit. */
|
||||
if ((pte & 1) == 0) {
|
||||
|
||||
+4
-2
@@ -170,7 +170,8 @@ static void default_reset_secondary(ARMCPU *cpu,
|
||||
{
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
||||
stl_phys_notdirty(&address_space_memory, info->smp_bootreg_addr, 0);
|
||||
address_space_stl_notdirty(&address_space_memory, info->smp_bootreg_addr,
|
||||
0, MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
env->regs[15] = info->smp_loader_start;
|
||||
}
|
||||
|
||||
@@ -180,7 +181,8 @@ static inline bool have_dtb(const struct arm_boot_info *info)
|
||||
}
|
||||
|
||||
#define WRITE_WORD(p, value) do { \
|
||||
stl_phys_notdirty(&address_space_memory, p, value); \
|
||||
address_space_stl_notdirty(&address_space_memory, p, value, \
|
||||
MEMTXATTRS_UNSPECIFIED, NULL); \
|
||||
p += 4; \
|
||||
} while (0)
|
||||
|
||||
|
||||
+9
-3
@@ -69,11 +69,17 @@ static void hb_reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
|
||||
switch (info->nb_cpus) {
|
||||
case 4:
|
||||
stl_phys_notdirty(&address_space_memory, SMP_BOOT_REG + 0x30, 0);
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x30, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
case 3:
|
||||
stl_phys_notdirty(&address_space_memory, SMP_BOOT_REG + 0x20, 0);
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x20, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
case 2:
|
||||
stl_phys_notdirty(&address_space_memory, SMP_BOOT_REG + 0x10, 0);
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x10, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
env->regs[15] = SMP_BOOT_ADDR;
|
||||
break;
|
||||
default:
|
||||
|
||||
+1
-1
@@ -274,7 +274,7 @@ static void pxa2xx_pwrmode_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
s->cpu->env.uncached_cpsr = ARM_CPU_MODE_SVC;
|
||||
s->cpu->env.daif = PSTATE_A | PSTATE_F | PSTATE_I;
|
||||
s->cpu->env.cp15.sctlr_ns = 0;
|
||||
s->cpu->env.cp15.c1_coproc = 0;
|
||||
s->cpu->env.cp15.cpacr_el1 = 0;
|
||||
s->cpu->env.cp15.ttbr0_el[1] = 0;
|
||||
s->cpu->env.cp15.dacr_ns = 0;
|
||||
s->pm_regs[PSSR >> 2] |= 0x8; /* Set STS */
|
||||
|
||||
+16
-4
@@ -205,10 +205,22 @@ again:
|
||||
if (size == 0) {
|
||||
/* Transfer complete. */
|
||||
if (ch->lli) {
|
||||
ch->src = ldl_le_phys(&address_space_memory, ch->lli);
|
||||
ch->dest = ldl_le_phys(&address_space_memory, ch->lli + 4);
|
||||
ch->ctrl = ldl_le_phys(&address_space_memory, ch->lli + 12);
|
||||
ch->lli = ldl_le_phys(&address_space_memory, ch->lli + 8);
|
||||
ch->src = address_space_ldl_le(&address_space_memory,
|
||||
ch->lli,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
ch->dest = address_space_ldl_le(&address_space_memory,
|
||||
ch->lli + 4,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
ch->ctrl = address_space_ldl_le(&address_space_memory,
|
||||
ch->lli + 12,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
ch->lli = address_space_ldl_le(&address_space_memory,
|
||||
ch->lli + 8,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
} else {
|
||||
ch->conf &= ~PL080_CCONF_E;
|
||||
}
|
||||
|
||||
@@ -263,7 +263,8 @@ static uint32_t iommu_page_get_flags(IOMMUState *s, hwaddr addr)
|
||||
iopte = s->regs[IOMMU_BASE] << 4;
|
||||
addr &= ~s->iostart;
|
||||
iopte += (addr >> (IOMMU_PAGE_SHIFT - 2)) & ~3;
|
||||
ret = ldl_be_phys(&address_space_memory, iopte);
|
||||
ret = address_space_ldl_be(&address_space_memory, iopte,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
trace_sun4m_iommu_page_get_flags(pa, iopte, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -246,7 +246,8 @@ static void vtd_generate_interrupt(IntelIOMMUState *s, hwaddr mesg_addr_reg,
|
||||
data = vtd_get_long_raw(s, mesg_data_reg);
|
||||
|
||||
VTD_DPRINTF(FLOG, "msi: addr 0x%"PRIx64 " data 0x%"PRIx32, addr, data);
|
||||
stl_le_phys(&address_space_memory, addr, data);
|
||||
address_space_stl_le(&address_space_memory, addr, data,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
|
||||
/* Generate a fault event to software via MSI if conditions are met.
|
||||
|
||||
+4
-2
@@ -61,7 +61,8 @@ static void main_cpu_reset(void *opaque)
|
||||
static uint64_t rtc_read(void *opaque, hwaddr addr, unsigned size)
|
||||
{
|
||||
uint8_t val;
|
||||
address_space_read(&address_space_memory, 0x90000071, &val, 1);
|
||||
address_space_read(&address_space_memory, 0x90000071,
|
||||
MEMTXATTRS_UNSPECIFIED, &val, 1);
|
||||
return val;
|
||||
}
|
||||
|
||||
@@ -69,7 +70,8 @@ static void rtc_write(void *opaque, hwaddr addr,
|
||||
uint64_t val, unsigned size)
|
||||
{
|
||||
uint8_t buf = val & 0xff;
|
||||
address_space_write(&address_space_memory, 0x90000071, &buf, 1);
|
||||
address_space_write(&address_space_memory, 0x90000071,
|
||||
MEMTXATTRS_UNSPECIFIED, &buf, 1);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps rtc_ops = {
|
||||
|
||||
+2
-1
@@ -289,7 +289,8 @@ static IOMMUTLBEntry pbm_translate_iommu(MemoryRegion *iommu, hwaddr addr,
|
||||
}
|
||||
}
|
||||
|
||||
tte = ldq_be_phys(&address_space_memory, baseaddr + offset);
|
||||
tte = address_space_ldq_be(&address_space_memory, baseaddr + offset,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
|
||||
if (!(tte & IOMMU_TTE_DATA_V)) {
|
||||
/* Invalid mapping */
|
||||
|
||||
+4
-2
@@ -140,7 +140,8 @@ static uint64_t raven_io_read(void *opaque, hwaddr addr,
|
||||
uint8_t buf[4];
|
||||
|
||||
addr = raven_io_address(s, addr);
|
||||
address_space_read(&s->pci_io_as, addr + 0x80000000, buf, size);
|
||||
address_space_read(&s->pci_io_as, addr + 0x80000000,
|
||||
MEMTXATTRS_UNSPECIFIED, buf, size);
|
||||
|
||||
if (size == 1) {
|
||||
return buf[0];
|
||||
@@ -171,7 +172,8 @@ static void raven_io_write(void *opaque, hwaddr addr,
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
address_space_write(&s->pci_io_as, addr + 0x80000000, buf, size);
|
||||
address_space_write(&s->pci_io_as, addr + 0x80000000,
|
||||
MEMTXATTRS_UNSPECIFIED, buf, size);
|
||||
}
|
||||
|
||||
static const MemoryRegionOps raven_io_ops = {
|
||||
|
||||
+2
-1
@@ -291,7 +291,8 @@ void msi_notify(PCIDevice *dev, unsigned int vector)
|
||||
"notify vector 0x%x"
|
||||
" address: 0x%"PRIx64" data: 0x%"PRIx32"\n",
|
||||
vector, msg.address, msg.data);
|
||||
stl_le_phys(&dev->bus_master_as, msg.address, msg.data);
|
||||
address_space_stl_le(&dev->bus_master_as, msg.address, msg.data,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
|
||||
/* Normally called by pci_default_write_config(). */
|
||||
|
||||
+2
-1
@@ -435,7 +435,8 @@ void msix_notify(PCIDevice *dev, unsigned vector)
|
||||
|
||||
msg = msix_get_message(dev, vector);
|
||||
|
||||
stl_le_phys(&dev->bus_master_as, msg.address, msg.data);
|
||||
address_space_stl_le(&dev->bus_master_as, msg.address, msg.data,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
|
||||
void msix_reset(PCIDevice *dev)
|
||||
|
||||
+13
-6
@@ -745,20 +745,27 @@ static void css_update_chnmon(SubchDev *sch)
|
||||
/* Format 1, per-subchannel area. */
|
||||
uint32_t count;
|
||||
|
||||
count = ldl_phys(&address_space_memory, sch->curr_status.mba);
|
||||
count = address_space_ldl(&address_space_memory,
|
||||
sch->curr_status.mba,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
count++;
|
||||
stl_phys(&address_space_memory, sch->curr_status.mba, count);
|
||||
address_space_stl(&address_space_memory, sch->curr_status.mba, count,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
} else {
|
||||
/* Format 0, global area. */
|
||||
uint32_t offset;
|
||||
uint16_t count;
|
||||
|
||||
offset = sch->curr_status.pmcw.mbi << 5;
|
||||
count = lduw_phys(&address_space_memory,
|
||||
channel_subsys->chnmon_area + offset);
|
||||
count = address_space_lduw(&address_space_memory,
|
||||
channel_subsys->chnmon_area + offset,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
count++;
|
||||
stw_phys(&address_space_memory,
|
||||
channel_subsys->chnmon_area + offset, count);
|
||||
address_space_stw(&address_space_memory,
|
||||
channel_subsys->chnmon_area + offset, count,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -278,7 +278,8 @@ static uint64_t s390_guest_io_table_walk(uint64_t guest_iota,
|
||||
px = calc_px(guest_dma_address);
|
||||
|
||||
sto_a = guest_iota + rtx * sizeof(uint64_t);
|
||||
sto = ldq_phys(&address_space_memory, sto_a);
|
||||
sto = address_space_ldq(&address_space_memory, sto_a,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
sto = get_rt_sto(sto);
|
||||
if (!sto) {
|
||||
pte = 0;
|
||||
@@ -286,7 +287,8 @@ static uint64_t s390_guest_io_table_walk(uint64_t guest_iota,
|
||||
}
|
||||
|
||||
pto_a = sto + sx * sizeof(uint64_t);
|
||||
pto = ldq_phys(&address_space_memory, pto_a);
|
||||
pto = address_space_ldq(&address_space_memory, pto_a,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
pto = get_st_pto(pto);
|
||||
if (!pto) {
|
||||
pte = 0;
|
||||
@@ -294,7 +296,8 @@ static uint64_t s390_guest_io_table_walk(uint64_t guest_iota,
|
||||
}
|
||||
|
||||
px_a = pto + px * sizeof(uint64_t);
|
||||
pte = ldq_phys(&address_space_memory, px_a);
|
||||
pte = address_space_ldq(&address_space_memory, px_a,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
|
||||
out:
|
||||
return pte;
|
||||
|
||||
@@ -331,7 +331,8 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
|
||||
return 0;
|
||||
}
|
||||
MemoryRegion *mr = pbdev->pdev->io_regions[pcias].memory;
|
||||
io_mem_read(mr, offset, &data, len);
|
||||
memory_region_dispatch_read(mr, offset, &data, len,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
} else if (pcias == 15) {
|
||||
if ((4 - (offset & 0x3)) < len) {
|
||||
program_interrupt(env, PGM_OPERAND, 4);
|
||||
@@ -456,7 +457,8 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
|
||||
mr = pbdev->pdev->io_regions[pcias].memory;
|
||||
}
|
||||
|
||||
io_mem_write(mr, offset, data, len);
|
||||
memory_region_dispatch_write(mr, offset, data, len,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
} else if (pcias == 15) {
|
||||
if ((4 - (offset & 0x3)) < len) {
|
||||
program_interrupt(env, PGM_OPERAND, 4);
|
||||
@@ -606,7 +608,9 @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr)
|
||||
}
|
||||
|
||||
for (i = 0; i < len / 8; i++) {
|
||||
io_mem_write(mr, env->regs[r3] + i * 8, ldq_p(buffer + i * 8), 8);
|
||||
memory_region_dispatch_write(mr, env->regs[r3] + i * 8,
|
||||
ldq_p(buffer + i * 8), 8,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
}
|
||||
|
||||
setcc(cpu, ZPCI_PCI_LS_OK);
|
||||
|
||||
+46
-23
@@ -75,10 +75,12 @@ void s390_virtio_reset_idx(VirtIOS390Device *dev)
|
||||
for (i = 0; i < num_vq; i++) {
|
||||
idx_addr = virtio_queue_get_avail_addr(dev->vdev, i) +
|
||||
VIRTIO_VRING_AVAIL_IDX_OFFS;
|
||||
stw_phys(&address_space_memory, idx_addr, 0);
|
||||
address_space_stw(&address_space_memory, idx_addr, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
idx_addr = virtio_queue_get_used_addr(dev->vdev, i) +
|
||||
VIRTIO_VRING_USED_IDX_OFFS;
|
||||
stw_phys(&address_space_memory, idx_addr, 0);
|
||||
address_space_stw(&address_space_memory, idx_addr, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,7 +338,8 @@ static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
|
||||
(vq * VIRTIO_VQCONFIG_LEN) +
|
||||
VIRTIO_VQCONFIG_OFFS_TOKEN;
|
||||
|
||||
return ldq_be_phys(&address_space_memory, token_off);
|
||||
return address_space_ldq_be(&address_space_memory, token_off,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
}
|
||||
|
||||
static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev)
|
||||
@@ -371,21 +374,33 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
|
||||
virtio_reset(dev->vdev);
|
||||
|
||||
/* Sync dev space */
|
||||
stb_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_TYPE, dev->vdev->device_id);
|
||||
address_space_stb(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_TYPE,
|
||||
dev->vdev->device_id,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
|
||||
stb_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ,
|
||||
s390_virtio_device_num_vq(dev));
|
||||
stb_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_FEATURE_LEN, dev->feat_len);
|
||||
address_space_stb(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ,
|
||||
s390_virtio_device_num_vq(dev),
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
address_space_stb(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_FEATURE_LEN,
|
||||
dev->feat_len,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
|
||||
stb_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG_LEN, dev->vdev->config_len);
|
||||
address_space_stb(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_CONFIG_LEN,
|
||||
dev->vdev->config_len,
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
|
||||
num_vq = s390_virtio_device_num_vq(dev);
|
||||
stb_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ, num_vq);
|
||||
address_space_stb(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_NUM_VQ, num_vq,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
|
||||
/* Sync virtqueues */
|
||||
for (i = 0; i < num_vq; i++) {
|
||||
@@ -396,11 +411,14 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
|
||||
vring = s390_virtio_next_ring(bus);
|
||||
virtio_queue_set_addr(dev->vdev, i, vring);
|
||||
virtio_queue_set_vector(dev->vdev, i, i);
|
||||
stq_be_phys(&address_space_memory,
|
||||
vq + VIRTIO_VQCONFIG_OFFS_ADDRESS, vring);
|
||||
stw_be_phys(&address_space_memory,
|
||||
vq + VIRTIO_VQCONFIG_OFFS_NUM,
|
||||
virtio_queue_get_num(dev->vdev, i));
|
||||
address_space_stq_be(&address_space_memory,
|
||||
vq + VIRTIO_VQCONFIG_OFFS_ADDRESS, vring,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
address_space_stw_be(&address_space_memory,
|
||||
vq + VIRTIO_VQCONFIG_OFFS_NUM,
|
||||
virtio_queue_get_num(dev->vdev, i),
|
||||
MEMTXATTRS_UNSPECIFIED,
|
||||
NULL);
|
||||
}
|
||||
|
||||
cur_offs = dev->dev_offs;
|
||||
@@ -408,7 +426,8 @@ void s390_virtio_device_sync(VirtIOS390Device *dev)
|
||||
cur_offs += num_vq * VIRTIO_VQCONFIG_LEN;
|
||||
|
||||
/* Sync feature bitmap */
|
||||
stl_le_phys(&address_space_memory, cur_offs, dev->host_features);
|
||||
address_space_stl_le(&address_space_memory, cur_offs, dev->host_features,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
|
||||
dev->feat_offs = cur_offs + dev->feat_len;
|
||||
cur_offs += dev->feat_len * 2;
|
||||
@@ -426,12 +445,16 @@ void s390_virtio_device_update_status(VirtIOS390Device *dev)
|
||||
VirtIODevice *vdev = dev->vdev;
|
||||
uint32_t features;
|
||||
|
||||
virtio_set_status(vdev, ldub_phys(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_STATUS));
|
||||
virtio_set_status(vdev,
|
||||
address_space_ldub(&address_space_memory,
|
||||
dev->dev_offs + VIRTIO_DEV_OFFS_STATUS,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL));
|
||||
|
||||
/* Update guest supported feature bitmap */
|
||||
|
||||
features = bswap32(ldl_be_phys(&address_space_memory, dev->feat_offs));
|
||||
features = bswap32(address_space_ldl_be(&address_space_memory,
|
||||
dev->feat_offs,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL));
|
||||
virtio_set_features(vdev, features);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user