Compare commits
38
Commits
v2.6.0-rc3
...
v2.6.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfc766d38e | ||
|
|
860a3b3485 | ||
|
|
53db932604 | ||
|
|
975eb6a547 | ||
|
|
1beb99f787 | ||
|
|
fd3c136b3e | ||
|
|
2068192dcc | ||
|
|
7fa5c2c5dc | ||
|
|
bfa0f151a5 | ||
|
|
3bf1817079 | ||
|
|
277abf15a6 | ||
|
|
20b0f5fef6 | ||
|
|
1dbfd7892b | ||
|
|
47dac82d8b | ||
|
|
849880978e | ||
|
|
d208c50d9d | ||
|
|
ebb72c9f06 | ||
|
|
0a40bdab0d | ||
|
|
0d48dfedc5 | ||
|
|
8c4bf97580 | ||
|
|
736f85d5db | ||
|
|
61861eff69 | ||
|
|
d96391c1ff | ||
|
|
51b9b478cc | ||
|
|
d9d3aaea0b | ||
|
|
37f32349ea | ||
|
|
df18b2db69 | ||
|
|
f419a626c7 | ||
|
|
3123bd8ebf | ||
|
|
da34fed707 | ||
|
|
53343338a6 | ||
|
|
ab27c3b5e7 | ||
|
|
37989ced44 | ||
|
|
14560d69e7 | ||
|
|
54e18d35e4 | ||
|
|
bcd82a968f | ||
|
|
ee1e0f8e5d | ||
|
|
df7b97ff89 |
No files matched your search
+6
-2
@@ -282,10 +282,12 @@ bool aio_pending(AioContext *ctx)
|
||||
int revents;
|
||||
|
||||
revents = node->pfd.revents & node->pfd.events;
|
||||
if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read) {
|
||||
if (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR) && node->io_read &&
|
||||
aio_node_check(ctx, node->is_external)) {
|
||||
return true;
|
||||
}
|
||||
if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write) {
|
||||
if (revents & (G_IO_OUT | G_IO_ERR) && node->io_write &&
|
||||
aio_node_check(ctx, node->is_external)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -323,6 +325,7 @@ bool aio_dispatch(AioContext *ctx)
|
||||
|
||||
if (!node->deleted &&
|
||||
(revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) &&
|
||||
aio_node_check(ctx, node->is_external) &&
|
||||
node->io_read) {
|
||||
node->io_read(node->opaque);
|
||||
|
||||
@@ -333,6 +336,7 @@ bool aio_dispatch(AioContext *ctx)
|
||||
}
|
||||
if (!node->deleted &&
|
||||
(revents & (G_IO_OUT | G_IO_ERR)) &&
|
||||
aio_node_check(ctx, node->is_external) &&
|
||||
node->io_write) {
|
||||
node->io_write(node->opaque);
|
||||
progress = true;
|
||||
|
||||
@@ -495,6 +495,9 @@ out:
|
||||
block_job_completed(&s->common, data->ret);
|
||||
g_free(data);
|
||||
bdrv_drained_end(src);
|
||||
if (qemu_get_aio_context() == bdrv_get_aio_context(src)) {
|
||||
aio_enable_external(iohandler_get_aio_context());
|
||||
}
|
||||
bdrv_unref(src);
|
||||
}
|
||||
|
||||
@@ -716,6 +719,12 @@ immediate_exit:
|
||||
/* Before we switch to target in mirror_exit, make sure data doesn't
|
||||
* change. */
|
||||
bdrv_drained_begin(s->common.bs);
|
||||
if (qemu_get_aio_context() == bdrv_get_aio_context(bs)) {
|
||||
/* FIXME: virtio host notifiers run on iohandler_ctx, therefore the
|
||||
* above bdrv_drained_end isn't enough to quiesce it. This is ugly, we
|
||||
* need a block layer API change to achieve this. */
|
||||
aio_disable_external(iohandler_get_aio_context());
|
||||
}
|
||||
block_job_defer_to_main_loop(&s->common, mirror_exit, data);
|
||||
}
|
||||
|
||||
|
||||
+8
-1
@@ -1109,6 +1109,8 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
goto fail;
|
||||
}
|
||||
memcpy(s->volume_label, label, label_length);
|
||||
} else {
|
||||
memcpy(s->volume_label, "QEMU VVFAT", 10);
|
||||
}
|
||||
|
||||
if (floppy) {
|
||||
@@ -2283,12 +2285,17 @@ DLOG(fprintf(stderr, "commit_direntries for %s, parent_mapping_index %d\n", mapp
|
||||
factor * (old_cluster_count - new_cluster_count));
|
||||
|
||||
for (c = first_cluster; !fat_eof(s, c); c = modified_fat_get(s, c)) {
|
||||
direntry_t *first_direntry;
|
||||
void* direntry = array_get(&(s->directory), current_dir_index);
|
||||
int ret = vvfat_read(s->bs, cluster2sector(s, c), direntry,
|
||||
s->sectors_per_cluster);
|
||||
if (ret)
|
||||
return ret;
|
||||
assert(!strncmp(s->directory.pointer, "QEMU", 4));
|
||||
|
||||
/* The first directory entry on the filesystem is the volume name */
|
||||
first_direntry = (direntry_t*) s->directory.pointer;
|
||||
assert(!memcmp(first_direntry->name, s->volume_label, 11));
|
||||
|
||||
current_dir_index += factor;
|
||||
}
|
||||
|
||||
|
||||
@@ -4493,6 +4493,21 @@ if test "$fortify_source" != "no"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check if struct fsxattr is available via linux/fs.h
|
||||
|
||||
have_fsxattr=no
|
||||
cat > $TMPC << EOF
|
||||
#include <linux/fs.h>
|
||||
struct fsxattr foo;
|
||||
int main(void) {
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
have_fsxattr=yes
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# End of CC checks
|
||||
# After here, no more $cc or $ld runs
|
||||
@@ -5160,6 +5175,14 @@ fi
|
||||
if test "$have_ifaddrs_h" = "yes" ; then
|
||||
echo "HAVE_IFADDRS_H=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
# Work around a system header bug with some kernel/XFS header
|
||||
# versions where they both try to define 'struct fsxattr':
|
||||
# xfs headers will not try to redefine structs from linux headers
|
||||
# if this macro is set.
|
||||
if test "$have_fsxattr" = "yes" ; then
|
||||
echo "HAVE_FSXATTR=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$vte" = "yes" ; then
|
||||
echo "CONFIG_VTE=y" >> $config_host_mak
|
||||
echo "VTE_CFLAGS=$vte_cflags" >> $config_host_mak
|
||||
|
||||
@@ -135,9 +135,8 @@ void bios_linker_loader_alloc(GArray *linker,
|
||||
strncpy(entry.alloc.file, file, sizeof entry.alloc.file - 1);
|
||||
entry.command = cpu_to_le32(BIOS_LINKER_LOADER_COMMAND_ALLOCATE);
|
||||
entry.alloc.align = cpu_to_le32(alloc_align);
|
||||
entry.alloc.zone = cpu_to_le32(alloc_fseg ?
|
||||
BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG :
|
||||
BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH);
|
||||
entry.alloc.zone = alloc_fseg ? BIOS_LINKER_LOADER_ALLOC_ZONE_FSEG :
|
||||
BIOS_LINKER_LOADER_ALLOC_ZONE_HIGH;
|
||||
|
||||
/* Alloc entries must come first, so prepend them */
|
||||
g_array_prepend_vals(linker, &entry, sizeof entry);
|
||||
|
||||
@@ -536,7 +536,6 @@ void acpi_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci,
|
||||
ar->tmr.timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, acpi_pm_tmr_timer, ar);
|
||||
memory_region_init_io(&ar->tmr.io, memory_region_owner(parent),
|
||||
&acpi_pm_tmr_ops, ar, "acpi-tmr", 4);
|
||||
memory_region_clear_global_locking(&ar->tmr.io);
|
||||
memory_region_add_subregion(parent, 8, &ar->tmr.io);
|
||||
}
|
||||
|
||||
|
||||
+78
-44
@@ -142,6 +142,13 @@ static uint32_t expand4[256];
|
||||
static uint16_t expand2[256];
|
||||
static uint8_t expand4to8[16];
|
||||
|
||||
static void vbe_update_vgaregs(VGACommonState *s);
|
||||
|
||||
static inline bool vbe_enabled(VGACommonState *s)
|
||||
{
|
||||
return s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED;
|
||||
}
|
||||
|
||||
static void vga_update_memory_access(VGACommonState *s)
|
||||
{
|
||||
hwaddr base, offset, size;
|
||||
@@ -179,6 +186,7 @@ static void vga_update_memory_access(VGACommonState *s)
|
||||
size = 0x8000;
|
||||
break;
|
||||
}
|
||||
assert(offset + size <= s->vram_size);
|
||||
memory_region_init_alias(&s->chain4_alias, memory_region_owner(&s->vram),
|
||||
"vga.chain4", &s->vram, offset, size);
|
||||
memory_region_add_subregion_overlap(s->legacy_address_space, base,
|
||||
@@ -478,6 +486,7 @@ void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||
printf("vga: write SR%x = 0x%02x\n", s->sr_index, val);
|
||||
#endif
|
||||
s->sr[s->sr_index] = val & sr_mask[s->sr_index];
|
||||
vbe_update_vgaregs(s);
|
||||
if (s->sr_index == VGA_SEQ_CLOCK_MODE) {
|
||||
s->update_retrace_info(s);
|
||||
}
|
||||
@@ -509,6 +518,7 @@ void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||
printf("vga: write GR%x = 0x%02x\n", s->gr_index, val);
|
||||
#endif
|
||||
s->gr[s->gr_index] = val & gr_mask[s->gr_index];
|
||||
vbe_update_vgaregs(s);
|
||||
vga_update_memory_access(s);
|
||||
break;
|
||||
case VGA_CRT_IM:
|
||||
@@ -527,10 +537,12 @@ void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||
if (s->cr_index == VGA_CRTC_OVERFLOW) {
|
||||
s->cr[VGA_CRTC_OVERFLOW] = (s->cr[VGA_CRTC_OVERFLOW] & ~0x10) |
|
||||
(val & 0x10);
|
||||
vbe_update_vgaregs(s);
|
||||
}
|
||||
return;
|
||||
}
|
||||
s->cr[s->cr_index] = val;
|
||||
vbe_update_vgaregs(s);
|
||||
|
||||
switch(s->cr_index) {
|
||||
case VGA_CRTC_H_TOTAL:
|
||||
@@ -563,7 +575,7 @@ static void vbe_fixup_regs(VGACommonState *s)
|
||||
uint16_t *r = s->vbe_regs;
|
||||
uint32_t bits, linelength, maxy, offset;
|
||||
|
||||
if (!(r[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
|
||||
if (!vbe_enabled(s)) {
|
||||
/* vbe is turned off -- nothing to do */
|
||||
return;
|
||||
}
|
||||
@@ -638,6 +650,49 @@ static void vbe_fixup_regs(VGACommonState *s)
|
||||
s->vbe_start_addr = offset / 4;
|
||||
}
|
||||
|
||||
/* we initialize the VGA graphic mode */
|
||||
static void vbe_update_vgaregs(VGACommonState *s)
|
||||
{
|
||||
int h, shift_control;
|
||||
|
||||
if (!vbe_enabled(s)) {
|
||||
/* vbe is turned off -- nothing to do */
|
||||
return;
|
||||
}
|
||||
|
||||
/* graphic mode + memory map 1 */
|
||||
s->gr[VGA_GFX_MISC] = (s->gr[VGA_GFX_MISC] & ~0x0c) | 0x04 |
|
||||
VGA_GR06_GRAPHICS_MODE;
|
||||
s->cr[VGA_CRTC_MODE] |= 3; /* no CGA modes */
|
||||
s->cr[VGA_CRTC_OFFSET] = s->vbe_line_offset >> 3;
|
||||
/* width */
|
||||
s->cr[VGA_CRTC_H_DISP] =
|
||||
(s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
|
||||
/* height (only meaningful if < 1024) */
|
||||
h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
|
||||
s->cr[VGA_CRTC_V_DISP_END] = h;
|
||||
s->cr[VGA_CRTC_OVERFLOW] = (s->cr[VGA_CRTC_OVERFLOW] & ~0x42) |
|
||||
((h >> 7) & 0x02) | ((h >> 3) & 0x40);
|
||||
/* line compare to 1023 */
|
||||
s->cr[VGA_CRTC_LINE_COMPARE] = 0xff;
|
||||
s->cr[VGA_CRTC_OVERFLOW] |= 0x10;
|
||||
s->cr[VGA_CRTC_MAX_SCAN] |= 0x40;
|
||||
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) {
|
||||
shift_control = 0;
|
||||
s->sr[VGA_SEQ_CLOCK_MODE] &= ~8; /* no double line */
|
||||
} else {
|
||||
shift_control = 2;
|
||||
/* set chain 4 mode */
|
||||
s->sr[VGA_SEQ_MEMORY_MODE] |= VGA_SR04_CHN_4M;
|
||||
/* activate all planes */
|
||||
s->sr[VGA_SEQ_PLANE_WRITE] |= VGA_SR02_ALL_PLANES;
|
||||
}
|
||||
s->gr[VGA_GFX_MODE] = (s->gr[VGA_GFX_MODE] & ~0x60) |
|
||||
(shift_control << 5);
|
||||
s->cr[VGA_CRTC_MAX_SCAN] &= ~0x9f; /* no double scan */
|
||||
}
|
||||
|
||||
static uint32_t vbe_ioport_read_index(void *opaque, uint32_t addr)
|
||||
{
|
||||
VGACommonState *s = opaque;
|
||||
@@ -714,13 +769,10 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
|
||||
case VBE_DISPI_INDEX_Y_OFFSET:
|
||||
s->vbe_regs[s->vbe_index] = val;
|
||||
vbe_fixup_regs(s);
|
||||
vbe_update_vgaregs(s);
|
||||
break;
|
||||
case VBE_DISPI_INDEX_BANK:
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) {
|
||||
val &= (s->vbe_bank_mask >> 2);
|
||||
} else {
|
||||
val &= s->vbe_bank_mask;
|
||||
}
|
||||
val &= s->vbe_bank_mask;
|
||||
s->vbe_regs[s->vbe_index] = val;
|
||||
s->bank_offset = (val << 16);
|
||||
vga_update_memory_access(s);
|
||||
@@ -728,52 +780,19 @@ void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
|
||||
case VBE_DISPI_INDEX_ENABLE:
|
||||
if ((val & VBE_DISPI_ENABLED) &&
|
||||
!(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
|
||||
int h, shift_control;
|
||||
|
||||
s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = 0;
|
||||
s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0;
|
||||
s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0;
|
||||
s->vbe_regs[VBE_DISPI_INDEX_ENABLE] |= VBE_DISPI_ENABLED;
|
||||
vbe_fixup_regs(s);
|
||||
vbe_update_vgaregs(s);
|
||||
|
||||
/* clear the screen */
|
||||
if (!(val & VBE_DISPI_NOCLEARMEM)) {
|
||||
memset(s->vram_ptr, 0,
|
||||
s->vbe_regs[VBE_DISPI_INDEX_YRES] * s->vbe_line_offset);
|
||||
}
|
||||
|
||||
/* we initialize the VGA graphic mode */
|
||||
/* graphic mode + memory map 1 */
|
||||
s->gr[VGA_GFX_MISC] = (s->gr[VGA_GFX_MISC] & ~0x0c) | 0x04 |
|
||||
VGA_GR06_GRAPHICS_MODE;
|
||||
s->cr[VGA_CRTC_MODE] |= 3; /* no CGA modes */
|
||||
s->cr[VGA_CRTC_OFFSET] = s->vbe_line_offset >> 3;
|
||||
/* width */
|
||||
s->cr[VGA_CRTC_H_DISP] =
|
||||
(s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 3) - 1;
|
||||
/* height (only meaningful if < 1024) */
|
||||
h = s->vbe_regs[VBE_DISPI_INDEX_YRES] - 1;
|
||||
s->cr[VGA_CRTC_V_DISP_END] = h;
|
||||
s->cr[VGA_CRTC_OVERFLOW] = (s->cr[VGA_CRTC_OVERFLOW] & ~0x42) |
|
||||
((h >> 7) & 0x02) | ((h >> 3) & 0x40);
|
||||
/* line compare to 1023 */
|
||||
s->cr[VGA_CRTC_LINE_COMPARE] = 0xff;
|
||||
s->cr[VGA_CRTC_OVERFLOW] |= 0x10;
|
||||
s->cr[VGA_CRTC_MAX_SCAN] |= 0x40;
|
||||
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) {
|
||||
shift_control = 0;
|
||||
s->sr[VGA_SEQ_CLOCK_MODE] &= ~8; /* no double line */
|
||||
} else {
|
||||
shift_control = 2;
|
||||
/* set chain 4 mode */
|
||||
s->sr[VGA_SEQ_MEMORY_MODE] |= VGA_SR04_CHN_4M;
|
||||
/* activate all planes */
|
||||
s->sr[VGA_SEQ_PLANE_WRITE] |= VGA_SR02_ALL_PLANES;
|
||||
}
|
||||
s->gr[VGA_GFX_MODE] = (s->gr[VGA_GFX_MODE] & ~0x60) |
|
||||
(shift_control << 5);
|
||||
s->cr[VGA_CRTC_MAX_SCAN] &= ~0x9f; /* no double scan */
|
||||
} else {
|
||||
s->bank_offset = 0;
|
||||
}
|
||||
@@ -819,13 +838,21 @@ uint32_t vga_mem_readb(VGACommonState *s, hwaddr addr)
|
||||
|
||||
if (s->sr[VGA_SEQ_MEMORY_MODE] & VGA_SR04_CHN_4M) {
|
||||
/* chain 4 mode : simplest access */
|
||||
assert(addr < s->vram_size);
|
||||
ret = s->vram_ptr[addr];
|
||||
} else if (s->gr[VGA_GFX_MODE] & 0x10) {
|
||||
/* odd/even mode (aka text mode mapping) */
|
||||
plane = (s->gr[VGA_GFX_PLANE_READ] & 2) | (addr & 1);
|
||||
ret = s->vram_ptr[((addr & ~1) << 1) | plane];
|
||||
addr = ((addr & ~1) << 1) | plane;
|
||||
if (addr >= s->vram_size) {
|
||||
return 0xff;
|
||||
}
|
||||
ret = s->vram_ptr[addr];
|
||||
} else {
|
||||
/* standard VGA latched access */
|
||||
if (addr * sizeof(uint32_t) >= s->vram_size) {
|
||||
return 0xff;
|
||||
}
|
||||
s->latch = ((uint32_t *)s->vram_ptr)[addr];
|
||||
|
||||
if (!(s->gr[VGA_GFX_MODE] & 0x08)) {
|
||||
@@ -882,6 +909,7 @@ void vga_mem_writeb(VGACommonState *s, hwaddr addr, uint32_t val)
|
||||
plane = addr & 3;
|
||||
mask = (1 << plane);
|
||||
if (s->sr[VGA_SEQ_PLANE_WRITE] & mask) {
|
||||
assert(addr < s->vram_size);
|
||||
s->vram_ptr[addr] = val;
|
||||
#ifdef DEBUG_VGA_MEM
|
||||
printf("vga: chain4: [0x" TARGET_FMT_plx "]\n", addr);
|
||||
@@ -895,6 +923,9 @@ void vga_mem_writeb(VGACommonState *s, hwaddr addr, uint32_t val)
|
||||
mask = (1 << plane);
|
||||
if (s->sr[VGA_SEQ_PLANE_WRITE] & mask) {
|
||||
addr = ((addr & ~1) << 1) | plane;
|
||||
if (addr >= s->vram_size) {
|
||||
return;
|
||||
}
|
||||
s->vram_ptr[addr] = val;
|
||||
#ifdef DEBUG_VGA_MEM
|
||||
printf("vga: odd/even: [0x" TARGET_FMT_plx "]\n", addr);
|
||||
@@ -968,6 +999,9 @@ void vga_mem_writeb(VGACommonState *s, hwaddr addr, uint32_t val)
|
||||
mask = s->sr[VGA_SEQ_PLANE_WRITE];
|
||||
s->plane_updated |= mask; /* only used to detect font change */
|
||||
write_mask = mask16[mask];
|
||||
if (addr * sizeof(uint32_t) >= s->vram_size) {
|
||||
return;
|
||||
}
|
||||
((uint32_t *)s->vram_ptr)[addr] =
|
||||
(((uint32_t *)s->vram_ptr)[addr] & ~write_mask) |
|
||||
(val & write_mask);
|
||||
@@ -1046,7 +1080,7 @@ static void vga_get_offsets(VGACommonState *s,
|
||||
{
|
||||
uint32_t start_addr, line_offset, line_compare;
|
||||
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
|
||||
if (vbe_enabled(s)) {
|
||||
line_offset = s->vbe_line_offset;
|
||||
start_addr = s->vbe_start_addr;
|
||||
line_compare = 65535;
|
||||
@@ -1371,7 +1405,7 @@ static int vga_get_bpp(VGACommonState *s)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
|
||||
if (vbe_enabled(s)) {
|
||||
ret = s->vbe_regs[VBE_DISPI_INDEX_BPP];
|
||||
} else {
|
||||
ret = 0;
|
||||
@@ -1383,7 +1417,7 @@ static void vga_get_resolution(VGACommonState *s, int *pwidth, int *pheight)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) {
|
||||
if (vbe_enabled(s)) {
|
||||
width = s->vbe_regs[VBE_DISPI_INDEX_XRES];
|
||||
height = s->vbe_regs[VBE_DISPI_INDEX_YRES];
|
||||
} else {
|
||||
|
||||
+4
-5
@@ -940,11 +940,10 @@ static void spapr_finalize_fdt(sPAPRMachineState *spapr,
|
||||
|
||||
QLIST_FOREACH(phb, &spapr->phbs, list) {
|
||||
ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, fdt);
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "couldn't setup PCI devices in fdt\n");
|
||||
exit(1);
|
||||
if (ret < 0) {
|
||||
error_report("couldn't setup PCI devices in fdt");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* RTAS */
|
||||
|
||||
+11
-1
@@ -364,7 +364,17 @@ static void attach(sPAPRDRConnector *drc, DeviceState *d, void *fdt,
|
||||
drc->fdt = fdt;
|
||||
drc->fdt_start_offset = fdt_start_offset;
|
||||
drc->configured = coldplug;
|
||||
drc->signalled = coldplug;
|
||||
/* 'logical' DR resources such as memory/cpus are in some cases treated
|
||||
* as a pool of resources from which the guest is free to choose from
|
||||
* based on only a count. for resources that can be assigned in this
|
||||
* fashion, we must assume the resource is signalled immediately
|
||||
* since a single hotplug request might make an arbitrary number of
|
||||
* such attached resources available to the guest, as opposed to
|
||||
* 'physical' DR resources such as PCI where each device/resource is
|
||||
* signalled individually.
|
||||
*/
|
||||
drc->signalled = (drc->type != SPAPR_DR_CONNECTOR_TYPE_PCI)
|
||||
? true : coldplug;
|
||||
|
||||
object_property_add_link(OBJECT(drc), "device",
|
||||
object_get_typename(OBJECT(drc->dev)),
|
||||
|
||||
@@ -442,6 +442,9 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action,
|
||||
switch (drc_type) {
|
||||
case SPAPR_DR_CONNECTOR_TYPE_PCI:
|
||||
hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_PCI;
|
||||
if (hp->hotplug_action == RTAS_LOG_V6_HP_ACTION_ADD) {
|
||||
spapr_hotplug_set_signalled(drc);
|
||||
}
|
||||
break;
|
||||
case SPAPR_DR_CONNECTOR_TYPE_LMB:
|
||||
hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_MEMORY;
|
||||
@@ -462,10 +465,6 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action,
|
||||
|
||||
rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp, true);
|
||||
|
||||
if (hp->hotplug_action == RTAS_LOG_V6_HP_ACTION_ADD) {
|
||||
spapr_hotplug_set_signalled(drc);
|
||||
}
|
||||
|
||||
qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
|
||||
}
|
||||
|
||||
|
||||
@@ -1816,6 +1816,9 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb,
|
||||
sizeof(interrupt_map)));
|
||||
|
||||
tcet = spapr_tce_find_by_liobn(SPAPR_PCI_LIOBN(phb->index, 0));
|
||||
if (!tcet) {
|
||||
return -1;
|
||||
}
|
||||
spapr_dma_dt(fdt, bus_off, "ibm,dma-window",
|
||||
tcet->liobn, tcet->bus_offset,
|
||||
tcet->nb_table << tcet->page_shift);
|
||||
|
||||
@@ -407,7 +407,7 @@ static int init_event_notifier(EmulatedState *card)
|
||||
DPRINTF(card, 2, "event notifier creation failed\n");
|
||||
return -1;
|
||||
}
|
||||
event_notifier_set_handler(&card->notifier, card_event_handler);
|
||||
event_notifier_set_handler(&card->notifier, false, card_event_handler);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -776,19 +776,6 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q, uint32_t qh_addr,
|
||||
uint8_t pid = td->token & 0xff;
|
||||
UHCIAsync *async;
|
||||
|
||||
switch (pid) {
|
||||
case USB_TOKEN_OUT:
|
||||
case USB_TOKEN_SETUP:
|
||||
case USB_TOKEN_IN:
|
||||
break;
|
||||
default:
|
||||
/* invalid pid : frame interrupted */
|
||||
s->status |= UHCI_STS_HCPERR;
|
||||
s->cmd &= ~UHCI_CMD_RS;
|
||||
uhci_update_irq(s);
|
||||
return TD_RESULT_STOP_FRAME;
|
||||
}
|
||||
|
||||
async = uhci_async_find_td(s, td_addr);
|
||||
if (async) {
|
||||
if (uhci_queue_verify(async->queue, qh_addr, td, td_addr, queuing)) {
|
||||
@@ -828,6 +815,19 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q, uint32_t qh_addr,
|
||||
return TD_RESULT_NEXT_QH;
|
||||
}
|
||||
|
||||
switch (pid) {
|
||||
case USB_TOKEN_OUT:
|
||||
case USB_TOKEN_SETUP:
|
||||
case USB_TOKEN_IN:
|
||||
break;
|
||||
default:
|
||||
/* invalid pid : frame interrupted */
|
||||
s->status |= UHCI_STS_HCPERR;
|
||||
s->cmd &= ~UHCI_CMD_RS;
|
||||
uhci_update_irq(s);
|
||||
return TD_RESULT_STOP_FRAME;
|
||||
}
|
||||
|
||||
if (async) {
|
||||
if (queuing) {
|
||||
/* we are busy filling the queue, we are not prepared
|
||||
|
||||
+4
-4
@@ -1775,10 +1775,10 @@ void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign,
|
||||
bool with_irqfd)
|
||||
{
|
||||
if (assign && !with_irqfd) {
|
||||
event_notifier_set_handler(&vq->guest_notifier,
|
||||
event_notifier_set_handler(&vq->guest_notifier, false,
|
||||
virtio_queue_guest_notifier_read);
|
||||
} else {
|
||||
event_notifier_set_handler(&vq->guest_notifier, NULL);
|
||||
event_notifier_set_handler(&vq->guest_notifier, false, NULL);
|
||||
}
|
||||
if (!assign) {
|
||||
/* Test and clear notifier before closing it,
|
||||
@@ -1829,10 +1829,10 @@ void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
|
||||
bool set_handler)
|
||||
{
|
||||
if (assign && set_handler) {
|
||||
event_notifier_set_handler(&vq->host_notifier,
|
||||
event_notifier_set_handler(&vq->host_notifier, true,
|
||||
virtio_queue_host_notifier_read);
|
||||
} else {
|
||||
event_notifier_set_handler(&vq->host_notifier, NULL);
|
||||
event_notifier_set_handler(&vq->host_notifier, true, NULL);
|
||||
}
|
||||
if (!assign) {
|
||||
/* Test and clear notifier before after disabling event,
|
||||
|
||||
@@ -34,7 +34,9 @@ int event_notifier_init(EventNotifier *, int active);
|
||||
void event_notifier_cleanup(EventNotifier *);
|
||||
int event_notifier_set(EventNotifier *);
|
||||
int event_notifier_test_and_clear(EventNotifier *);
|
||||
int event_notifier_set_handler(EventNotifier *, EventNotifierHandler *);
|
||||
int event_notifier_set_handler(EventNotifier *,
|
||||
bool is_external,
|
||||
EventNotifierHandler *);
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
void event_notifier_init_fd(EventNotifier *, int fd);
|
||||
|
||||
@@ -204,6 +204,7 @@ void qemu_set_fd_handler(int fd,
|
||||
void *opaque);
|
||||
|
||||
GSource *iohandler_get_g_source(void);
|
||||
AioContext *iohandler_get_aio_context(void);
|
||||
#ifdef CONFIG_POSIX
|
||||
/**
|
||||
* qemu_add_child_watch: Register a child process for reaping.
|
||||
|
||||
@@ -140,7 +140,7 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
|
||||
* user_creatable_add_opts_foreach:
|
||||
* @opaque: a user_creatable_add_opts_predicate callback or NULL
|
||||
* @opts: options to create
|
||||
* @errp: if an error occurs, a pointer to an area to store the error
|
||||
* @errp: unused
|
||||
*
|
||||
* An iterator callback to be used in conjunction with
|
||||
* the qemu_opts_foreach() method for creating a list of
|
||||
@@ -148,8 +148,9 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
|
||||
*
|
||||
* The @opaque parameter can be passed a user_creatable_add_opts_predicate
|
||||
* callback to filter which types of object are created during iteration.
|
||||
* When it fails, report the error.
|
||||
*
|
||||
* Returns: 0 on success, -1 on error
|
||||
* Returns: 0 on success, -1 when an error was reported.
|
||||
*/
|
||||
int user_creatable_add_opts_foreach(void *opaque,
|
||||
QemuOpts *opts, Error **errp);
|
||||
|
||||
@@ -44,6 +44,12 @@ static void iohandler_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
AioContext *iohandler_get_aio_context(void)
|
||||
{
|
||||
iohandler_init();
|
||||
return iohandler_ctx;
|
||||
}
|
||||
|
||||
GSource *iohandler_get_g_source(void)
|
||||
{
|
||||
iohandler_init();
|
||||
|
||||
+4
-6
@@ -1091,9 +1091,8 @@ static void nbd_trip(void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
ret = blk_read(exp->blk,
|
||||
(request.from + exp->dev_offset) / BDRV_SECTOR_SIZE,
|
||||
req->data, request.len / BDRV_SECTOR_SIZE);
|
||||
ret = blk_pread(exp->blk, request.from + exp->dev_offset,
|
||||
req->data, request.len);
|
||||
if (ret < 0) {
|
||||
LOG("reading from file failed");
|
||||
reply.error = -ret;
|
||||
@@ -1115,9 +1114,8 @@ static void nbd_trip(void *opaque)
|
||||
|
||||
TRACE("Writing to device");
|
||||
|
||||
ret = blk_write(exp->blk,
|
||||
(request.from + exp->dev_offset) / BDRV_SECTOR_SIZE,
|
||||
req->data, request.len / BDRV_SECTOR_SIZE);
|
||||
ret = blk_pwrite(exp->blk, request.from + exp->dev_offset,
|
||||
req->data, request.len);
|
||||
if (ret < 0) {
|
||||
LOG("writing to file failed");
|
||||
reply.error = -ret;
|
||||
|
||||
@@ -222,7 +222,7 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
|
||||
return;
|
||||
|
||||
error:
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name,
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
|
||||
"an int64 value or range");
|
||||
}
|
||||
|
||||
|
||||
+11
-28
@@ -435,8 +435,7 @@ static int img_create(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -598,7 +597,6 @@ static int img_check(int argc, char **argv)
|
||||
bool writethrough;
|
||||
ImageCheck *check;
|
||||
bool quiet = false;
|
||||
Error *local_err = NULL;
|
||||
bool image_opts = false;
|
||||
|
||||
fmt = NULL;
|
||||
@@ -679,8 +677,7 @@ static int img_check(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -871,8 +868,7 @@ static int img_commit(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1133,7 +1129,6 @@ static int img_compare(int argc, char **argv)
|
||||
int64_t nb_sectors;
|
||||
int c, pnum;
|
||||
uint64_t progress_base;
|
||||
Error *local_err = NULL;
|
||||
bool image_opts = false;
|
||||
|
||||
cache = BDRV_DEFAULT_CACHE;
|
||||
@@ -1201,8 +1196,7 @@ static int img_compare(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
ret = 2;
|
||||
goto out4;
|
||||
}
|
||||
@@ -1864,8 +1858,7 @@ static int img_convert(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
goto fail_getopt;
|
||||
}
|
||||
|
||||
@@ -2299,7 +2292,6 @@ static int img_info(int argc, char **argv)
|
||||
bool chain = false;
|
||||
const char *filename, *fmt, *output;
|
||||
ImageInfoList *list;
|
||||
Error *local_err = NULL;
|
||||
bool image_opts = false;
|
||||
|
||||
fmt = NULL;
|
||||
@@ -2363,8 +2355,7 @@ static int img_info(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2513,7 +2504,6 @@ static int img_map(int argc, char **argv)
|
||||
int64_t length;
|
||||
MapEntry curr = { .length = 0 }, next;
|
||||
int ret = 0;
|
||||
Error *local_err = NULL;
|
||||
bool image_opts = false;
|
||||
|
||||
fmt = NULL;
|
||||
@@ -2573,8 +2563,7 @@ static int img_map(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2717,8 +2706,7 @@ static int img_snapshot(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &err)) {
|
||||
error_report_err(err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2867,8 +2855,7 @@ static int img_rebase(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -3133,7 +3120,6 @@ static int img_resize(int argc, char **argv)
|
||||
bool quiet = false;
|
||||
BlockBackend *blk = NULL;
|
||||
QemuOpts *param;
|
||||
Error *local_err = NULL;
|
||||
|
||||
static QemuOptsList resize_options = {
|
||||
.name = "resize_options",
|
||||
@@ -3204,8 +3190,7 @@ static int img_resize(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -3297,7 +3282,6 @@ static int img_amend(int argc, char **argv)
|
||||
bool quiet = false, progress = false;
|
||||
BlockBackend *blk = NULL;
|
||||
BlockDriverState *bs = NULL;
|
||||
Error *local_err = NULL;
|
||||
bool image_opts = false;
|
||||
|
||||
cache = BDRV_DEFAULT_CACHE;
|
||||
@@ -3365,8 +3349,7 @@ static int img_amend(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
ret = -1;
|
||||
goto out_no_progress;
|
||||
}
|
||||
|
||||
@@ -534,8 +534,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_error)) {
|
||||
error_report_err(local_error);
|
||||
NULL, NULL)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -711,8 +711,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (qemu_opts_foreach(&qemu_object_opts,
|
||||
user_creatable_add_opts_foreach,
|
||||
NULL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
NULL, NULL)) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
@@ -170,6 +170,7 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
|
||||
{
|
||||
bool (*type_predicate)(const char *) = opaque;
|
||||
Object *obj = NULL;
|
||||
Error *err = NULL;
|
||||
const char *type;
|
||||
|
||||
type = qemu_opt_get(opts, "qom-type");
|
||||
@@ -178,8 +179,9 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
obj = user_creatable_add_opts(opts, errp);
|
||||
obj = user_creatable_add_opts(opts, &err);
|
||||
if (!obj) {
|
||||
error_report_err(err);
|
||||
return -1;
|
||||
}
|
||||
object_unref(obj);
|
||||
|
||||
+2
-1
@@ -275,7 +275,7 @@ void replay_configure(QemuOpts *opts)
|
||||
rr = qemu_opt_get(opts, "rr");
|
||||
if (!rr) {
|
||||
/* Just enabling icount */
|
||||
return;
|
||||
goto out;
|
||||
} else if (!strcmp(rr, "record")) {
|
||||
mode = REPLAY_MODE_RECORD;
|
||||
} else if (!strcmp(rr, "replay")) {
|
||||
@@ -293,6 +293,7 @@ void replay_configure(QemuOpts *opts)
|
||||
|
||||
replay_enable(fname, mode);
|
||||
|
||||
out:
|
||||
loc_pop(&loc);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -186,7 +186,7 @@ icmp_input(struct mbuf *m, int hlen)
|
||||
sotranslate_out(so, &addr);
|
||||
|
||||
if(sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0,
|
||||
(struct sockaddr *)&addr, sizeof(addr)) == -1) {
|
||||
(struct sockaddr *)&addr, sockaddr_size(&addr)) == -1) {
|
||||
DEBUG_MISC((dfd,"icmp_input udp sendto tx errno = %d-%s\n",
|
||||
errno,strerror(errno)));
|
||||
icmp_send_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, 0, strerror(errno));
|
||||
|
||||
+1
-1
@@ -627,7 +627,7 @@ sosendto(struct socket *so, struct mbuf *m)
|
||||
|
||||
/* Don't care what port we get */
|
||||
ret = sendto(so->s, m->m_data, m->m_len, 0,
|
||||
(struct sockaddr *)&addr, sizeof(addr));
|
||||
(struct sockaddr *)&addr, sockaddr_size(&addr));
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
@@ -122,6 +122,18 @@ static inline int sockaddr_equal(struct sockaddr_storage *a,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline socklen_t sockaddr_size(struct sockaddr_storage *a)
|
||||
{
|
||||
switch (a->ss_family) {
|
||||
case AF_INET:
|
||||
return sizeof(struct sockaddr_in);
|
||||
case AF_INET6:
|
||||
return sizeof(struct sockaddr_in6);
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
struct socket *solookup(struct socket **, struct socket *,
|
||||
struct sockaddr_storage *, struct sockaddr_storage *);
|
||||
struct socket *socreate(Slirp *);
|
||||
|
||||
+1
-1
@@ -413,7 +413,7 @@ int tcp_fconnect(struct socket *so, unsigned short af)
|
||||
sotranslate_out(so, &addr);
|
||||
|
||||
/* We don't care what port we get */
|
||||
ret = connect(s,(struct sockaddr *)&addr,sizeof (addr));
|
||||
ret = connect(s, (struct sockaddr *)&addr, sockaddr_size(&addr));
|
||||
|
||||
/*
|
||||
* If it's not in progress, it failed, so we just return 0,
|
||||
|
||||
@@ -40,3 +40,4 @@ stub-obj-y += qmp_pc_dimm_device_list.o
|
||||
stub-obj-y += target-monitor-defs.o
|
||||
stub-obj-y += target-get-monitor-def.o
|
||||
stub-obj-y += vhost.o
|
||||
stub-obj-y += iohandler.o
|
||||
@@ -0,0 +1,8 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/main-loop.h"
|
||||
|
||||
AioContext *iohandler_get_aio_context(void)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
@@ -9,3 +9,13 @@ void qemu_set_fd_handler(int fd,
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void aio_set_fd_handler(AioContext *ctx,
|
||||
int fd,
|
||||
bool is_external,
|
||||
IOHandler *io_read,
|
||||
IOHandler *io_write,
|
||||
void *opaque)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
@@ -88,7 +88,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint,
|
||||
goto err_sint_set_notifier;
|
||||
}
|
||||
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier,
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier, false,
|
||||
kvm_hv_sint_ack_handler);
|
||||
|
||||
gsi = kvm_irqchip_add_hv_sint_route(kvm_state, vcpu_id, sint);
|
||||
@@ -112,7 +112,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint,
|
||||
err_irqfd:
|
||||
kvm_irqchip_release_virq(kvm_state, gsi);
|
||||
err_gsi:
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL);
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier, false, NULL);
|
||||
event_notifier_cleanup(&sint_route->sint_ack_notifier);
|
||||
err_sint_set_notifier:
|
||||
event_notifier_cleanup(&sint_route->sint_set_notifier);
|
||||
@@ -128,7 +128,7 @@ void kvm_hv_sint_route_destroy(HvSintRoute *sint_route)
|
||||
&sint_route->sint_set_notifier,
|
||||
sint_route->gsi);
|
||||
kvm_irqchip_release_virq(kvm_state, sint_route->gsi);
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL);
|
||||
event_notifier_set_handler(&sint_route->sint_ack_notifier, false, NULL);
|
||||
event_notifier_cleanup(&sint_route->sint_ack_notifier);
|
||||
event_notifier_cleanup(&sint_route->sint_set_notifier);
|
||||
g_free(sint_route);
|
||||
|
||||
@@ -2294,29 +2294,29 @@ void helper_deret(CPUMIPSState *env)
|
||||
}
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
static inline void check_hwrena(CPUMIPSState *env, int reg)
|
||||
static inline void check_hwrena(CPUMIPSState *env, int reg, uintptr_t pc)
|
||||
{
|
||||
if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << reg))) {
|
||||
return;
|
||||
}
|
||||
do_raise_exception(env, EXCP_RI, GETPC());
|
||||
do_raise_exception(env, EXCP_RI, pc);
|
||||
}
|
||||
|
||||
target_ulong helper_rdhwr_cpunum(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 0);
|
||||
check_hwrena(env, 0, GETPC());
|
||||
return env->CP0_EBase & 0x3ff;
|
||||
}
|
||||
|
||||
target_ulong helper_rdhwr_synci_step(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 1);
|
||||
check_hwrena(env, 1, GETPC());
|
||||
return env->SYNCI_Step;
|
||||
}
|
||||
|
||||
target_ulong helper_rdhwr_cc(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 2);
|
||||
check_hwrena(env, 2, GETPC());
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
return env->CP0_Count;
|
||||
#else
|
||||
@@ -2326,19 +2326,19 @@ target_ulong helper_rdhwr_cc(CPUMIPSState *env)
|
||||
|
||||
target_ulong helper_rdhwr_ccres(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 3);
|
||||
check_hwrena(env, 3, GETPC());
|
||||
return env->CCRes;
|
||||
}
|
||||
|
||||
target_ulong helper_rdhwr_performance(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 4);
|
||||
check_hwrena(env, 4, GETPC());
|
||||
return env->CP0_Performance0;
|
||||
}
|
||||
|
||||
target_ulong helper_rdhwr_xnp(CPUMIPSState *env)
|
||||
{
|
||||
check_hwrena(env, 5);
|
||||
check_hwrena(env, 5, GETPC());
|
||||
return (env->CP0_Config5 >> CP0C5_XNP) & 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -91,9 +91,11 @@ int event_notifier_get_fd(const EventNotifier *e)
|
||||
}
|
||||
|
||||
int event_notifier_set_handler(EventNotifier *e,
|
||||
bool is_external,
|
||||
EventNotifierHandler *handler)
|
||||
{
|
||||
qemu_set_fd_handler(e->rfd, (IOHandler *)handler, NULL, e);
|
||||
aio_set_fd_handler(iohandler_get_aio_context(), e->rfd, is_external,
|
||||
(IOHandler *)handler, NULL, e);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ HANDLE event_notifier_get_handle(EventNotifier *e)
|
||||
}
|
||||
|
||||
int event_notifier_set_handler(EventNotifier *e,
|
||||
bool is_external,
|
||||
EventNotifierHandler *handler)
|
||||
{
|
||||
if (handler) {
|
||||
|
||||
+2
-1
@@ -26,7 +26,8 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(__linux__) && (defined(__x86_64__) || defined(__arm__))
|
||||
#if defined(__linux__) && \
|
||||
(defined(__x86_64__) || defined(__arm__) || defined(__aarch64__))
|
||||
/* Use 2 MiB alignment so transparent hugepages can be used by KVM.
|
||||
Valgrind does not support alignments larger than 1 MiB,
|
||||
therefore we need special code which handles running on Valgrind. */
|
||||
|
||||
+3
-3
@@ -1108,19 +1108,19 @@ int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
|
||||
{
|
||||
Location loc;
|
||||
QemuOpts *opts;
|
||||
int rc;
|
||||
int rc = 0;
|
||||
|
||||
loc_push_none(&loc);
|
||||
QTAILQ_FOREACH(opts, &list->head, next) {
|
||||
loc_restore(&opts->loc);
|
||||
rc = func(opaque, opts, errp);
|
||||
if (rc) {
|
||||
return rc;
|
||||
break;
|
||||
}
|
||||
assert(!errp || !*errp);
|
||||
}
|
||||
loc_pop(&loc);
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static size_t count_opts_list(QemuOptsList *list)
|
||||
|
||||
@@ -4291,8 +4291,7 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
if (qemu_opts_foreach(qemu_find_opts("object"),
|
||||
user_creatable_add_opts_foreach,
|
||||
object_create_initial, &err)) {
|
||||
error_report_err(err);
|
||||
object_create_initial, NULL)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -4410,8 +4409,7 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
if (qemu_opts_foreach(qemu_find_opts("object"),
|
||||
user_creatable_add_opts_foreach,
|
||||
object_create_delayed, &err)) {
|
||||
error_report_err(err);
|
||||
object_create_delayed, NULL)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user