mirror of
https://github.com/qemu/qemu.git
synced 2024-12-11 20:53:51 +08:00
0c2d70c448
Anthony reported that >4GB guests on Xen with 32bit QEMU broke after commit4ed023c
("Round up RAMBlock sizes to host page sizes", 2015-11-05). In that patch sizes are masked against qemu_host_page_size/mask which are uintptr_t, and thus 32bit on a 32bit QEMU, even though the ram space might be bigger than 4GB on Xen. Since ram_addr_t is not available on user-mode emulation targets, ensure that we get a sign extension when masking away the low bits of the address. Remove the ~10 year old scary comment that the type of these variables is probably wrong, with another equally scary comment. The new comment however does not have "???" in it, which is arguably an improvement. For completeness use the alignment macros in linux-user and bsd-user instead of manually doing an &. linux-user and bsd-user are not affected by the Xen issue, however. Reviewed-by: Juan Quintela <quintela@redhat.com> Reported-by: Anthony PERARD <anthony.perard@citrix.com> Fixes:4ed023ce2a
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
57 lines
1.6 KiB
C
57 lines
1.6 KiB
C
/*
|
|
* Host code generation common components
|
|
*
|
|
* Copyright (c) 2015 Peter Crosthwaite <crosthwaite.peter@gmail.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "qemu-common.h"
|
|
#include "qom/cpu.h"
|
|
|
|
uintptr_t qemu_real_host_page_size;
|
|
intptr_t qemu_real_host_page_mask;
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
/* mask must never be zero, except for A20 change call */
|
|
static void tcg_handle_interrupt(CPUState *cpu, int mask)
|
|
{
|
|
int old_mask;
|
|
|
|
old_mask = cpu->interrupt_request;
|
|
cpu->interrupt_request |= mask;
|
|
|
|
/*
|
|
* If called from iothread context, wake the target cpu in
|
|
* case its halted.
|
|
*/
|
|
if (!qemu_cpu_is_self(cpu)) {
|
|
qemu_cpu_kick(cpu);
|
|
return;
|
|
}
|
|
|
|
if (use_icount) {
|
|
cpu->icount_decr.u16.high = 0xffff;
|
|
if (!cpu->can_do_io
|
|
&& (mask & ~old_mask) != 0) {
|
|
cpu_abort(cpu, "Raised interrupt while not in I/O function");
|
|
}
|
|
} else {
|
|
cpu->tcg_exit_req = 1;
|
|
}
|
|
}
|
|
|
|
CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
|
|
#endif
|