Compare commits
67 Commits
pull-vnc-1
...
pull-chard
Author | SHA1 | Date | |
---|---|---|---|
|
ac1b84dd1e | ||
|
2396187076 | ||
|
01207d0b78 | ||
|
0ca540dbae | ||
|
ed9b103d3e | ||
|
c57ec3249e | ||
|
fe6c53b4bb | ||
|
b0f15a5d56 | ||
|
118760dfc9 | ||
|
b304bf0021 | ||
|
3f1506704e | ||
|
0c126db27c | ||
|
72c1d3af6e | ||
|
2b194951c5 | ||
|
c8f8f9fb2b | ||
|
d2f41a1169 | ||
|
43a32ed68f | ||
|
b29c8f115d | ||
|
0624976f61 | ||
|
7c2cb42b50 | ||
|
af5199347a | ||
|
c9dd4074df | ||
|
9b74d0d598 | ||
|
4b87dc4c97 | ||
|
dbb2a1326a | ||
|
c3aa84b68f | ||
|
e9d818b8b1 | ||
|
cbc14e6f28 | ||
|
16513b1b45 | ||
|
5264917bcf | ||
|
220c8ed536 | ||
|
f1b7e0e498 | ||
|
175f099b30 | ||
|
15d914b18d | ||
|
262f6f5140 | ||
|
4a4fcdf6df | ||
|
4900116e6f | ||
|
8f480de0c9 | ||
|
5d12f961c6 | ||
|
6e1f0a55a1 | ||
|
8e46bbf362 | ||
|
ddfa83ea06 | ||
|
6cb46e1e90 | ||
|
8dcf525abc | ||
|
f8e2484389 | ||
|
523fdc08cc | ||
|
017a86f7ad | ||
|
2e796c7621 | ||
|
8d8db193f2 | ||
|
a51a6b6ad5 | ||
|
f029341494 | ||
|
7763ffa017 | ||
|
3353d0dcc3 | ||
|
82295d8a2d | ||
|
464400f6a5 | ||
|
4fed9421e9 | ||
|
ac4df4e608 | ||
|
fd8cec932c | ||
|
b51910baf2 | ||
|
974a196d7f | ||
|
f19e00d776 | ||
|
76ca310a19 | ||
cd98d390ae | |||
|
8a3ae9109e | ||
|
4cf2348026 | ||
|
f9a49dfa02 | ||
|
9ba3cf540f |
@@ -158,7 +158,6 @@ Guest CPU Cores (KVM):
|
|||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Overall
|
Overall
|
||||||
M: Gleb Natapov <gleb@redhat.com>
|
|
||||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -176,12 +175,14 @@ S: Maintained
|
|||||||
F: target-ppc/kvm.c
|
F: target-ppc/kvm.c
|
||||||
|
|
||||||
S390
|
S390
|
||||||
|
M: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||||
|
M: Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||||
M: Alexander Graf <agraf@suse.de>
|
M: Alexander Graf <agraf@suse.de>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: target-s390x/kvm.c
|
F: target-s390x/kvm.c
|
||||||
|
F: hw/intc/s390_flic.[hc]
|
||||||
|
|
||||||
X86
|
X86
|
||||||
M: Gleb Natapov <gleb@redhat.com>
|
|
||||||
M: Marcelo Tosatti <mtosatti@redhat.com>
|
M: Marcelo Tosatti <mtosatti@redhat.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -495,10 +496,13 @@ F: hw/s390x/s390-*.c
|
|||||||
|
|
||||||
S390 Virtio-ccw
|
S390 Virtio-ccw
|
||||||
M: Cornelia Huck <cornelia.huck@de.ibm.com>
|
M: Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||||
|
M: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||||
M: Alexander Graf <agraf@suse.de>
|
M: Alexander Graf <agraf@suse.de>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: hw/s390x/s390-virtio-ccw.c
|
F: hw/s390x/s390-virtio-ccw.c
|
||||||
F: hw/s390x/css.[hc]
|
F: hw/s390x/css.[hc]
|
||||||
|
F: hw/s390x/sclp*.[hc]
|
||||||
|
F: hw/s390x/ipl*.[hc]
|
||||||
T: git git://github.com/cohuck/qemu virtio-ccw-upstr
|
T: git git://github.com/cohuck/qemu virtio-ccw-upstr
|
||||||
|
|
||||||
UniCore32 Machines
|
UniCore32 Machines
|
||||||
@@ -629,6 +633,7 @@ F: hw/block/virtio-blk.c
|
|||||||
|
|
||||||
virtio-ccw
|
virtio-ccw
|
||||||
M: Cornelia Huck <cornelia.huck@de.ibm.com>
|
M: Cornelia Huck <cornelia.huck@de.ibm.com>
|
||||||
|
M: Christian Borntraeger <borntraeger@de.ibm.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: hw/s390x/virtio-ccw.[hc]
|
F: hw/s390x/virtio-ccw.[hc]
|
||||||
T: git git://github.com/cohuck/qemu virtio-ccw-upstr
|
T: git git://github.com/cohuck/qemu virtio-ccw-upstr
|
||||||
|
52
arch_init.c
52
arch_init.c
@@ -164,8 +164,9 @@ static struct {
|
|||||||
uint8_t *encoded_buf;
|
uint8_t *encoded_buf;
|
||||||
/* buffer for storing page content */
|
/* buffer for storing page content */
|
||||||
uint8_t *current_buf;
|
uint8_t *current_buf;
|
||||||
/* Cache for XBZRLE */
|
/* Cache for XBZRLE, Protected by lock. */
|
||||||
PageCache *cache;
|
PageCache *cache;
|
||||||
|
QemuMutex lock;
|
||||||
} XBZRLE = {
|
} XBZRLE = {
|
||||||
.encoded_buf = NULL,
|
.encoded_buf = NULL,
|
||||||
.current_buf = NULL,
|
.current_buf = NULL,
|
||||||
@@ -174,16 +175,52 @@ static struct {
|
|||||||
/* buffer used for XBZRLE decoding */
|
/* buffer used for XBZRLE decoding */
|
||||||
static uint8_t *xbzrle_decoded_buf;
|
static uint8_t *xbzrle_decoded_buf;
|
||||||
|
|
||||||
|
static void XBZRLE_cache_lock(void)
|
||||||
|
{
|
||||||
|
if (migrate_use_xbzrle())
|
||||||
|
qemu_mutex_lock(&XBZRLE.lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void XBZRLE_cache_unlock(void)
|
||||||
|
{
|
||||||
|
if (migrate_use_xbzrle())
|
||||||
|
qemu_mutex_unlock(&XBZRLE.lock);
|
||||||
|
}
|
||||||
|
|
||||||
int64_t xbzrle_cache_resize(int64_t new_size)
|
int64_t xbzrle_cache_resize(int64_t new_size)
|
||||||
{
|
{
|
||||||
|
PageCache *new_cache, *cache_to_free;
|
||||||
|
|
||||||
if (new_size < TARGET_PAGE_SIZE) {
|
if (new_size < TARGET_PAGE_SIZE) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* no need to lock, the current thread holds qemu big lock */
|
||||||
if (XBZRLE.cache != NULL) {
|
if (XBZRLE.cache != NULL) {
|
||||||
return cache_resize(XBZRLE.cache, new_size / TARGET_PAGE_SIZE) *
|
/* check XBZRLE.cache again later */
|
||||||
TARGET_PAGE_SIZE;
|
if (pow2floor(new_size) == migrate_xbzrle_cache_size()) {
|
||||||
|
return pow2floor(new_size);
|
||||||
|
}
|
||||||
|
new_cache = cache_init(new_size / TARGET_PAGE_SIZE,
|
||||||
|
TARGET_PAGE_SIZE);
|
||||||
|
if (!new_cache) {
|
||||||
|
DPRINTF("Error creating cache\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
XBZRLE_cache_lock();
|
||||||
|
/* the XBZRLE.cache may have be destroyed, check it again */
|
||||||
|
if (XBZRLE.cache != NULL) {
|
||||||
|
cache_to_free = XBZRLE.cache;
|
||||||
|
XBZRLE.cache = new_cache;
|
||||||
|
} else {
|
||||||
|
cache_to_free = new_cache;
|
||||||
|
}
|
||||||
|
XBZRLE_cache_unlock();
|
||||||
|
|
||||||
|
cache_fini(cache_to_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pow2floor(new_size);
|
return pow2floor(new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -539,6 +576,8 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
|
|||||||
ret = ram_control_save_page(f, block->offset,
|
ret = ram_control_save_page(f, block->offset,
|
||||||
offset, TARGET_PAGE_SIZE, &bytes_sent);
|
offset, TARGET_PAGE_SIZE, &bytes_sent);
|
||||||
|
|
||||||
|
XBZRLE_cache_lock();
|
||||||
|
|
||||||
current_addr = block->offset + offset;
|
current_addr = block->offset + offset;
|
||||||
if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
|
if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
|
||||||
if (ret != RAM_SAVE_CONTROL_DELAYED) {
|
if (ret != RAM_SAVE_CONTROL_DELAYED) {
|
||||||
@@ -587,6 +626,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
|
|||||||
acct_info.norm_pages++;
|
acct_info.norm_pages++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XBZRLE_cache_unlock();
|
||||||
/* if page is unmodified, continue to the next */
|
/* if page is unmodified, continue to the next */
|
||||||
if (bytes_sent > 0) {
|
if (bytes_sent > 0) {
|
||||||
last_sent_block = block;
|
last_sent_block = block;
|
||||||
@@ -654,6 +694,7 @@ static void migration_end(void)
|
|||||||
migration_bitmap = NULL;
|
migration_bitmap = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XBZRLE_cache_lock();
|
||||||
if (XBZRLE.cache) {
|
if (XBZRLE.cache) {
|
||||||
cache_fini(XBZRLE.cache);
|
cache_fini(XBZRLE.cache);
|
||||||
g_free(XBZRLE.cache);
|
g_free(XBZRLE.cache);
|
||||||
@@ -663,6 +704,7 @@ static void migration_end(void)
|
|||||||
XBZRLE.encoded_buf = NULL;
|
XBZRLE.encoded_buf = NULL;
|
||||||
XBZRLE.current_buf = NULL;
|
XBZRLE.current_buf = NULL;
|
||||||
}
|
}
|
||||||
|
XBZRLE_cache_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ram_migration_cancel(void *opaque)
|
static void ram_migration_cancel(void *opaque)
|
||||||
@@ -693,13 +735,17 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
|
|||||||
dirty_rate_high_cnt = 0;
|
dirty_rate_high_cnt = 0;
|
||||||
|
|
||||||
if (migrate_use_xbzrle()) {
|
if (migrate_use_xbzrle()) {
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() /
|
XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() /
|
||||||
TARGET_PAGE_SIZE,
|
TARGET_PAGE_SIZE,
|
||||||
TARGET_PAGE_SIZE);
|
TARGET_PAGE_SIZE);
|
||||||
if (!XBZRLE.cache) {
|
if (!XBZRLE.cache) {
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
DPRINTF("Error creating cache\n");
|
DPRINTF("Error creating cache\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
qemu_mutex_init(&XBZRLE.lock);
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
|
|
||||||
/* We prefer not to abort if there is no memory */
|
/* We prefer not to abort if there is no memory */
|
||||||
XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE);
|
XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE);
|
||||||
|
10
configure
vendored
10
configure
vendored
@@ -4107,7 +4107,11 @@ echo "vhost-net support $vhost_net"
|
|||||||
echo "vhost-scsi support $vhost_scsi"
|
echo "vhost-scsi support $vhost_scsi"
|
||||||
echo "Trace backend $trace_backend"
|
echo "Trace backend $trace_backend"
|
||||||
echo "Trace output file $trace_file-<pid>"
|
echo "Trace output file $trace_file-<pid>"
|
||||||
|
if test "$spice" = "yes"; then
|
||||||
echo "spice support $spice ($spice_protocol_version/$spice_server_version)"
|
echo "spice support $spice ($spice_protocol_version/$spice_server_version)"
|
||||||
|
else
|
||||||
|
echo "spice support $spice"
|
||||||
|
fi
|
||||||
echo "rbd support $rbd"
|
echo "rbd support $rbd"
|
||||||
echo "xfsctl support $xfs"
|
echo "xfsctl support $xfs"
|
||||||
echo "nss used $smartcard_nss"
|
echo "nss used $smartcard_nss"
|
||||||
@@ -4968,6 +4972,12 @@ for i in $ARCH $TARGET_BASE_ARCH ; do
|
|||||||
echo "CONFIG_ALPHA_DIS=y" >> $config_target_mak
|
echo "CONFIG_ALPHA_DIS=y" >> $config_target_mak
|
||||||
echo "CONFIG_ALPHA_DIS=y" >> config-all-disas.mak
|
echo "CONFIG_ALPHA_DIS=y" >> config-all-disas.mak
|
||||||
;;
|
;;
|
||||||
|
aarch64)
|
||||||
|
if test -n "${cxx}"; then
|
||||||
|
echo "CONFIG_ARM_A64_DIS=y" >> $config_target_mak
|
||||||
|
echo "CONFIG_ARM_A64_DIS=y" >> config-all-disas.mak
|
||||||
|
fi
|
||||||
|
;;
|
||||||
arm)
|
arm)
|
||||||
echo "CONFIG_ARM_DIS=y" >> $config_target_mak
|
echo "CONFIG_ARM_DIS=y" >> $config_target_mak
|
||||||
echo "CONFIG_ARM_DIS=y" >> config-all-disas.mak
|
echo "CONFIG_ARM_DIS=y" >> config-all-disas.mak
|
||||||
|
25
cpus.c
25
cpus.c
@@ -1117,8 +1117,13 @@ void resume_all_vcpus(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For temporary buffers for forming a name */
|
||||||
|
#define VCPU_THREAD_NAME_SIZE 16
|
||||||
|
|
||||||
static void qemu_tcg_init_vcpu(CPUState *cpu)
|
static void qemu_tcg_init_vcpu(CPUState *cpu)
|
||||||
{
|
{
|
||||||
|
char thread_name[VCPU_THREAD_NAME_SIZE];
|
||||||
|
|
||||||
tcg_cpu_address_space_init(cpu, cpu->as);
|
tcg_cpu_address_space_init(cpu, cpu->as);
|
||||||
|
|
||||||
/* share a single thread for all cpus with TCG */
|
/* share a single thread for all cpus with TCG */
|
||||||
@@ -1127,8 +1132,10 @@ static void qemu_tcg_init_vcpu(CPUState *cpu)
|
|||||||
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
||||||
qemu_cond_init(cpu->halt_cond);
|
qemu_cond_init(cpu->halt_cond);
|
||||||
tcg_halt_cond = cpu->halt_cond;
|
tcg_halt_cond = cpu->halt_cond;
|
||||||
qemu_thread_create(cpu->thread, qemu_tcg_cpu_thread_fn, cpu,
|
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
|
||||||
QEMU_THREAD_JOINABLE);
|
cpu->cpu_index);
|
||||||
|
qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
|
||||||
|
cpu, QEMU_THREAD_JOINABLE);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
cpu->hThread = qemu_thread_get_handle(cpu->thread);
|
cpu->hThread = qemu_thread_get_handle(cpu->thread);
|
||||||
#endif
|
#endif
|
||||||
@@ -1144,11 +1151,15 @@ static void qemu_tcg_init_vcpu(CPUState *cpu)
|
|||||||
|
|
||||||
static void qemu_kvm_start_vcpu(CPUState *cpu)
|
static void qemu_kvm_start_vcpu(CPUState *cpu)
|
||||||
{
|
{
|
||||||
|
char thread_name[VCPU_THREAD_NAME_SIZE];
|
||||||
|
|
||||||
cpu->thread = g_malloc0(sizeof(QemuThread));
|
cpu->thread = g_malloc0(sizeof(QemuThread));
|
||||||
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
||||||
qemu_cond_init(cpu->halt_cond);
|
qemu_cond_init(cpu->halt_cond);
|
||||||
qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu,
|
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
|
||||||
QEMU_THREAD_JOINABLE);
|
cpu->cpu_index);
|
||||||
|
qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
|
||||||
|
cpu, QEMU_THREAD_JOINABLE);
|
||||||
while (!cpu->created) {
|
while (!cpu->created) {
|
||||||
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
|
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
|
||||||
}
|
}
|
||||||
@@ -1156,10 +1167,14 @@ static void qemu_kvm_start_vcpu(CPUState *cpu)
|
|||||||
|
|
||||||
static void qemu_dummy_start_vcpu(CPUState *cpu)
|
static void qemu_dummy_start_vcpu(CPUState *cpu)
|
||||||
{
|
{
|
||||||
|
char thread_name[VCPU_THREAD_NAME_SIZE];
|
||||||
|
|
||||||
cpu->thread = g_malloc0(sizeof(QemuThread));
|
cpu->thread = g_malloc0(sizeof(QemuThread));
|
||||||
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
||||||
qemu_cond_init(cpu->halt_cond);
|
qemu_cond_init(cpu->halt_cond);
|
||||||
qemu_thread_create(cpu->thread, qemu_dummy_cpu_thread_fn, cpu,
|
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
|
||||||
|
cpu->cpu_index);
|
||||||
|
qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
|
||||||
QEMU_THREAD_JOINABLE);
|
QEMU_THREAD_JOINABLE);
|
||||||
while (!cpu->created) {
|
while (!cpu->created) {
|
||||||
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
|
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
|
||||||
|
@@ -1342,7 +1342,7 @@ int Disassembler::SubstituteImmediateField(Instruction* instr,
|
|||||||
ASSERT(format[5] == 'L');
|
ASSERT(format[5] == 'L');
|
||||||
AppendToOutput("#0x%" PRIx64, instr->ImmMoveWide());
|
AppendToOutput("#0x%" PRIx64, instr->ImmMoveWide());
|
||||||
if (instr->ShiftMoveWide() > 0) {
|
if (instr->ShiftMoveWide() > 0) {
|
||||||
AppendToOutput(", lsl #%d", 16 * instr->ShiftMoveWide());
|
AppendToOutput(", lsl #%" PRId64, 16 * instr->ShiftMoveWide());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 8;
|
return 8;
|
||||||
@@ -1391,7 +1391,7 @@ int Disassembler::SubstituteImmediateField(Instruction* instr,
|
|||||||
}
|
}
|
||||||
case 'F': { // IFPSingle, IFPDouble or IFPFBits.
|
case 'F': { // IFPSingle, IFPDouble or IFPFBits.
|
||||||
if (format[3] == 'F') { // IFPFbits.
|
if (format[3] == 'F') { // IFPFbits.
|
||||||
AppendToOutput("#%d", 64 - instr->FPScale());
|
AppendToOutput("#%" PRId64, 64 - instr->FPScale());
|
||||||
return 8;
|
return 8;
|
||||||
} else {
|
} else {
|
||||||
AppendToOutput("#0x%" PRIx64 " (%.4f)", instr->ImmFP(),
|
AppendToOutput("#0x%" PRIx64 " (%.4f)", instr->ImmFP(),
|
||||||
@@ -1412,23 +1412,23 @@ int Disassembler::SubstituteImmediateField(Instruction* instr,
|
|||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
case 'P': { // IP - Conditional compare.
|
case 'P': { // IP - Conditional compare.
|
||||||
AppendToOutput("#%d", instr->ImmCondCmp());
|
AppendToOutput("#%" PRId64, instr->ImmCondCmp());
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
case 'B': { // Bitfields.
|
case 'B': { // Bitfields.
|
||||||
return SubstituteBitfieldImmediateField(instr, format);
|
return SubstituteBitfieldImmediateField(instr, format);
|
||||||
}
|
}
|
||||||
case 'E': { // IExtract.
|
case 'E': { // IExtract.
|
||||||
AppendToOutput("#%d", instr->ImmS());
|
AppendToOutput("#%" PRId64, instr->ImmS());
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
case 'S': { // IS - Test and branch bit.
|
case 'S': { // IS - Test and branch bit.
|
||||||
AppendToOutput("#%d", (instr->ImmTestBranchBit5() << 5) |
|
AppendToOutput("#%" PRId64, (instr->ImmTestBranchBit5() << 5) |
|
||||||
instr->ImmTestBranchBit40());
|
instr->ImmTestBranchBit40());
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
case 'D': { // IDebug - HLT and BRK instructions.
|
case 'D': { // IDebug - HLT and BRK instructions.
|
||||||
AppendToOutput("#0x%x", instr->ImmException());
|
AppendToOutput("#0x%" PRIx64, instr->ImmException());
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@@ -1598,12 +1598,12 @@ int Disassembler::SubstituteExtendField(Instruction* instr,
|
|||||||
(((instr->ExtendMode() == UXTW) && (instr->SixtyFourBits() == 0)) ||
|
(((instr->ExtendMode() == UXTW) && (instr->SixtyFourBits() == 0)) ||
|
||||||
(instr->ExtendMode() == UXTX))) {
|
(instr->ExtendMode() == UXTX))) {
|
||||||
if (instr->ImmExtendShift() > 0) {
|
if (instr->ImmExtendShift() > 0) {
|
||||||
AppendToOutput(", lsl #%d", instr->ImmExtendShift());
|
AppendToOutput(", lsl #%" PRId64, instr->ImmExtendShift());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AppendToOutput(", %s", extend_mode[instr->ExtendMode()]);
|
AppendToOutput(", %s", extend_mode[instr->ExtendMode()]);
|
||||||
if (instr->ImmExtendShift() > 0) {
|
if (instr->ImmExtendShift() > 0) {
|
||||||
AppendToOutput(" #%d", instr->ImmExtendShift());
|
AppendToOutput(" #%" PRId64, instr->ImmExtendShift());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 3;
|
return 3;
|
||||||
@@ -1632,7 +1632,7 @@ int Disassembler::SubstituteLSRegOffsetField(Instruction* instr,
|
|||||||
if (!((ext == UXTX) && (shift == 0))) {
|
if (!((ext == UXTX) && (shift == 0))) {
|
||||||
AppendToOutput(", %s", extend_mode[ext]);
|
AppendToOutput(", %s", extend_mode[ext]);
|
||||||
if (shift != 0) {
|
if (shift != 0) {
|
||||||
AppendToOutput(" #%d", instr->SizeLS());
|
AppendToOutput(" #%" PRId64, instr->SizeLS());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 9;
|
return 9;
|
||||||
|
14
exec.c
14
exec.c
@@ -1029,7 +1029,7 @@ static void *file_ram_alloc(RAMBlock *block,
|
|||||||
|
|
||||||
hpagesize = gethugepagesize(path);
|
hpagesize = gethugepagesize(path);
|
||||||
if (!hpagesize) {
|
if (!hpagesize) {
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memory < hpagesize) {
|
if (memory < hpagesize) {
|
||||||
@@ -1038,7 +1038,7 @@ static void *file_ram_alloc(RAMBlock *block,
|
|||||||
|
|
||||||
if (kvm_enabled() && !kvm_has_sync_mmu()) {
|
if (kvm_enabled() && !kvm_has_sync_mmu()) {
|
||||||
fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
|
fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make name safe to use with mkstemp by replacing '/' with '_'. */
|
/* Make name safe to use with mkstemp by replacing '/' with '_'. */
|
||||||
@@ -1056,7 +1056,7 @@ static void *file_ram_alloc(RAMBlock *block,
|
|||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror("unable to create backing store for hugepages");
|
perror("unable to create backing store for hugepages");
|
||||||
g_free(filename);
|
g_free(filename);
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
unlink(filename);
|
unlink(filename);
|
||||||
g_free(filename);
|
g_free(filename);
|
||||||
@@ -1076,7 +1076,7 @@ static void *file_ram_alloc(RAMBlock *block,
|
|||||||
if (area == MAP_FAILED) {
|
if (area == MAP_FAILED) {
|
||||||
perror("file_ram_alloc: can't mmap RAM pages");
|
perror("file_ram_alloc: can't mmap RAM pages");
|
||||||
close(fd);
|
close(fd);
|
||||||
return (NULL);
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mem_prealloc) {
|
if (mem_prealloc) {
|
||||||
@@ -1120,6 +1120,12 @@ static void *file_ram_alloc(RAMBlock *block,
|
|||||||
|
|
||||||
block->fd = fd;
|
block->fd = fd;
|
||||||
return area;
|
return area;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (mem_prealloc) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void *file_ram_alloc(RAMBlock *block,
|
static void *file_ram_alloc(RAMBlock *block,
|
||||||
|
@@ -110,10 +110,10 @@
|
|||||||
#define MP_PHY_88E3015 0x01410E20
|
#define MP_PHY_88E3015 0x01410E20
|
||||||
|
|
||||||
/* TX descriptor status */
|
/* TX descriptor status */
|
||||||
#define MP_ETH_TX_OWN (1 << 31)
|
#define MP_ETH_TX_OWN (1U << 31)
|
||||||
|
|
||||||
/* RX descriptor status */
|
/* RX descriptor status */
|
||||||
#define MP_ETH_RX_OWN (1 << 31)
|
#define MP_ETH_RX_OWN (1U << 31)
|
||||||
|
|
||||||
/* Interrupt cause/mask bits */
|
/* Interrupt cause/mask bits */
|
||||||
#define MP_ETH_IRQ_RX_BIT 0
|
#define MP_ETH_IRQ_RX_BIT 0
|
||||||
|
@@ -809,22 +809,26 @@ static inline void omap_pin_funcmux1_update(struct omap_mpu_state_s *s,
|
|||||||
uint32_t diff, uint32_t value)
|
uint32_t diff, uint32_t value)
|
||||||
{
|
{
|
||||||
if (s->compat1509) {
|
if (s->compat1509) {
|
||||||
if (diff & (1 << 31)) /* MCBSP3_CLK_HIZ_DI */
|
if (diff & (1U << 31)) {
|
||||||
omap_clk_onoff(omap_findclk(s, "mcbsp3.clkx"),
|
/* MCBSP3_CLK_HIZ_DI */
|
||||||
(value >> 31) & 1);
|
omap_clk_onoff(omap_findclk(s, "mcbsp3.clkx"), (value >> 31) & 1);
|
||||||
if (diff & (1 << 1)) /* CLK32K */
|
}
|
||||||
omap_clk_onoff(omap_findclk(s, "clk32k_out"),
|
if (diff & (1 << 1)) {
|
||||||
(~value >> 1) & 1);
|
/* CLK32K */
|
||||||
|
omap_clk_onoff(omap_findclk(s, "clk32k_out"), (~value >> 1) & 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void omap_pin_modconf1_update(struct omap_mpu_state_s *s,
|
static inline void omap_pin_modconf1_update(struct omap_mpu_state_s *s,
|
||||||
uint32_t diff, uint32_t value)
|
uint32_t diff, uint32_t value)
|
||||||
{
|
{
|
||||||
if (diff & (1 << 31)) /* CONF_MOD_UART3_CLK_MODE_R */
|
if (diff & (1U << 31)) {
|
||||||
omap_clk_reparent(omap_findclk(s, "uart3_ck"),
|
/* CONF_MOD_UART3_CLK_MODE_R */
|
||||||
omap_findclk(s, ((value >> 31) & 1) ?
|
omap_clk_reparent(omap_findclk(s, "uart3_ck"),
|
||||||
"ck_48m" : "armper_ck"));
|
omap_findclk(s, ((value >> 31) & 1) ?
|
||||||
|
"ck_48m" : "armper_ck"));
|
||||||
|
}
|
||||||
if (diff & (1 << 30)) /* CONF_MOD_UART2_CLK_MODE_R */
|
if (diff & (1 << 30)) /* CONF_MOD_UART2_CLK_MODE_R */
|
||||||
omap_clk_reparent(omap_findclk(s, "uart2_ck"),
|
omap_clk_reparent(omap_findclk(s, "uart2_ck"),
|
||||||
omap_findclk(s, ((value >> 30) & 1) ?
|
omap_findclk(s, ((value >> 30) & 1) ?
|
||||||
|
@@ -259,7 +259,7 @@ static void pxa2xx_pwrmode_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
/* Idle */
|
/* Idle */
|
||||||
if (!(s->cm_regs[CCCR >> 2] & (1 << 31))) { /* CPDIS */
|
if (!(s->cm_regs[CCCR >> 2] & (1U << 31))) { /* CPDIS */
|
||||||
cpu_interrupt(CPU(s->cpu), CPU_INTERRUPT_HALT);
|
cpu_interrupt(CPU(s->cpu), CPU_INTERRUPT_HALT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -496,7 +496,7 @@ typedef struct {
|
|||||||
#define SSCR0_SSE (1 << 7)
|
#define SSCR0_SSE (1 << 7)
|
||||||
#define SSCR0_RIM (1 << 22)
|
#define SSCR0_RIM (1 << 22)
|
||||||
#define SSCR0_TIM (1 << 23)
|
#define SSCR0_TIM (1 << 23)
|
||||||
#define SSCR0_MOD (1 << 31)
|
#define SSCR0_MOD (1U << 31)
|
||||||
#define SSCR0_DSS(x) (((((x) >> 16) & 0x10) | ((x) & 0xf)) + 1)
|
#define SSCR0_DSS(x) (((((x) >> 16) & 0x10) | ((x) & 0xf)) + 1)
|
||||||
#define SSCR1_RIE (1 << 0)
|
#define SSCR1_RIE (1 << 0)
|
||||||
#define SSCR1_TIE (1 << 1)
|
#define SSCR1_TIE (1 << 1)
|
||||||
@@ -1006,7 +1006,7 @@ static void pxa2xx_rtc_write(void *opaque, hwaddr addr,
|
|||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case RTTR:
|
case RTTR:
|
||||||
if (!(s->rttr & (1 << 31))) {
|
if (!(s->rttr & (1U << 31))) {
|
||||||
pxa2xx_rtc_hzupdate(s);
|
pxa2xx_rtc_hzupdate(s);
|
||||||
s->rttr = value;
|
s->rttr = value;
|
||||||
pxa2xx_rtc_alarm_update(s, s->rtsr);
|
pxa2xx_rtc_alarm_update(s, s->rtsr);
|
||||||
|
@@ -110,7 +110,7 @@ static void pxa2xx_gpio_set(void *opaque, int line, int level)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bank = line >> 5;
|
bank = line >> 5;
|
||||||
mask = 1 << (line & 31);
|
mask = 1U << (line & 31);
|
||||||
|
|
||||||
if (level) {
|
if (level) {
|
||||||
s->status[bank] |= s->rising[bank] & mask &
|
s->status[bank] |= s->rising[bank] & mask &
|
||||||
|
@@ -105,7 +105,7 @@ static inline uint32_t pxa2xx_pic_highest(PXA2xxPICState *s) {
|
|||||||
|
|
||||||
for (i = PXA2XX_PIC_SRCS - 1; i >= 0; i --) {
|
for (i = PXA2XX_PIC_SRCS - 1; i >= 0; i --) {
|
||||||
irq = s->priority[i] & 0x3f;
|
irq = s->priority[i] & 0x3f;
|
||||||
if ((s->priority[i] & (1 << 31)) && irq < PXA2XX_PIC_SRCS) {
|
if ((s->priority[i] & (1U << 31)) && irq < PXA2XX_PIC_SRCS) {
|
||||||
/* Source peripheral ID is valid. */
|
/* Source peripheral ID is valid. */
|
||||||
bit = 1 << (irq & 31);
|
bit = 1 << (irq & 31);
|
||||||
int_set = (irq >= 32);
|
int_set = (irq >= 32);
|
||||||
@@ -119,7 +119,7 @@ static inline uint32_t pxa2xx_pic_highest(PXA2xxPICState *s) {
|
|||||||
if (mask[int_set] & bit & ~s->is_fiq[int_set]) {
|
if (mask[int_set] & bit & ~s->is_fiq[int_set]) {
|
||||||
/* IRQ asserted */
|
/* IRQ asserted */
|
||||||
ichp &= 0x0000ffff;
|
ichp &= 0x0000ffff;
|
||||||
ichp |= (1 << 31) | (irq << 16);
|
ichp |= (1U << 31) | (irq << 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -358,7 +358,7 @@ static void start_data_plane_bh(void *opaque)
|
|||||||
|
|
||||||
qemu_bh_delete(s->start_bh);
|
qemu_bh_delete(s->start_bh);
|
||||||
s->start_bh = NULL;
|
s->start_bh = NULL;
|
||||||
qemu_thread_create(&s->thread, data_plane_thread,
|
qemu_thread_create(&s->thread, "data_plane", data_plane_thread,
|
||||||
s, QEMU_THREAD_JOINABLE);
|
s, QEMU_THREAD_JOINABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -643,6 +643,21 @@ static inline char acpi_get_hex(uint32_t val)
|
|||||||
#define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
|
#define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
|
||||||
#define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
|
#define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
|
||||||
|
|
||||||
|
#define ACPI_PCINOHP_OFFSET_HEX (*ssdt_pcinohp_name - *ssdt_pcinohp_start + 1)
|
||||||
|
#define ACPI_PCINOHP_OFFSET_ADR (*ssdt_pcinohp_adr - *ssdt_pcinohp_start)
|
||||||
|
#define ACPI_PCINOHP_SIZEOF (*ssdt_pcinohp_end - *ssdt_pcinohp_start)
|
||||||
|
#define ACPI_PCINOHP_AML (ssdp_pcihp_aml + *ssdt_pcinohp_start)
|
||||||
|
|
||||||
|
#define ACPI_PCIVGA_OFFSET_HEX (*ssdt_pcivga_name - *ssdt_pcivga_start + 1)
|
||||||
|
#define ACPI_PCIVGA_OFFSET_ADR (*ssdt_pcivga_adr - *ssdt_pcivga_start)
|
||||||
|
#define ACPI_PCIVGA_SIZEOF (*ssdt_pcivga_end - *ssdt_pcivga_start)
|
||||||
|
#define ACPI_PCIVGA_AML (ssdp_pcihp_aml + *ssdt_pcivga_start)
|
||||||
|
|
||||||
|
#define ACPI_PCIQXL_OFFSET_HEX (*ssdt_pciqxl_name - *ssdt_pciqxl_start + 1)
|
||||||
|
#define ACPI_PCIQXL_OFFSET_ADR (*ssdt_pciqxl_adr - *ssdt_pciqxl_start)
|
||||||
|
#define ACPI_PCIQXL_SIZEOF (*ssdt_pciqxl_end - *ssdt_pciqxl_start)
|
||||||
|
#define ACPI_PCIQXL_AML (ssdp_pcihp_aml + *ssdt_pciqxl_start)
|
||||||
|
|
||||||
#define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
|
#define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
|
||||||
#define ACPI_SSDT_HEADER_LENGTH 36
|
#define ACPI_SSDT_HEADER_LENGTH 36
|
||||||
|
|
||||||
@@ -677,6 +692,33 @@ static void patch_pcihp(int slot, uint8_t *ssdt_ptr)
|
|||||||
ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
|
ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void patch_pcinohp(int slot, uint8_t *ssdt_ptr)
|
||||||
|
{
|
||||||
|
unsigned devfn = PCI_DEVFN(slot, 0);
|
||||||
|
|
||||||
|
ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
|
||||||
|
ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX + 1] = acpi_get_hex(devfn);
|
||||||
|
ssdt_ptr[ACPI_PCINOHP_OFFSET_ADR + 2] = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void patch_pcivga(int slot, uint8_t *ssdt_ptr)
|
||||||
|
{
|
||||||
|
unsigned devfn = PCI_DEVFN(slot, 0);
|
||||||
|
|
||||||
|
ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
|
||||||
|
ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX + 1] = acpi_get_hex(devfn);
|
||||||
|
ssdt_ptr[ACPI_PCIVGA_OFFSET_ADR + 2] = slot;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void patch_pciqxl(int slot, uint8_t *ssdt_ptr)
|
||||||
|
{
|
||||||
|
unsigned devfn = PCI_DEVFN(slot, 0);
|
||||||
|
|
||||||
|
ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
|
||||||
|
ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX + 1] = acpi_get_hex(devfn);
|
||||||
|
ssdt_ptr[ACPI_PCIQXL_OFFSET_ADR + 2] = slot;
|
||||||
|
}
|
||||||
|
|
||||||
/* Assign BSEL property to all buses. In the future, this can be changed
|
/* Assign BSEL property to all buses. In the future, this can be changed
|
||||||
* to only assign to buses that support hotplug.
|
* to only assign to buses that support hotplug.
|
||||||
*/
|
*/
|
||||||
@@ -737,6 +779,10 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
|
|||||||
AcpiBuildPciBusHotplugState *parent = child->parent;
|
AcpiBuildPciBusHotplugState *parent = child->parent;
|
||||||
GArray *bus_table = build_alloc_array();
|
GArray *bus_table = build_alloc_array();
|
||||||
DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
|
DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
|
||||||
|
DECLARE_BITMAP(slot_device_present, PCI_SLOT_MAX);
|
||||||
|
DECLARE_BITMAP(slot_device_system, PCI_SLOT_MAX);
|
||||||
|
DECLARE_BITMAP(slot_device_vga, PCI_SLOT_MAX);
|
||||||
|
DECLARE_BITMAP(slot_device_qxl, PCI_SLOT_MAX);
|
||||||
uint8_t op;
|
uint8_t op;
|
||||||
int i;
|
int i;
|
||||||
QObject *bsel;
|
QObject *bsel;
|
||||||
@@ -764,40 +810,82 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
|
|||||||
build_append_byte(bus_table, 0x08); /* NameOp */
|
build_append_byte(bus_table, 0x08); /* NameOp */
|
||||||
build_append_nameseg(bus_table, "BSEL");
|
build_append_nameseg(bus_table, "BSEL");
|
||||||
build_append_int(bus_table, qint_get_int(qobject_to_qint(bsel)));
|
build_append_int(bus_table, qint_get_int(qobject_to_qint(bsel)));
|
||||||
|
|
||||||
memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
|
memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
|
||||||
|
} else {
|
||||||
|
/* No bsel - no slots are hot-pluggable */
|
||||||
|
memset(slot_hotplug_enable, 0x00, sizeof slot_hotplug_enable);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
|
memset(slot_device_present, 0x00, sizeof slot_device_present);
|
||||||
DeviceClass *dc;
|
memset(slot_device_system, 0x00, sizeof slot_device_present);
|
||||||
PCIDeviceClass *pc;
|
memset(slot_device_vga, 0x00, sizeof slot_device_vga);
|
||||||
PCIDevice *pdev = bus->devices[i];
|
memset(slot_device_qxl, 0x00, sizeof slot_device_qxl);
|
||||||
|
|
||||||
if (!pdev) {
|
for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) {
|
||||||
continue;
|
DeviceClass *dc;
|
||||||
}
|
PCIDeviceClass *pc;
|
||||||
|
PCIDevice *pdev = bus->devices[i];
|
||||||
|
int slot = PCI_SLOT(i);
|
||||||
|
|
||||||
pc = PCI_DEVICE_GET_CLASS(pdev);
|
if (!pdev) {
|
||||||
dc = DEVICE_GET_CLASS(pdev);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!dc->hotpluggable || pc->is_bridge) {
|
set_bit(slot, slot_device_present);
|
||||||
int slot = PCI_SLOT(i);
|
pc = PCI_DEVICE_GET_CLASS(pdev);
|
||||||
|
dc = DEVICE_GET_CLASS(pdev);
|
||||||
|
|
||||||
clear_bit(slot, slot_hotplug_enable);
|
if (pc->class_id == PCI_CLASS_BRIDGE_ISA) {
|
||||||
|
set_bit(slot, slot_device_system);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pc->class_id == PCI_CLASS_DISPLAY_VGA) {
|
||||||
|
set_bit(slot, slot_device_vga);
|
||||||
|
|
||||||
|
if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) {
|
||||||
|
set_bit(slot, slot_device_qxl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append Device object for each slot which supports eject */
|
if (!dc->hotpluggable || pc->is_bridge) {
|
||||||
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
clear_bit(slot, slot_hotplug_enable);
|
||||||
bool can_eject = test_bit(i, slot_hotplug_enable);
|
|
||||||
if (can_eject) {
|
|
||||||
void *pcihp = acpi_data_push(bus_table,
|
|
||||||
ACPI_PCIHP_SIZEOF);
|
|
||||||
memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
|
|
||||||
patch_pcihp(i, pcihp);
|
|
||||||
bus_hotplug_support = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append Device object for each slot */
|
||||||
|
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
||||||
|
bool can_eject = test_bit(i, slot_hotplug_enable);
|
||||||
|
bool present = test_bit(i, slot_device_present);
|
||||||
|
bool vga = test_bit(i, slot_device_vga);
|
||||||
|
bool qxl = test_bit(i, slot_device_qxl);
|
||||||
|
bool system = test_bit(i, slot_device_system);
|
||||||
|
if (can_eject) {
|
||||||
|
void *pcihp = acpi_data_push(bus_table,
|
||||||
|
ACPI_PCIHP_SIZEOF);
|
||||||
|
memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
|
||||||
|
patch_pcihp(i, pcihp);
|
||||||
|
bus_hotplug_support = true;
|
||||||
|
} else if (qxl) {
|
||||||
|
void *pcihp = acpi_data_push(bus_table,
|
||||||
|
ACPI_PCIQXL_SIZEOF);
|
||||||
|
memcpy(pcihp, ACPI_PCIQXL_AML, ACPI_PCIQXL_SIZEOF);
|
||||||
|
patch_pciqxl(i, pcihp);
|
||||||
|
} else if (vga) {
|
||||||
|
void *pcihp = acpi_data_push(bus_table,
|
||||||
|
ACPI_PCIVGA_SIZEOF);
|
||||||
|
memcpy(pcihp, ACPI_PCIVGA_AML, ACPI_PCIVGA_SIZEOF);
|
||||||
|
patch_pcivga(i, pcihp);
|
||||||
|
} else if (system) {
|
||||||
|
/* Nothing to do: system devices are in DSDT. */
|
||||||
|
} else if (present) {
|
||||||
|
void *pcihp = acpi_data_push(bus_table,
|
||||||
|
ACPI_PCINOHP_SIZEOF);
|
||||||
|
memcpy(pcihp, ACPI_PCINOHP_AML, ACPI_PCINOHP_SIZEOF);
|
||||||
|
patch_pcinohp(i, pcihp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bsel) {
|
||||||
method = build_alloc_method("DVNT", 2);
|
method = build_alloc_method("DVNT", 2);
|
||||||
|
|
||||||
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
for (i = 0; i < PCI_SLOT_MAX; i++) {
|
||||||
@@ -976,7 +1064,14 @@ build_ssdt(GArray *table_data, GArray *linker,
|
|||||||
|
|
||||||
{
|
{
|
||||||
AcpiBuildPciBusHotplugState hotplug_state;
|
AcpiBuildPciBusHotplugState hotplug_state;
|
||||||
PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
|
Object *pci_host;
|
||||||
|
PCIBus *bus = NULL;
|
||||||
|
bool ambiguous;
|
||||||
|
|
||||||
|
pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
|
||||||
|
if (!ambiguous && pci_host) {
|
||||||
|
bus = PCI_HOST_BRIDGE(pci_host)->bus;
|
||||||
|
}
|
||||||
|
|
||||||
build_pci_bus_state_init(&hotplug_state, NULL);
|
build_pci_bus_state_init(&hotplug_state, NULL);
|
||||||
|
|
||||||
|
@@ -80,6 +80,8 @@ DefinitionBlock (
|
|||||||
Name(_HID, EisaId("PNP0A03"))
|
Name(_HID, EisaId("PNP0A03"))
|
||||||
Name(_ADR, 0x00)
|
Name(_ADR, 0x00)
|
||||||
Name(_UID, 1)
|
Name(_UID, 1)
|
||||||
|
//#define PX13 S0B_
|
||||||
|
// External(PX13, DeviceObj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,34 +89,6 @@ DefinitionBlock (
|
|||||||
#include "acpi-dsdt-hpet.dsl"
|
#include "acpi-dsdt-hpet.dsl"
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************
|
|
||||||
* VGA
|
|
||||||
****************************************************************/
|
|
||||||
|
|
||||||
Scope(\_SB.PCI0) {
|
|
||||||
Device(VGA) {
|
|
||||||
Name(_ADR, 0x00020000)
|
|
||||||
OperationRegion(PCIC, PCI_Config, Zero, 0x4)
|
|
||||||
Field(PCIC, DWordAcc, NoLock, Preserve) {
|
|
||||||
VEND, 32
|
|
||||||
}
|
|
||||||
Method(_S1D, 0, NotSerialized) {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
Method(_S2D, 0, NotSerialized) {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
Method(_S3D, 0, NotSerialized) {
|
|
||||||
If (LEqual(VEND, 0x1001b36)) {
|
|
||||||
Return (0x03) // QXL
|
|
||||||
} Else {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* PIIX4 PM
|
* PIIX4 PM
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
@@ -132,6 +106,9 @@ DefinitionBlock (
|
|||||||
****************************************************************/
|
****************************************************************/
|
||||||
|
|
||||||
Scope(\_SB.PCI0) {
|
Scope(\_SB.PCI0) {
|
||||||
|
|
||||||
|
External(ISA, DeviceObj)
|
||||||
|
|
||||||
Device(ISA) {
|
Device(ISA) {
|
||||||
Name(_ADR, 0x00010000)
|
Name(_ADR, 0x00010000)
|
||||||
|
|
||||||
|
@@ -3,12 +3,12 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x53,
|
0x53,
|
||||||
0x44,
|
0x44,
|
||||||
0x54,
|
0x54,
|
||||||
0x87,
|
0x85,
|
||||||
0x11,
|
0x11,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x1,
|
0x1,
|
||||||
0xb8,
|
0x8b,
|
||||||
0x42,
|
0x42,
|
||||||
0x58,
|
0x58,
|
||||||
0x50,
|
0x50,
|
||||||
@@ -146,7 +146,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x1,
|
0x1,
|
||||||
0x10,
|
0x10,
|
||||||
0x4e,
|
0x4e,
|
||||||
0x15,
|
0x18,
|
||||||
0x2e,
|
0x2e,
|
||||||
0x5f,
|
0x5f,
|
||||||
0x53,
|
0x53,
|
||||||
@@ -163,9 +163,9 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x53,
|
0x53,
|
||||||
0x11,
|
0x11,
|
||||||
0x42,
|
0x42,
|
||||||
0x7,
|
|
||||||
0xa,
|
0xa,
|
||||||
0x6e,
|
0xa,
|
||||||
|
0x9e,
|
||||||
0x88,
|
0x88,
|
||||||
0xd,
|
0xd,
|
||||||
0x0,
|
0x0,
|
||||||
@@ -217,11 +217,59 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x0,
|
0x0,
|
||||||
0xd,
|
0xd,
|
||||||
0xff,
|
0xff,
|
||||||
|
0xad,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xa1,
|
||||||
|
0x88,
|
||||||
|
0xd,
|
||||||
|
0x0,
|
||||||
|
0x1,
|
||||||
|
0xc,
|
||||||
|
0x3,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xf,
|
||||||
|
0xae,
|
||||||
|
0xff,
|
||||||
|
0xae,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xf1,
|
||||||
|
0x0,
|
||||||
|
0x88,
|
||||||
|
0xd,
|
||||||
|
0x0,
|
||||||
|
0x1,
|
||||||
|
0xc,
|
||||||
|
0x3,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0x20,
|
||||||
|
0xaf,
|
||||||
|
0xdf,
|
||||||
|
0xaf,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xc0,
|
||||||
|
0x0,
|
||||||
|
0x88,
|
||||||
|
0xd,
|
||||||
|
0x0,
|
||||||
|
0x1,
|
||||||
|
0xc,
|
||||||
|
0x3,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xe4,
|
||||||
|
0xaf,
|
||||||
|
0xff,
|
||||||
0xff,
|
0xff,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x1c,
|
||||||
0xf3,
|
0x50,
|
||||||
0x87,
|
0x87,
|
||||||
0x17,
|
0x17,
|
||||||
0x0,
|
0x0,
|
||||||
@@ -347,7 +395,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x45,
|
0x45,
|
||||||
0x53,
|
0x53,
|
||||||
0xa,
|
0xa,
|
||||||
0x5c,
|
0x8c,
|
||||||
0x50,
|
0x50,
|
||||||
0x53,
|
0x53,
|
||||||
0x33,
|
0x33,
|
||||||
@@ -358,7 +406,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x45,
|
0x45,
|
||||||
0x53,
|
0x53,
|
||||||
0xa,
|
0xa,
|
||||||
0x60,
|
0x90,
|
||||||
0x50,
|
0x50,
|
||||||
0x45,
|
0x45,
|
||||||
0x33,
|
0x33,
|
||||||
@@ -369,7 +417,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x45,
|
0x45,
|
||||||
0x53,
|
0x53,
|
||||||
0xa,
|
0xa,
|
||||||
0x68,
|
0x98,
|
||||||
0x50,
|
0x50,
|
||||||
0x4c,
|
0x4c,
|
||||||
0x33,
|
0x33,
|
||||||
@@ -638,103 +686,6 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x79,
|
0x79,
|
||||||
0x0,
|
0x0,
|
||||||
0x10,
|
0x10,
|
||||||
0x40,
|
|
||||||
0x6,
|
|
||||||
0x2e,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x42,
|
|
||||||
0x5f,
|
|
||||||
0x50,
|
|
||||||
0x43,
|
|
||||||
0x49,
|
|
||||||
0x30,
|
|
||||||
0x5b,
|
|
||||||
0x82,
|
|
||||||
0x43,
|
|
||||||
0x5,
|
|
||||||
0x56,
|
|
||||||
0x47,
|
|
||||||
0x41,
|
|
||||||
0x5f,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x41,
|
|
||||||
0x44,
|
|
||||||
0x52,
|
|
||||||
0xc,
|
|
||||||
0x0,
|
|
||||||
0x0,
|
|
||||||
0x2,
|
|
||||||
0x0,
|
|
||||||
0x5b,
|
|
||||||
0x80,
|
|
||||||
0x50,
|
|
||||||
0x43,
|
|
||||||
0x49,
|
|
||||||
0x43,
|
|
||||||
0x2,
|
|
||||||
0x0,
|
|
||||||
0xa,
|
|
||||||
0x4,
|
|
||||||
0x5b,
|
|
||||||
0x81,
|
|
||||||
0xb,
|
|
||||||
0x50,
|
|
||||||
0x43,
|
|
||||||
0x49,
|
|
||||||
0x43,
|
|
||||||
0x3,
|
|
||||||
0x56,
|
|
||||||
0x45,
|
|
||||||
0x4e,
|
|
||||||
0x44,
|
|
||||||
0x20,
|
|
||||||
0x14,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x31,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x14,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x32,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x14,
|
|
||||||
0x19,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x33,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa0,
|
|
||||||
0xe,
|
|
||||||
0x93,
|
|
||||||
0x56,
|
|
||||||
0x45,
|
|
||||||
0x4e,
|
|
||||||
0x44,
|
|
||||||
0xc,
|
|
||||||
0x36,
|
|
||||||
0x1b,
|
|
||||||
0x0,
|
|
||||||
0x1,
|
|
||||||
0xa4,
|
|
||||||
0xa,
|
|
||||||
0x3,
|
|
||||||
0xa1,
|
|
||||||
0x3,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x10,
|
|
||||||
0x25,
|
0x25,
|
||||||
0x2e,
|
0x2e,
|
||||||
0x5f,
|
0x5f,
|
||||||
@@ -860,7 +811,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x4e,
|
0x4e,
|
||||||
0x1,
|
0x1,
|
||||||
0x10,
|
0x10,
|
||||||
0x4b,
|
0x4a,
|
||||||
0x1e,
|
0x1e,
|
||||||
0x2f,
|
0x2f,
|
||||||
0x3,
|
0x3,
|
||||||
@@ -878,7 +829,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x5f,
|
0x5f,
|
||||||
0x5b,
|
0x5b,
|
||||||
0x82,
|
0x82,
|
||||||
0x2d,
|
0x2c,
|
||||||
0x53,
|
0x53,
|
||||||
0x4d,
|
0x4d,
|
||||||
0x43,
|
0x43,
|
||||||
@@ -898,9 +849,8 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x53,
|
0x53,
|
||||||
0x54,
|
0x54,
|
||||||
0x41,
|
0x41,
|
||||||
0xb,
|
0xa,
|
||||||
0x0,
|
0xf0,
|
||||||
0xff,
|
|
||||||
0x8,
|
0x8,
|
||||||
0x5f,
|
0x5f,
|
||||||
0x43,
|
0x43,
|
||||||
@@ -4061,7 +4011,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x1,
|
0x1,
|
||||||
0x10,
|
0x10,
|
||||||
0x47,
|
0x47,
|
||||||
0xe,
|
0x11,
|
||||||
0x5f,
|
0x5f,
|
||||||
0x53,
|
0x53,
|
||||||
0x42,
|
0x42,
|
||||||
@@ -4291,6 +4241,54 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x3,
|
0x3,
|
||||||
0x75,
|
0x75,
|
||||||
0x60,
|
0x60,
|
||||||
|
0x5b,
|
||||||
|
0x82,
|
||||||
|
0x2e,
|
||||||
|
0x50,
|
||||||
|
0x52,
|
||||||
|
0x45,
|
||||||
|
0x53,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x48,
|
||||||
|
0x49,
|
||||||
|
0x44,
|
||||||
|
0xd,
|
||||||
|
0x41,
|
||||||
|
0x43,
|
||||||
|
0x50,
|
||||||
|
0x49,
|
||||||
|
0x30,
|
||||||
|
0x30,
|
||||||
|
0x30,
|
||||||
|
0x34,
|
||||||
|
0x0,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x43,
|
||||||
|
0x52,
|
||||||
|
0x53,
|
||||||
|
0x11,
|
||||||
|
0xd,
|
||||||
|
0xa,
|
||||||
|
0xa,
|
||||||
|
0x47,
|
||||||
|
0x1,
|
||||||
|
0x0,
|
||||||
|
0xaf,
|
||||||
|
0x0,
|
||||||
|
0xaf,
|
||||||
|
0x0,
|
||||||
|
0x20,
|
||||||
|
0x79,
|
||||||
|
0x0,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x54,
|
||||||
|
0x41,
|
||||||
|
0xa,
|
||||||
|
0xb,
|
||||||
0x10,
|
0x10,
|
||||||
0x42,
|
0x42,
|
||||||
0xc,
|
0xc,
|
||||||
@@ -4488,5 +4486,5 @@ static unsigned char AcpiDsdtAmlCode[] = {
|
|||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
static unsigned short piix_dsdt_applesmc_sta[] = {
|
static unsigned short piix_dsdt_applesmc_sta[] = {
|
||||||
0x384
|
0x353
|
||||||
};
|
};
|
||||||
|
@@ -72,6 +72,8 @@ DefinitionBlock (
|
|||||||
Name(_ADR, 0x00)
|
Name(_ADR, 0x00)
|
||||||
Name(_UID, 1)
|
Name(_UID, 1)
|
||||||
|
|
||||||
|
External(ISA, DeviceObj)
|
||||||
|
|
||||||
// _OSC: based on sample of ACPI3.0b spec
|
// _OSC: based on sample of ACPI3.0b spec
|
||||||
Name(SUPP, 0) // PCI _OSC Support Field value
|
Name(SUPP, 0) // PCI _OSC Support Field value
|
||||||
Name(CTRL, 0) // PCI _OSC Control Field value
|
Name(CTRL, 0) // PCI _OSC Control Field value
|
||||||
@@ -133,26 +135,6 @@ DefinitionBlock (
|
|||||||
#include "acpi-dsdt-hpet.dsl"
|
#include "acpi-dsdt-hpet.dsl"
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************
|
|
||||||
* VGA
|
|
||||||
****************************************************************/
|
|
||||||
|
|
||||||
Scope(\_SB.PCI0) {
|
|
||||||
Device(VGA) {
|
|
||||||
Name(_ADR, 0x00010000)
|
|
||||||
Method(_S1D, 0, NotSerialized) {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
Method(_S2D, 0, NotSerialized) {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
Method(_S3D, 0, NotSerialized) {
|
|
||||||
Return (0x00)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* LPC ISA bridge
|
* LPC ISA bridge
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
@@ -160,8 +142,7 @@ DefinitionBlock (
|
|||||||
Scope(\_SB.PCI0) {
|
Scope(\_SB.PCI0) {
|
||||||
/* PCI D31:f0 LPC ISA bridge */
|
/* PCI D31:f0 LPC ISA bridge */
|
||||||
Device(ISA) {
|
Device(ISA) {
|
||||||
/* PCI D31:f0 */
|
Name (_ADR, 0x001F0000) // _ADR: Address
|
||||||
Name(_ADR, 0x001f0000)
|
|
||||||
|
|
||||||
/* ICH9 PCI to ISA irq remapping */
|
/* ICH9 PCI to ISA irq remapping */
|
||||||
OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
|
OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
|
||||||
|
@@ -3,12 +3,12 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x53,
|
0x53,
|
||||||
0x44,
|
0x44,
|
||||||
0x54,
|
0x54,
|
||||||
0xdf,
|
0xd7,
|
||||||
0x1c,
|
0x1c,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x1,
|
0x1,
|
||||||
0xff,
|
0x3e,
|
||||||
0x42,
|
0x42,
|
||||||
0x58,
|
0x58,
|
||||||
0x50,
|
0x50,
|
||||||
@@ -415,11 +415,11 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0xf7,
|
0xd7,
|
||||||
0xc,
|
0xc,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0xf8,
|
0xd8,
|
||||||
0xc,
|
0xc,
|
||||||
0x88,
|
0x88,
|
||||||
0xd,
|
0xd,
|
||||||
@@ -853,61 +853,6 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x79,
|
0x79,
|
||||||
0x0,
|
0x0,
|
||||||
0x10,
|
0x10,
|
||||||
0x36,
|
|
||||||
0x2e,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x42,
|
|
||||||
0x5f,
|
|
||||||
0x50,
|
|
||||||
0x43,
|
|
||||||
0x49,
|
|
||||||
0x30,
|
|
||||||
0x5b,
|
|
||||||
0x82,
|
|
||||||
0x2a,
|
|
||||||
0x56,
|
|
||||||
0x47,
|
|
||||||
0x41,
|
|
||||||
0x5f,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x41,
|
|
||||||
0x44,
|
|
||||||
0x52,
|
|
||||||
0xc,
|
|
||||||
0x0,
|
|
||||||
0x0,
|
|
||||||
0x1,
|
|
||||||
0x0,
|
|
||||||
0x14,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x31,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x14,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x32,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x14,
|
|
||||||
0x8,
|
|
||||||
0x5f,
|
|
||||||
0x53,
|
|
||||||
0x33,
|
|
||||||
0x44,
|
|
||||||
0x0,
|
|
||||||
0xa4,
|
|
||||||
0x0,
|
|
||||||
0x10,
|
|
||||||
0x4c,
|
0x4c,
|
||||||
0x7,
|
0x7,
|
||||||
0x2e,
|
0x2e,
|
||||||
@@ -1033,7 +978,7 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x4e,
|
0x4e,
|
||||||
0x1,
|
0x1,
|
||||||
0x10,
|
0x10,
|
||||||
0x4b,
|
0x4a,
|
||||||
0x1e,
|
0x1e,
|
||||||
0x2f,
|
0x2f,
|
||||||
0x3,
|
0x3,
|
||||||
@@ -1051,7 +996,7 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x5f,
|
0x5f,
|
||||||
0x5b,
|
0x5b,
|
||||||
0x82,
|
0x82,
|
||||||
0x2d,
|
0x2c,
|
||||||
0x53,
|
0x53,
|
||||||
0x4d,
|
0x4d,
|
||||||
0x43,
|
0x43,
|
||||||
@@ -1071,9 +1016,8 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x53,
|
0x53,
|
||||||
0x54,
|
0x54,
|
||||||
0x41,
|
0x41,
|
||||||
0xb,
|
0xa,
|
||||||
0x0,
|
0xf0,
|
||||||
0xff,
|
|
||||||
0x8,
|
0x8,
|
||||||
0x5f,
|
0x5f,
|
||||||
0x43,
|
0x43,
|
||||||
@@ -7016,7 +6960,7 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x1,
|
0x1,
|
||||||
0x10,
|
0x10,
|
||||||
0x47,
|
0x47,
|
||||||
0xe,
|
0x11,
|
||||||
0x5f,
|
0x5f,
|
||||||
0x53,
|
0x53,
|
||||||
0x42,
|
0x42,
|
||||||
@@ -7121,8 +7065,8 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x54,
|
0x54,
|
||||||
0x1,
|
0x1,
|
||||||
0xb,
|
0xb,
|
||||||
0x0,
|
0xd8,
|
||||||
0xaf,
|
0xc,
|
||||||
0xa,
|
0xa,
|
||||||
0x20,
|
0x20,
|
||||||
0x5b,
|
0x5b,
|
||||||
@@ -7246,6 +7190,54 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x3,
|
0x3,
|
||||||
0x75,
|
0x75,
|
||||||
0x60,
|
0x60,
|
||||||
|
0x5b,
|
||||||
|
0x82,
|
||||||
|
0x2e,
|
||||||
|
0x50,
|
||||||
|
0x52,
|
||||||
|
0x45,
|
||||||
|
0x53,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x48,
|
||||||
|
0x49,
|
||||||
|
0x44,
|
||||||
|
0xd,
|
||||||
|
0x41,
|
||||||
|
0x43,
|
||||||
|
0x50,
|
||||||
|
0x49,
|
||||||
|
0x30,
|
||||||
|
0x30,
|
||||||
|
0x30,
|
||||||
|
0x34,
|
||||||
|
0x0,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x43,
|
||||||
|
0x52,
|
||||||
|
0x53,
|
||||||
|
0x11,
|
||||||
|
0xd,
|
||||||
|
0xa,
|
||||||
|
0xa,
|
||||||
|
0x47,
|
||||||
|
0x1,
|
||||||
|
0xd8,
|
||||||
|
0xc,
|
||||||
|
0xd8,
|
||||||
|
0xc,
|
||||||
|
0x0,
|
||||||
|
0x20,
|
||||||
|
0x79,
|
||||||
|
0x0,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x54,
|
||||||
|
0x41,
|
||||||
|
0xa,
|
||||||
|
0xb,
|
||||||
0x10,
|
0x10,
|
||||||
0x4f,
|
0x4f,
|
||||||
0x8,
|
0x8,
|
||||||
@@ -7392,5 +7384,5 @@ static unsigned char Q35AcpiDsdtAmlCode[] = {
|
|||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
static unsigned short q35_dsdt_applesmc_sta[] = {
|
static unsigned short q35_dsdt_applesmc_sta[] = {
|
||||||
0x431
|
0x3fa
|
||||||
};
|
};
|
||||||
|
@@ -46,5 +46,55 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ACPI_EXTRACT_DEVICE_START ssdt_pcinohp_start
|
||||||
|
ACPI_EXTRACT_DEVICE_END ssdt_pcinohp_end
|
||||||
|
ACPI_EXTRACT_DEVICE_STRING ssdt_pcinohp_name
|
||||||
|
|
||||||
|
// Extract the offsets of the device name, address dword and the slot
|
||||||
|
// name byte - we fill them in for each device.
|
||||||
|
Device(SBB) {
|
||||||
|
ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcinohp_adr
|
||||||
|
Name(_ADR, 0xAA0000)
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI_EXTRACT_DEVICE_START ssdt_pcivga_start
|
||||||
|
ACPI_EXTRACT_DEVICE_END ssdt_pcivga_end
|
||||||
|
ACPI_EXTRACT_DEVICE_STRING ssdt_pcivga_name
|
||||||
|
|
||||||
|
// Extract the offsets of the device name, address dword and the slot
|
||||||
|
// name byte - we fill them in for each device.
|
||||||
|
Device(SCC) {
|
||||||
|
ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcivga_adr
|
||||||
|
Name(_ADR, 0xAA0000)
|
||||||
|
Method(_S1D, 0, NotSerialized) {
|
||||||
|
Return (0x00)
|
||||||
|
}
|
||||||
|
Method(_S2D, 0, NotSerialized) {
|
||||||
|
Return (0x00)
|
||||||
|
}
|
||||||
|
Method(_S3D, 0, NotSerialized) {
|
||||||
|
Return (0x00)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI_EXTRACT_DEVICE_START ssdt_pciqxl_start
|
||||||
|
ACPI_EXTRACT_DEVICE_END ssdt_pciqxl_end
|
||||||
|
ACPI_EXTRACT_DEVICE_STRING ssdt_pciqxl_name
|
||||||
|
|
||||||
|
// Extract the offsets of the device name, address dword and the slot
|
||||||
|
// name byte - we fill them in for each device.
|
||||||
|
Device(SDD) {
|
||||||
|
ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pciqxl_adr
|
||||||
|
Name(_ADR, 0xAA0000)
|
||||||
|
Method(_S1D, 0, NotSerialized) {
|
||||||
|
Return (0x00)
|
||||||
|
}
|
||||||
|
Method(_S2D, 0, NotSerialized) {
|
||||||
|
Return (0x00)
|
||||||
|
}
|
||||||
|
Method(_S3D, 0, NotSerialized) {
|
||||||
|
Return (0x03) // QXL
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,23 +1,38 @@
|
|||||||
static unsigned char ssdt_pcihp_name[] = {
|
static unsigned char ssdt_pcihp_name[] = {
|
||||||
0x33
|
0x34
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcivga_end[] = {
|
||||||
|
0x99
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcivga_name[] = {
|
||||||
|
0x70
|
||||||
};
|
};
|
||||||
static unsigned char ssdt_pcihp_adr[] = {
|
static unsigned char ssdt_pcihp_adr[] = {
|
||||||
0x44
|
0x45
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcinohp_end[] = {
|
||||||
|
0x6d
|
||||||
};
|
};
|
||||||
static unsigned char ssdt_pcihp_end[] = {
|
static unsigned char ssdt_pcihp_end[] = {
|
||||||
0x5b
|
0x5c
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pciqxl_start[] = {
|
||||||
|
0x99
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcinohp_name[] = {
|
||||||
|
0x5f
|
||||||
};
|
};
|
||||||
static unsigned char ssdp_pcihp_aml[] = {
|
static unsigned char ssdp_pcihp_aml[] = {
|
||||||
0x53,
|
0x53,
|
||||||
0x53,
|
0x53,
|
||||||
0x44,
|
0x44,
|
||||||
0x54,
|
0x54,
|
||||||
0x5b,
|
0xc6,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x0,
|
0x0,
|
||||||
0x1,
|
0x1,
|
||||||
0xe8,
|
0x6b,
|
||||||
0x42,
|
0x42,
|
||||||
0x58,
|
0x58,
|
||||||
0x50,
|
0x50,
|
||||||
@@ -45,7 +60,8 @@ static unsigned char ssdp_pcihp_aml[] = {
|
|||||||
0x13,
|
0x13,
|
||||||
0x20,
|
0x20,
|
||||||
0x10,
|
0x10,
|
||||||
0x36,
|
0x41,
|
||||||
|
0xa,
|
||||||
0x5c,
|
0x5c,
|
||||||
0x2e,
|
0x2e,
|
||||||
0x5f,
|
0x5f,
|
||||||
@@ -98,11 +114,138 @@ static unsigned char ssdp_pcihp_aml[] = {
|
|||||||
0x5f,
|
0x5f,
|
||||||
0x53,
|
0x53,
|
||||||
0x55,
|
0x55,
|
||||||
0x4e
|
0x4e,
|
||||||
|
0x5b,
|
||||||
|
0x82,
|
||||||
|
0xf,
|
||||||
|
0x53,
|
||||||
|
0x42,
|
||||||
|
0x42,
|
||||||
|
0x5f,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x41,
|
||||||
|
0x44,
|
||||||
|
0x52,
|
||||||
|
0xc,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xaa,
|
||||||
|
0x0,
|
||||||
|
0x5b,
|
||||||
|
0x82,
|
||||||
|
0x2a,
|
||||||
|
0x53,
|
||||||
|
0x43,
|
||||||
|
0x43,
|
||||||
|
0x5f,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x41,
|
||||||
|
0x44,
|
||||||
|
0x52,
|
||||||
|
0xc,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xaa,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x31,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x32,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x33,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0x0,
|
||||||
|
0x5b,
|
||||||
|
0x82,
|
||||||
|
0x2b,
|
||||||
|
0x53,
|
||||||
|
0x44,
|
||||||
|
0x44,
|
||||||
|
0x5f,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x41,
|
||||||
|
0x44,
|
||||||
|
0x52,
|
||||||
|
0xc,
|
||||||
|
0x0,
|
||||||
|
0x0,
|
||||||
|
0xaa,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x31,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x8,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x32,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0x0,
|
||||||
|
0x14,
|
||||||
|
0x9,
|
||||||
|
0x5f,
|
||||||
|
0x53,
|
||||||
|
0x33,
|
||||||
|
0x44,
|
||||||
|
0x0,
|
||||||
|
0xa4,
|
||||||
|
0xa,
|
||||||
|
0x3
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pciqxl_adr[] = {
|
||||||
|
0xa6
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcinohp_adr[] = {
|
||||||
|
0x69
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcivga_adr[] = {
|
||||||
|
0x7a
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pciqxl_name[] = {
|
||||||
|
0x9c
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcivga_start[] = {
|
||||||
|
0x6d
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pciqxl_end[] = {
|
||||||
|
0xc6
|
||||||
};
|
};
|
||||||
static unsigned char ssdt_pcihp_start[] = {
|
static unsigned char ssdt_pcihp_start[] = {
|
||||||
0x30
|
0x31
|
||||||
};
|
};
|
||||||
static unsigned char ssdt_pcihp_id[] = {
|
static unsigned char ssdt_pcihp_id[] = {
|
||||||
0x3d
|
0x3e
|
||||||
|
};
|
||||||
|
static unsigned char ssdt_pcinohp_start[] = {
|
||||||
|
0x5c
|
||||||
};
|
};
|
||||||
|
@@ -281,7 +281,7 @@ static void kbd_write_command(void *opaque, hwaddr addr,
|
|||||||
kbd_update_irq(s);
|
kbd_update_irq(s);
|
||||||
break;
|
break;
|
||||||
case KBD_CCMD_READ_INPORT:
|
case KBD_CCMD_READ_INPORT:
|
||||||
kbd_queue(s, 0x00, 0);
|
kbd_queue(s, 0x80, 0);
|
||||||
break;
|
break;
|
||||||
case KBD_CCMD_READ_OUTPORT:
|
case KBD_CCMD_READ_OUTPORT:
|
||||||
kbd_queue(s, s->outport, 0);
|
kbd_queue(s, s->outport, 0);
|
||||||
|
@@ -93,9 +93,6 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
|
|||||||
uint32_t mask = 1 << vector;
|
uint32_t mask = 1 << vector;
|
||||||
uint64_t entry = s->ioredtbl[vector];
|
uint64_t entry = s->ioredtbl[vector];
|
||||||
|
|
||||||
if (entry & (1 << IOAPIC_LVT_POLARITY_SHIFT)) {
|
|
||||||
level = !level;
|
|
||||||
}
|
|
||||||
if (((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) ==
|
if (((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) ==
|
||||||
IOAPIC_TRIGGER_LEVEL) {
|
IOAPIC_TRIGGER_LEVEL) {
|
||||||
/* level triggered */
|
/* level triggered */
|
||||||
|
@@ -397,12 +397,15 @@ static int peer_detach(VirtIONet *n, int index)
|
|||||||
static void virtio_net_set_queues(VirtIONet *n)
|
static void virtio_net_set_queues(VirtIONet *n)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int r;
|
||||||
|
|
||||||
for (i = 0; i < n->max_queues; i++) {
|
for (i = 0; i < n->max_queues; i++) {
|
||||||
if (i < n->curr_queues) {
|
if (i < n->curr_queues) {
|
||||||
assert(!peer_attach(n, i));
|
r = peer_attach(n, i);
|
||||||
|
assert(!r);
|
||||||
} else {
|
} else {
|
||||||
assert(!peer_detach(n, i));
|
r = peer_detach(n, i);
|
||||||
|
assert(!r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -68,7 +68,7 @@ void init_pam(DeviceState *dev, MemoryRegion *ram_memory,
|
|||||||
/* XXX: should distinguish read/write cases */
|
/* XXX: should distinguish read/write cases */
|
||||||
memory_region_init_alias(&mem->alias[0], OBJECT(dev), "pam-pci", pci_address_space,
|
memory_region_init_alias(&mem->alias[0], OBJECT(dev), "pam-pci", pci_address_space,
|
||||||
start, size);
|
start, size);
|
||||||
memory_region_init_alias(&mem->alias[2], OBJECT(dev), "pam-pci", pci_address_space,
|
memory_region_init_alias(&mem->alias[2], OBJECT(dev), "pam-pci", ram_memory,
|
||||||
start, size);
|
start, size);
|
||||||
|
|
||||||
for (i = 0; i < 4; ++i) {
|
for (i = 0; i < 4; ++i) {
|
||||||
|
@@ -221,29 +221,23 @@ static void pcie_cap_slot_hotplug_common(PCIDevice *hotplug_dev,
|
|||||||
DeviceState *dev,
|
DeviceState *dev,
|
||||||
uint8_t **exp_cap, Error **errp)
|
uint8_t **exp_cap, Error **errp)
|
||||||
{
|
{
|
||||||
PCIDevice *pci_dev = PCI_DEVICE(dev);
|
|
||||||
*exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
|
*exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
|
||||||
uint16_t sltsta = pci_get_word(*exp_cap + PCI_EXP_SLTSTA);
|
uint16_t sltsta = pci_get_word(*exp_cap + PCI_EXP_SLTSTA);
|
||||||
|
|
||||||
PCIE_DEV_PRINTF(pci_dev, "hotplug state: %d\n", state);
|
PCIE_DEV_PRINTF(PCI_DEVICE(dev), "hotplug state: %d\n", state);
|
||||||
if (sltsta & PCI_EXP_SLTSTA_EIS) {
|
if (sltsta & PCI_EXP_SLTSTA_EIS) {
|
||||||
/* the slot is electromechanically locked.
|
/* the slot is electromechanically locked.
|
||||||
* This error is propagated up to qdev and then to HMP/QMP.
|
* This error is propagated up to qdev and then to HMP/QMP.
|
||||||
*/
|
*/
|
||||||
error_setg_errno(errp, -EBUSY, "slot is electromechanically locked");
|
error_setg_errno(errp, -EBUSY, "slot is electromechanically locked");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: multifunction hot-plug.
|
|
||||||
* Right now, only a device of function = 0 is allowed to be
|
|
||||||
* hot plugged/unplugged.
|
|
||||||
*/
|
|
||||||
assert(PCI_FUNC(pci_dev->devfn) == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
uint8_t *exp_cap;
|
uint8_t *exp_cap;
|
||||||
|
PCIDevice *pci_dev = PCI_DEVICE(dev);
|
||||||
|
|
||||||
pcie_cap_slot_hotplug_common(PCI_DEVICE(hotplug_dev), dev, &exp_cap, errp);
|
pcie_cap_slot_hotplug_common(PCI_DEVICE(hotplug_dev), dev, &exp_cap, errp);
|
||||||
|
|
||||||
@@ -256,6 +250,12 @@ void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: multifunction hot-plug.
|
||||||
|
* Right now, only a device of function = 0 is allowed to be
|
||||||
|
* hot plugged/unplugged.
|
||||||
|
*/
|
||||||
|
assert(PCI_FUNC(pci_dev->devfn) == 0);
|
||||||
|
|
||||||
pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA,
|
pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA,
|
||||||
PCI_EXP_SLTSTA_PDS);
|
PCI_EXP_SLTSTA_PDS);
|
||||||
pcie_cap_slot_event(PCI_DEVICE(hotplug_dev), PCI_EXP_HP_EV_PDC);
|
pcie_cap_slot_event(PCI_DEVICE(hotplug_dev), PCI_EXP_HP_EV_PDC);
|
||||||
|
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
/* config register */
|
/* config register */
|
||||||
#define R_CONFIG (0x00 / 4)
|
#define R_CONFIG (0x00 / 4)
|
||||||
#define IFMODE (1 << 31)
|
#define IFMODE (1U << 31)
|
||||||
#define ENDIAN (1 << 26)
|
#define ENDIAN (1 << 26)
|
||||||
#define MODEFAIL_GEN_EN (1 << 17)
|
#define MODEFAIL_GEN_EN (1 << 17)
|
||||||
#define MAN_START_COM (1 << 16)
|
#define MAN_START_COM (1 << 16)
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
|
|
||||||
#define R_LQSPI_CFG (0xa0 / 4)
|
#define R_LQSPI_CFG (0xa0 / 4)
|
||||||
#define R_LQSPI_CFG_RESET 0x03A002EB
|
#define R_LQSPI_CFG_RESET 0x03A002EB
|
||||||
#define LQSPI_CFG_LQ_MODE (1 << 31)
|
#define LQSPI_CFG_LQ_MODE (1U << 31)
|
||||||
#define LQSPI_CFG_TWO_MEM (1 << 30)
|
#define LQSPI_CFG_TWO_MEM (1 << 30)
|
||||||
#define LQSPI_CFG_SEP_BUS (1 << 30)
|
#define LQSPI_CFG_SEP_BUS (1 << 30)
|
||||||
#define LQSPI_CFG_U_PAGE (1 << 28)
|
#define LQSPI_CFG_U_PAGE (1 << 28)
|
||||||
|
@@ -546,10 +546,10 @@ static int emulated_initfn(CCIDCardState *base)
|
|||||||
printf("%s: failed to initialize vcard\n", EMULATED_DEV_NAME);
|
printf("%s: failed to initialize vcard\n", EMULATED_DEV_NAME);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
qemu_thread_create(&card->event_thread_id, event_thread, card,
|
qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread,
|
||||||
QEMU_THREAD_JOINABLE);
|
card, QEMU_THREAD_JOINABLE);
|
||||||
qemu_thread_create(&card->apdu_thread_id, handle_apdu_thread, card,
|
qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread,
|
||||||
QEMU_THREAD_JOINABLE);
|
card, QEMU_THREAD_JOINABLE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -59,6 +59,7 @@ typedef uint64_t target_ulong;
|
|||||||
#define EXCP_HLT 0x10001 /* hlt instruction reached */
|
#define EXCP_HLT 0x10001 /* hlt instruction reached */
|
||||||
#define EXCP_DEBUG 0x10002 /* cpu stopped after a breakpoint or singlestep */
|
#define EXCP_DEBUG 0x10002 /* cpu stopped after a breakpoint or singlestep */
|
||||||
#define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */
|
#define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */
|
||||||
|
#define EXCP_YIELD 0x10004 /* cpu wants to yield timeslice to another */
|
||||||
|
|
||||||
#define TB_JMP_CACHE_BITS 12
|
#define TB_JMP_CACHE_BITS 12
|
||||||
#define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS)
|
#define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS)
|
||||||
|
@@ -836,13 +836,13 @@ void memory_region_set_alias_offset(MemoryRegion *mr,
|
|||||||
hwaddr offset);
|
hwaddr offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* memory_region_present: translate an address/size relative to a
|
* memory_region_present: checks if an address relative to a @parent
|
||||||
* MemoryRegion into a #MemoryRegionSection.
|
* translates into #MemoryRegion within @parent
|
||||||
*
|
*
|
||||||
* Answer whether a #MemoryRegion within @parent covers the address
|
* Answer whether a #MemoryRegion within @parent covers the address
|
||||||
* @addr.
|
* @addr.
|
||||||
*
|
*
|
||||||
* @parent: a MemoryRegion within which @addr is a relative address
|
* @parent: a #MemoryRegion within which @addr is a relative address
|
||||||
* @addr: the area within @parent to be searched
|
* @addr: the area within @parent to be searched
|
||||||
*/
|
*/
|
||||||
bool memory_region_present(MemoryRegion *parent, hwaddr addr);
|
bool memory_region_present(MemoryRegion *parent, hwaddr addr);
|
||||||
|
@@ -52,12 +52,13 @@ void qemu_event_reset(QemuEvent *ev);
|
|||||||
void qemu_event_wait(QemuEvent *ev);
|
void qemu_event_wait(QemuEvent *ev);
|
||||||
void qemu_event_destroy(QemuEvent *ev);
|
void qemu_event_destroy(QemuEvent *ev);
|
||||||
|
|
||||||
void qemu_thread_create(QemuThread *thread,
|
void qemu_thread_create(QemuThread *thread, const char *name,
|
||||||
void *(*start_routine)(void *),
|
void *(*start_routine)(void *),
|
||||||
void *arg, int mode);
|
void *arg, int mode);
|
||||||
void *qemu_thread_join(QemuThread *thread);
|
void *qemu_thread_join(QemuThread *thread);
|
||||||
void qemu_thread_get_self(QemuThread *thread);
|
void qemu_thread_get_self(QemuThread *thread);
|
||||||
bool qemu_thread_is_self(QemuThread *thread);
|
bool qemu_thread_is_self(QemuThread *thread);
|
||||||
void qemu_thread_exit(void *retval);
|
void qemu_thread_exit(void *retval);
|
||||||
|
void qemu_thread_naming(bool enable);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1423,11 +1423,10 @@ int kvm_init(QEMUMachine *machine)
|
|||||||
nc->name, nc->num, soft_vcpus_limit);
|
nc->name, nc->num, soft_vcpus_limit);
|
||||||
|
|
||||||
if (nc->num > hard_vcpus_limit) {
|
if (nc->num > hard_vcpus_limit) {
|
||||||
ret = -EINVAL;
|
|
||||||
fprintf(stderr, "Number of %s cpus requested (%d) exceeds "
|
fprintf(stderr, "Number of %s cpus requested (%d) exceeds "
|
||||||
"the maximum cpus supported by KVM (%d)\n",
|
"the maximum cpus supported by KVM (%d)\n",
|
||||||
nc->name, nc->num, hard_vcpus_limit);
|
nc->name, nc->num, hard_vcpus_limit);
|
||||||
goto err;
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nc++;
|
nc++;
|
||||||
|
@@ -269,7 +269,7 @@ on_host_init(VSCMsgHeader *mhHeader, VSCMsgInit *incoming)
|
|||||||
send_msg(VSC_ReaderRemove, VSCARD_MINIMAL_READER_ID, NULL, 0);
|
send_msg(VSC_ReaderRemove, VSCARD_MINIMAL_READER_ID, NULL, 0);
|
||||||
/* launch the event_thread. This will trigger reader adds for all the
|
/* launch the event_thread. This will trigger reader adds for all the
|
||||||
* existing readers */
|
* existing readers */
|
||||||
qemu_thread_create(&thread_id, event_thread, NULL, 0);
|
qemu_thread_create(&thread_id, "vsc/event", event_thread, NULL, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -39,6 +39,7 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "alpha"
|
#define UNAME_MACHINE "alpha"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#undef TARGET_EDEADLK
|
#undef TARGET_EDEADLK
|
||||||
#define TARGET_EDEADLK 11
|
#define TARGET_EDEADLK 11
|
||||||
|
@@ -40,5 +40,6 @@ struct target_pt_regs {
|
|||||||
#else
|
#else
|
||||||
#define UNAME_MACHINE "armv5tel"
|
#define UNAME_MACHINE "armv5tel"
|
||||||
#endif
|
#endif
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS
|
#define TARGET_CLONE_BACKWARDS
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
#ifndef CRIS_SYSCALL_H
|
#ifndef CRIS_SYSCALL_H
|
||||||
#define CRIS_SYSCALL_H 1
|
#define CRIS_SYSCALL_H 1
|
||||||
|
|
||||||
|
|
||||||
#define UNAME_MACHINE "cris"
|
#define UNAME_MACHINE "cris"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
/* pt_regs not only specifices the format in the user-struct during
|
/* pt_regs not only specifices the format in the user-struct during
|
||||||
* ptrace but is also the frame format used in the kernel prologue/epilogues
|
* ptrace but is also the frame format used in the kernel prologue/epilogues
|
||||||
|
@@ -144,5 +144,6 @@ struct target_vm86plus_struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "i686"
|
#define UNAME_MACHINE "i686"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS
|
#define TARGET_CLONE_BACKWARDS
|
||||||
|
@@ -15,7 +15,7 @@ struct target_pt_regs {
|
|||||||
uint16_t __fill;
|
uint16_t __fill;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define UNAME_MACHINE "m68k"
|
#define UNAME_MACHINE "m68k"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
void do_m68k_simcall(CPUM68KState *, int);
|
void do_m68k_simcall(CPUM68KState *, int);
|
||||||
|
@@ -2400,6 +2400,10 @@ static int do_break(CPUMIPSState *env, target_siginfo_t *info,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
info->si_signo = TARGET_SIGTRAP;
|
||||||
|
info->si_errno = 0;
|
||||||
|
queue_signal(env, info->si_signo, &*info);
|
||||||
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
#ifndef MICROBLAZE_SYSCALLS_H
|
#ifndef MICROBLAZE_SYSCALLS_H
|
||||||
#define MICROBLAZE_SYSCALLS_H 1
|
#define MICROBLAZE_SYSCALLS_H 1
|
||||||
|
|
||||||
|
|
||||||
#define UNAME_MACHINE "microblaze"
|
#define UNAME_MACHINE "microblaze"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
/* We use microblaze_reg_t to keep things similar to the kernel sources. */
|
/* We use microblaze_reg_t to keep things similar to the kernel sources. */
|
||||||
typedef uint32_t microblaze_reg_t;
|
typedef uint32_t microblaze_reg_t;
|
||||||
|
@@ -225,5 +225,6 @@ struct target_pt_regs {
|
|||||||
#define TARGET_QEMU_ESIGRETURN 255
|
#define TARGET_QEMU_ESIGRETURN 255
|
||||||
|
|
||||||
#define UNAME_MACHINE "mips"
|
#define UNAME_MACHINE "mips"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS
|
#define TARGET_CLONE_BACKWARDS
|
||||||
|
@@ -222,5 +222,6 @@ struct target_pt_regs {
|
|||||||
#define TARGET_QEMU_ESIGRETURN 255
|
#define TARGET_QEMU_ESIGRETURN 255
|
||||||
|
|
||||||
#define UNAME_MACHINE "mips64"
|
#define UNAME_MACHINE "mips64"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS
|
#define TARGET_CLONE_BACKWARDS
|
||||||
|
@@ -22,3 +22,4 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "openrisc"
|
#define UNAME_MACHINE "openrisc"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
@@ -62,5 +62,6 @@ struct target_revectored_struct {
|
|||||||
#else
|
#else
|
||||||
#define UNAME_MACHINE "ppc"
|
#define UNAME_MACHINE "ppc"
|
||||||
#endif
|
#endif
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS
|
#define TARGET_CLONE_BACKWARDS
|
||||||
|
@@ -21,5 +21,6 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "s390x"
|
#define UNAME_MACHINE "s390x"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_CLONE_BACKWARDS2
|
#define TARGET_CLONE_BACKWARDS2
|
||||||
|
@@ -10,3 +10,4 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "sh4"
|
#define UNAME_MACHINE "sh4"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
@@ -1233,8 +1233,14 @@ static int target_restore_sigframe(CPUARMState *env,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 32 * 2; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
__get_user(env->vfp.regs[i], &aux->fpsimd.vregs[i]);
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
|
__get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2 + 1]);
|
||||||
|
__get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2]);
|
||||||
|
#else
|
||||||
|
__get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2]);
|
||||||
|
__get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2 + 1]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
__get_user(fpsr, &aux->fpsimd.fpsr);
|
__get_user(fpsr, &aux->fpsimd.fpsr);
|
||||||
vfp_set_fpsr(env, fpsr);
|
vfp_set_fpsr(env, fpsr);
|
||||||
@@ -1267,7 +1273,7 @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
|
|||||||
CPUARMState *env)
|
CPUARMState *env)
|
||||||
{
|
{
|
||||||
struct target_rt_sigframe *frame;
|
struct target_rt_sigframe *frame;
|
||||||
abi_ulong frame_addr;
|
abi_ulong frame_addr, return_addr;
|
||||||
|
|
||||||
frame_addr = get_sigframe(ka, env);
|
frame_addr = get_sigframe(ka, env);
|
||||||
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) {
|
||||||
@@ -1284,15 +1290,19 @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
|
|||||||
__put_user(target_sigaltstack_used.ss_size,
|
__put_user(target_sigaltstack_used.ss_size,
|
||||||
&frame->uc.tuc_stack.ss_size);
|
&frame->uc.tuc_stack.ss_size);
|
||||||
target_setup_sigframe(frame, env, set);
|
target_setup_sigframe(frame, env, set);
|
||||||
/* mov x8,#__NR_rt_sigreturn; svc #0 */
|
if (ka->sa_flags & TARGET_SA_RESTORER) {
|
||||||
__put_user(0xd2801168, &frame->tramp[0]);
|
return_addr = ka->sa_restorer;
|
||||||
__put_user(0xd4000001, &frame->tramp[1]);
|
} else {
|
||||||
|
/* mov x8,#__NR_rt_sigreturn; svc #0 */
|
||||||
|
__put_user(0xd2801168, &frame->tramp[0]);
|
||||||
|
__put_user(0xd4000001, &frame->tramp[1]);
|
||||||
|
return_addr = frame_addr + offsetof(struct target_rt_sigframe, tramp);
|
||||||
|
}
|
||||||
env->xregs[0] = usig;
|
env->xregs[0] = usig;
|
||||||
env->xregs[31] = frame_addr;
|
env->xregs[31] = frame_addr;
|
||||||
env->xregs[29] = env->xregs[31] + offsetof(struct target_rt_sigframe, fp);
|
env->xregs[29] = env->xregs[31] + offsetof(struct target_rt_sigframe, fp);
|
||||||
env->pc = ka->_sa_handler;
|
env->pc = ka->_sa_handler;
|
||||||
env->xregs[30] = env->xregs[31] +
|
env->xregs[30] = return_addr;
|
||||||
offsetof(struct target_rt_sigframe, tramp);
|
|
||||||
if (info) {
|
if (info) {
|
||||||
if (copy_siginfo_to_user(&frame->info, info)) {
|
if (copy_siginfo_to_user(&frame->info, info)) {
|
||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
|
@@ -7,6 +7,7 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "sun4"
|
#define UNAME_MACHINE "sun4"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
/* SPARC kernels don't define this in their Kconfig, but they have the
|
/* SPARC kernels don't define this in their Kconfig, but they have the
|
||||||
* same ABI as if they did, implemented by sparc-specific code which fishes
|
* same ABI as if they did, implemented by sparc-specific code which fishes
|
||||||
|
@@ -8,6 +8,7 @@ struct target_pt_regs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "sun4u"
|
#define UNAME_MACHINE "sun4u"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
/* SPARC kernels don't define this in their Kconfig, but they have the
|
/* SPARC kernels don't define this in their Kconfig, but they have the
|
||||||
* same ABI as if they did, implemented by sparc-specific code which fishes
|
* same ABI as if they did, implemented by sparc-specific code which fishes
|
||||||
|
@@ -1904,23 +1904,16 @@ static abi_long do_connect(int sockfd, abi_ulong target_addr,
|
|||||||
return get_errno(connect(sockfd, addr, addrlen));
|
return get_errno(connect(sockfd, addr, addrlen));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do_sendrecvmsg() Must return target values and target errnos. */
|
/* do_sendrecvmsg_locked() Must return target values and target errnos. */
|
||||||
static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
|
static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp,
|
||||||
int flags, int send)
|
int flags, int send)
|
||||||
{
|
{
|
||||||
abi_long ret, len;
|
abi_long ret, len;
|
||||||
struct target_msghdr *msgp;
|
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
int count;
|
int count;
|
||||||
struct iovec *vec;
|
struct iovec *vec;
|
||||||
abi_ulong target_vec;
|
abi_ulong target_vec;
|
||||||
|
|
||||||
/* FIXME */
|
|
||||||
if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
|
|
||||||
msgp,
|
|
||||||
target_msg,
|
|
||||||
send ? 1 : 0))
|
|
||||||
return -TARGET_EFAULT;
|
|
||||||
if (msgp->msg_name) {
|
if (msgp->msg_name) {
|
||||||
msg.msg_namelen = tswap32(msgp->msg_namelen);
|
msg.msg_namelen = tswap32(msgp->msg_namelen);
|
||||||
msg.msg_name = alloca(msg.msg_namelen);
|
msg.msg_name = alloca(msg.msg_namelen);
|
||||||
@@ -1975,10 +1968,75 @@ static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
|
|||||||
out:
|
out:
|
||||||
unlock_iovec(vec, target_vec, count, !send);
|
unlock_iovec(vec, target_vec, count, !send);
|
||||||
out2:
|
out2:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
|
||||||
|
int flags, int send)
|
||||||
|
{
|
||||||
|
abi_long ret;
|
||||||
|
struct target_msghdr *msgp;
|
||||||
|
|
||||||
|
if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
|
||||||
|
msgp,
|
||||||
|
target_msg,
|
||||||
|
send ? 1 : 0)) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
ret = do_sendrecvmsg_locked(fd, msgp, flags, send);
|
||||||
unlock_user_struct(msgp, target_msg, send ? 0 : 1);
|
unlock_user_struct(msgp, target_msg, send ? 0 : 1);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TARGET_NR_sendmmsg
|
||||||
|
/* We don't rely on the C library to have sendmmsg/recvmmsg support,
|
||||||
|
* so it might not have this *mmsg-specific flag either.
|
||||||
|
*/
|
||||||
|
#ifndef MSG_WAITFORONE
|
||||||
|
#define MSG_WAITFORONE 0x10000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static abi_long do_sendrecvmmsg(int fd, abi_ulong target_msgvec,
|
||||||
|
unsigned int vlen, unsigned int flags,
|
||||||
|
int send)
|
||||||
|
{
|
||||||
|
struct target_mmsghdr *mmsgp;
|
||||||
|
abi_long ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (vlen > UIO_MAXIOV) {
|
||||||
|
vlen = UIO_MAXIOV;
|
||||||
|
}
|
||||||
|
|
||||||
|
mmsgp = lock_user(VERIFY_WRITE, target_msgvec, sizeof(*mmsgp) * vlen, 1);
|
||||||
|
if (!mmsgp) {
|
||||||
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < vlen; i++) {
|
||||||
|
ret = do_sendrecvmsg_locked(fd, &mmsgp[i].msg_hdr, flags, send);
|
||||||
|
if (is_error(ret)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mmsgp[i].msg_len = tswap32(ret);
|
||||||
|
/* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
|
||||||
|
if (flags & MSG_WAITFORONE) {
|
||||||
|
flags |= MSG_DONTWAIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock_user(mmsgp, target_msgvec, sizeof(*mmsgp) * i);
|
||||||
|
|
||||||
|
/* Return number of datagrams sent if we sent any at all;
|
||||||
|
* otherwise return the error.
|
||||||
|
*/
|
||||||
|
if (i) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* If we don't have a system accept4() then just call accept.
|
/* If we don't have a system accept4() then just call accept.
|
||||||
* The callsites to do_accept4() will ensure that they don't
|
* The callsites to do_accept4() will ensure that they don't
|
||||||
* pass a non-zero flags argument in this config.
|
* pass a non-zero flags argument in this config.
|
||||||
@@ -4528,6 +4586,9 @@ static inline int tswapid(int id)
|
|||||||
{
|
{
|
||||||
return tswap16(id);
|
return tswap16(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define put_user_id(x, gaddr) put_user_u16(x, gaddr)
|
||||||
|
|
||||||
#else /* !USE_UID16 */
|
#else /* !USE_UID16 */
|
||||||
static inline int high2lowuid(int uid)
|
static inline int high2lowuid(int uid)
|
||||||
{
|
{
|
||||||
@@ -4549,6 +4610,9 @@ static inline int tswapid(int id)
|
|||||||
{
|
{
|
||||||
return tswap32(id);
|
return tswap32(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define put_user_id(x, gaddr) put_user_u32(x, gaddr)
|
||||||
|
|
||||||
#endif /* USE_UID16 */
|
#endif /* USE_UID16 */
|
||||||
|
|
||||||
void syscall_init(void)
|
void syscall_init(void)
|
||||||
@@ -6121,11 +6185,17 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
puts = NULL;
|
puts = NULL;
|
||||||
}
|
}
|
||||||
ret = get_errno(sigtimedwait(&set, &uinfo, puts));
|
ret = get_errno(sigtimedwait(&set, &uinfo, puts));
|
||||||
if (!is_error(ret) && arg2) {
|
if (!is_error(ret)) {
|
||||||
if (!(p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), 0)))
|
if (arg2) {
|
||||||
goto efault;
|
p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
|
||||||
host_to_target_siginfo(p, &uinfo);
|
0);
|
||||||
unlock_user(p, arg2, sizeof(target_siginfo_t));
|
if (!p) {
|
||||||
|
goto efault;
|
||||||
|
}
|
||||||
|
host_to_target_siginfo(p, &uinfo);
|
||||||
|
unlock_user(p, arg2, sizeof(target_siginfo_t));
|
||||||
|
}
|
||||||
|
ret = host_to_target_signal(ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -6710,6 +6780,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
ret = do_sendrecvmsg(arg1, arg2, arg3, 1);
|
ret = do_sendrecvmsg(arg1, arg2, arg3, 1);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef TARGET_NR_sendmmsg
|
||||||
|
case TARGET_NR_sendmmsg:
|
||||||
|
ret = do_sendrecvmmsg(arg1, arg2, arg3, arg4, 1);
|
||||||
|
break;
|
||||||
|
case TARGET_NR_recvmmsg:
|
||||||
|
ret = do_sendrecvmmsg(arg1, arg2, arg3, arg4, 0);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
#ifdef TARGET_NR_sendto
|
#ifdef TARGET_NR_sendto
|
||||||
case TARGET_NR_sendto:
|
case TARGET_NR_sendto:
|
||||||
ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
|
ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
|
||||||
@@ -7805,9 +7883,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
uid_t ruid, euid, suid;
|
uid_t ruid, euid, suid;
|
||||||
ret = get_errno(getresuid(&ruid, &euid, &suid));
|
ret = get_errno(getresuid(&ruid, &euid, &suid));
|
||||||
if (!is_error(ret)) {
|
if (!is_error(ret)) {
|
||||||
if (put_user_u16(high2lowuid(ruid), arg1)
|
if (put_user_id(high2lowuid(ruid), arg1)
|
||||||
|| put_user_u16(high2lowuid(euid), arg2)
|
|| put_user_id(high2lowuid(euid), arg2)
|
||||||
|| put_user_u16(high2lowuid(suid), arg3))
|
|| put_user_id(high2lowuid(suid), arg3))
|
||||||
goto efault;
|
goto efault;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7826,9 +7904,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
gid_t rgid, egid, sgid;
|
gid_t rgid, egid, sgid;
|
||||||
ret = get_errno(getresgid(&rgid, &egid, &sgid));
|
ret = get_errno(getresgid(&rgid, &egid, &sgid));
|
||||||
if (!is_error(ret)) {
|
if (!is_error(ret)) {
|
||||||
if (put_user_u16(high2lowgid(rgid), arg1)
|
if (put_user_id(high2lowgid(rgid), arg1)
|
||||||
|| put_user_u16(high2lowgid(egid), arg2)
|
|| put_user_id(high2lowgid(egid), arg2)
|
||||||
|| put_user_u16(high2lowgid(sgid), arg3))
|
|| put_user_id(high2lowgid(sgid), arg3))
|
||||||
goto efault;
|
goto efault;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -53,7 +53,8 @@
|
|||||||
#define TARGET_IOC_NRBITS 8
|
#define TARGET_IOC_NRBITS 8
|
||||||
#define TARGET_IOC_TYPEBITS 8
|
#define TARGET_IOC_TYPEBITS 8
|
||||||
|
|
||||||
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
|
#if defined(TARGET_I386) || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \
|
||||||
|
|| defined(TARGET_SPARC) \
|
||||||
|| defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
|
|| defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
|
||||||
/* 16 bit uid wrappers emulation */
|
/* 16 bit uid wrappers emulation */
|
||||||
#define USE_UID16
|
#define USE_UID16
|
||||||
@@ -239,6 +240,10 @@ __target_cmsg_nxthdr (struct target_msghdr *__mhdr, struct target_cmsghdr *__cms
|
|||||||
return __cmsg;
|
return __cmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct target_mmsghdr {
|
||||||
|
struct target_msghdr msg_hdr; /* Message header */
|
||||||
|
unsigned int msg_len; /* Number of bytes transmitted */
|
||||||
|
};
|
||||||
|
|
||||||
struct target_rusage {
|
struct target_rusage {
|
||||||
struct target_timeval ru_utime; /* user time used */
|
struct target_timeval ru_utime; /* user time used */
|
||||||
|
@@ -51,5 +51,6 @@ struct target_pt_regs {
|
|||||||
#define UC32_SYSCALL_NR_set_tls (UC32_SYSCALL_ARCH_BASE + 5)
|
#define UC32_SYSCALL_NR_set_tls (UC32_SYSCALL_ARCH_BASE + 5)
|
||||||
|
|
||||||
#define UNAME_MACHINE "UniCore-II"
|
#define UNAME_MACHINE "UniCore-II"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#endif /* __UC32_SYSCALL_H__ */
|
#endif /* __UC32_SYSCALL_H__ */
|
||||||
|
@@ -91,6 +91,7 @@ struct target_msqid64_ds {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define UNAME_MACHINE "x86_64"
|
#define UNAME_MACHINE "x86_64"
|
||||||
|
#define UNAME_MINIMUM_RELEASE "2.6.32"
|
||||||
|
|
||||||
#define TARGET_ARCH_SET_GS 0x1001
|
#define TARGET_ARCH_SET_GS 0x1001
|
||||||
#define TARGET_ARCH_SET_FS 0x1002
|
#define TARGET_ARCH_SET_FS 0x1002
|
||||||
|
2
memory.c
2
memory.c
@@ -1562,7 +1562,7 @@ static FlatRange *flatview_lookup(FlatView *view, AddrRange addr)
|
|||||||
bool memory_region_present(MemoryRegion *parent, hwaddr addr)
|
bool memory_region_present(MemoryRegion *parent, hwaddr addr)
|
||||||
{
|
{
|
||||||
MemoryRegion *mr = memory_region_find(parent, addr, 1).mr;
|
MemoryRegion *mr = memory_region_find(parent, addr, 1).mr;
|
||||||
if (!mr) {
|
if (!mr || (mr == parent)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memory_region_unref(mr);
|
memory_region_unref(mr);
|
||||||
|
@@ -695,6 +695,6 @@ void migrate_fd_connect(MigrationState *s)
|
|||||||
/* Notify before starting migration thread */
|
/* Notify before starting migration thread */
|
||||||
notifier_list_notify(&migration_state_notifiers, s);
|
notifier_list_notify(&migration_state_notifiers, s);
|
||||||
|
|
||||||
qemu_thread_create(&s->thread, migration_thread, s,
|
qemu_thread_create(&s->thread, "migration", migration_thread, s,
|
||||||
QEMU_THREAD_JOINABLE);
|
QEMU_THREAD_JOINABLE);
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
1275-1994 (referred to as Open Firmware) compliant firmware.
|
1275-1994 (referred to as Open Firmware) compliant firmware.
|
||||||
The included images for PowerPC (for 32 and 64 bit PPC CPUs),
|
The included images for PowerPC (for 32 and 64 bit PPC CPUs),
|
||||||
Sparc32 (including QEMU,tcx.bin and QEMU,cgthree.bin) and Sparc64 are built
|
Sparc32 (including QEMU,tcx.bin and QEMU,cgthree.bin) and Sparc64 are built
|
||||||
from OpenBIOS SVN revision 1246.
|
from OpenBIOS SVN revision 1280.
|
||||||
|
|
||||||
- SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware
|
- SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware
|
||||||
implementation for certain IBM POWER hardware. The sources are at
|
implementation for certain IBM POWER hardware. The sources are at
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
17
qemu-char.c
17
qemu-char.c
@@ -213,7 +213,7 @@ void qemu_chr_add_handlers(CharDriverState *s,
|
|||||||
s->chr_read = fd_read;
|
s->chr_read = fd_read;
|
||||||
s->chr_event = fd_event;
|
s->chr_event = fd_event;
|
||||||
s->handler_opaque = opaque;
|
s->handler_opaque = opaque;
|
||||||
if (s->chr_update_read_handler)
|
if (fe_open && s->chr_update_read_handler)
|
||||||
s->chr_update_read_handler(s);
|
s->chr_update_read_handler(s);
|
||||||
|
|
||||||
if (!s->explicit_fe_open) {
|
if (!s->explicit_fe_open) {
|
||||||
@@ -1136,13 +1136,14 @@ static void pty_chr_state(CharDriverState *chr, int connected)
|
|||||||
if (!s->connected) {
|
if (!s->connected) {
|
||||||
s->connected = 1;
|
s->connected = 1;
|
||||||
qemu_chr_be_generic_open(chr);
|
qemu_chr_be_generic_open(chr);
|
||||||
|
}
|
||||||
|
if (!chr->fd_in_tag) {
|
||||||
chr->fd_in_tag = io_add_watch_poll(s->fd, pty_chr_read_poll,
|
chr->fd_in_tag = io_add_watch_poll(s->fd, pty_chr_read_poll,
|
||||||
pty_chr_read, chr);
|
pty_chr_read, chr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void pty_chr_close(struct CharDriverState *chr)
|
static void pty_chr_close(struct CharDriverState *chr)
|
||||||
{
|
{
|
||||||
PtyCharDriver *s = chr->opaque;
|
PtyCharDriver *s = chr->opaque;
|
||||||
@@ -2509,6 +2510,17 @@ static void tcp_chr_connect(void *opaque)
|
|||||||
qemu_chr_be_generic_open(chr);
|
qemu_chr_be_generic_open(chr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tcp_chr_update_read_handler(CharDriverState *chr)
|
||||||
|
{
|
||||||
|
TCPCharDriver *s = chr->opaque;
|
||||||
|
|
||||||
|
remove_fd_in_watch(chr);
|
||||||
|
if (s->chan) {
|
||||||
|
chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll,
|
||||||
|
tcp_chr_read, chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
|
#define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c;
|
||||||
static void tcp_chr_telnet_init(int fd)
|
static void tcp_chr_telnet_init(int fd)
|
||||||
{
|
{
|
||||||
@@ -2664,6 +2676,7 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
|
|||||||
chr->get_msgfd = tcp_get_msgfd;
|
chr->get_msgfd = tcp_get_msgfd;
|
||||||
chr->chr_add_client = tcp_chr_add_client;
|
chr->chr_add_client = tcp_chr_add_client;
|
||||||
chr->chr_add_watch = tcp_chr_add_watch;
|
chr->chr_add_watch = tcp_chr_add_watch;
|
||||||
|
chr->chr_update_read_handler = tcp_chr_update_read_handler;
|
||||||
/* be isn't opened until we get a connection */
|
/* be isn't opened until we get a connection */
|
||||||
chr->explicit_be_open = true;
|
chr->explicit_be_open = true;
|
||||||
|
|
||||||
|
@@ -105,7 +105,7 @@ static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos,
|
|||||||
res = fwrite(buf, 1, size, s->stdio_file);
|
res = fwrite(buf, 1, size, s->stdio_file);
|
||||||
|
|
||||||
if (res != size) {
|
if (res != size) {
|
||||||
return -EIO; /* fake errno value */
|
return -errno;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@@ -328,9 +328,11 @@ possible drivers and properties, use @code{-device help} and
|
|||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
DEF("name", HAS_ARG, QEMU_OPTION_name,
|
DEF("name", HAS_ARG, QEMU_OPTION_name,
|
||||||
"-name string1[,process=string2]\n"
|
"-name string1[,process=string2][,debug-threads=on|off]\n"
|
||||||
" set the name of the guest\n"
|
" set the name of the guest\n"
|
||||||
" string1 sets the window title and string2 the process name (on Linux)\n",
|
" string1 sets the window title and string2 the process name (on Linux)\n"
|
||||||
|
" When debug-threads is enabled, individual threads are given a separate name (on Linux)\n"
|
||||||
|
" NOTE: The thread names are for debugging and not a stable API.\n",
|
||||||
QEMU_ARCH_ALL)
|
QEMU_ARCH_ALL)
|
||||||
STEXI
|
STEXI
|
||||||
@item -name @var{name}
|
@item -name @var{name}
|
||||||
@@ -339,6 +341,7 @@ Sets the @var{name} of the guest.
|
|||||||
This name will be displayed in the SDL window caption.
|
This name will be displayed in the SDL window caption.
|
||||||
The @var{name} will also be used for the VNC server.
|
The @var{name} will also be used for the VNC server.
|
||||||
Also optionally set the top visible process name in Linux.
|
Also optionally set the top visible process name in Linux.
|
||||||
|
Naming of individual threads can also be enabled on Linux to aid debugging.
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
DEF("uuid", HAS_ARG, QEMU_OPTION_uuid,
|
DEF("uuid", HAS_ARG, QEMU_OPTION_uuid,
|
||||||
|
Submodule roms/openbios updated: 888126272f...1ac3fb92c1
12
savevm.c
12
savevm.c
@@ -527,13 +527,13 @@ int qemu_savevm_state_iterate(QEMUFile *f)
|
|||||||
if (qemu_file_rate_limit(f)) {
|
if (qemu_file_rate_limit(f)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
trace_savevm_section_start();
|
trace_savevm_section_start(se->idstr, se->section_id);
|
||||||
/* Section type */
|
/* Section type */
|
||||||
qemu_put_byte(f, QEMU_VM_SECTION_PART);
|
qemu_put_byte(f, QEMU_VM_SECTION_PART);
|
||||||
qemu_put_be32(f, se->section_id);
|
qemu_put_be32(f, se->section_id);
|
||||||
|
|
||||||
ret = se->ops->save_live_iterate(f, se->opaque);
|
ret = se->ops->save_live_iterate(f, se->opaque);
|
||||||
trace_savevm_section_end(se->section_id);
|
trace_savevm_section_end(se->idstr, se->section_id);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
qemu_file_set_error(f, ret);
|
qemu_file_set_error(f, ret);
|
||||||
@@ -565,13 +565,13 @@ void qemu_savevm_state_complete(QEMUFile *f)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trace_savevm_section_start();
|
trace_savevm_section_start(se->idstr, se->section_id);
|
||||||
/* Section type */
|
/* Section type */
|
||||||
qemu_put_byte(f, QEMU_VM_SECTION_END);
|
qemu_put_byte(f, QEMU_VM_SECTION_END);
|
||||||
qemu_put_be32(f, se->section_id);
|
qemu_put_be32(f, se->section_id);
|
||||||
|
|
||||||
ret = se->ops->save_live_complete(f, se->opaque);
|
ret = se->ops->save_live_complete(f, se->opaque);
|
||||||
trace_savevm_section_end(se->section_id);
|
trace_savevm_section_end(se->idstr, se->section_id);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
qemu_file_set_error(f, ret);
|
qemu_file_set_error(f, ret);
|
||||||
return;
|
return;
|
||||||
@@ -584,7 +584,7 @@ void qemu_savevm_state_complete(QEMUFile *f)
|
|||||||
if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
|
if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
trace_savevm_section_start();
|
trace_savevm_section_start(se->idstr, se->section_id);
|
||||||
/* Section type */
|
/* Section type */
|
||||||
qemu_put_byte(f, QEMU_VM_SECTION_FULL);
|
qemu_put_byte(f, QEMU_VM_SECTION_FULL);
|
||||||
qemu_put_be32(f, se->section_id);
|
qemu_put_be32(f, se->section_id);
|
||||||
@@ -598,7 +598,7 @@ void qemu_savevm_state_complete(QEMUFile *f)
|
|||||||
qemu_put_be32(f, se->version_id);
|
qemu_put_be32(f, se->version_id);
|
||||||
|
|
||||||
vmstate_save(f, se);
|
vmstate_save(f, se);
|
||||||
trace_savevm_section_end(se->section_id);
|
trace_savevm_section_end(se->idstr, se->section_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_put_byte(f, QEMU_VM_EOF);
|
qemu_put_byte(f, QEMU_VM_EOF);
|
||||||
|
@@ -222,6 +222,10 @@ typedef struct CPUARMState {
|
|||||||
uint64_t dbgbcr[16]; /* breakpoint control registers */
|
uint64_t dbgbcr[16]; /* breakpoint control registers */
|
||||||
uint64_t dbgwvr[16]; /* watchpoint value registers */
|
uint64_t dbgwvr[16]; /* watchpoint value registers */
|
||||||
uint64_t dbgwcr[16]; /* watchpoint control registers */
|
uint64_t dbgwcr[16]; /* watchpoint control registers */
|
||||||
|
/* If the counter is enabled, this stores the last time the counter
|
||||||
|
* was reset. Otherwise it stores the counter value
|
||||||
|
*/
|
||||||
|
uint32_t c15_ccnt;
|
||||||
} cp15;
|
} cp15;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@@ -13,6 +13,11 @@ static inline int get_phys_addr(CPUARMState *env, uint32_t address,
|
|||||||
int access_type, int is_user,
|
int access_type, int is_user,
|
||||||
hwaddr *phys_ptr, int *prot,
|
hwaddr *phys_ptr, int *prot,
|
||||||
target_ulong *page_size);
|
target_ulong *page_size);
|
||||||
|
|
||||||
|
/* Definitions for the PMCCNTR and PMCR registers */
|
||||||
|
#define PMCRD 0x8
|
||||||
|
#define PMCRC 0x4
|
||||||
|
#define PMCRE 0x1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
|
static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
|
||||||
@@ -478,14 +483,85 @@ static CPAccessResult pmreg_access(CPUARMState *env, const ARMCPRegInfo *ri)
|
|||||||
return CP_ACCESS_OK;
|
return CP_ACCESS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
static void pmcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void pmcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
|
/* Don't computer the number of ticks in user mode */
|
||||||
|
uint32_t temp_ticks;
|
||||||
|
|
||||||
|
temp_ticks = qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) *
|
||||||
|
get_ticks_per_sec() / 1000000;
|
||||||
|
|
||||||
|
if (env->cp15.c9_pmcr & PMCRE) {
|
||||||
|
/* If the counter is enabled */
|
||||||
|
if (env->cp15.c9_pmcr & PMCRD) {
|
||||||
|
/* Increment once every 64 processor clock cycles */
|
||||||
|
env->cp15.c15_ccnt = (temp_ticks/64) - env->cp15.c15_ccnt;
|
||||||
|
} else {
|
||||||
|
env->cp15.c15_ccnt = temp_ticks - env->cp15.c15_ccnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value & PMCRC) {
|
||||||
|
/* The counter has been reset */
|
||||||
|
env->cp15.c15_ccnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* only the DP, X, D and E bits are writable */
|
/* only the DP, X, D and E bits are writable */
|
||||||
env->cp15.c9_pmcr &= ~0x39;
|
env->cp15.c9_pmcr &= ~0x39;
|
||||||
env->cp15.c9_pmcr |= (value & 0x39);
|
env->cp15.c9_pmcr |= (value & 0x39);
|
||||||
|
|
||||||
|
if (env->cp15.c9_pmcr & PMCRE) {
|
||||||
|
if (env->cp15.c9_pmcr & PMCRD) {
|
||||||
|
/* Increment once every 64 processor clock cycles */
|
||||||
|
temp_ticks /= 64;
|
||||||
|
}
|
||||||
|
env->cp15.c15_ccnt = temp_ticks - env->cp15.c15_ccnt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint64_t pmccntr_read(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||||
|
{
|
||||||
|
uint32_t total_ticks;
|
||||||
|
|
||||||
|
if (!(env->cp15.c9_pmcr & PMCRE)) {
|
||||||
|
/* Counter is disabled, do not change value */
|
||||||
|
return env->cp15.c15_ccnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_ticks = qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) *
|
||||||
|
get_ticks_per_sec() / 1000000;
|
||||||
|
|
||||||
|
if (env->cp15.c9_pmcr & PMCRD) {
|
||||||
|
/* Increment once every 64 processor clock cycles */
|
||||||
|
total_ticks /= 64;
|
||||||
|
}
|
||||||
|
return total_ticks - env->cp15.c15_ccnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pmccntr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
|
uint64_t value)
|
||||||
|
{
|
||||||
|
uint32_t total_ticks;
|
||||||
|
|
||||||
|
if (!(env->cp15.c9_pmcr & PMCRE)) {
|
||||||
|
/* Counter is disabled, set the absolute value */
|
||||||
|
env->cp15.c15_ccnt = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_ticks = qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) *
|
||||||
|
get_ticks_per_sec() / 1000000;
|
||||||
|
|
||||||
|
if (env->cp15.c9_pmcr & PMCRD) {
|
||||||
|
/* Increment once every 64 processor clock cycles */
|
||||||
|
total_ticks /= 64;
|
||||||
|
}
|
||||||
|
env->cp15.c15_ccnt = total_ticks - value;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void pmcntenset_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
static void pmcntenset_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
@@ -604,10 +680,12 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
|
|||||||
{ .name = "PMSELR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 5,
|
{ .name = "PMSELR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 5,
|
||||||
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
||||||
.accessfn = pmreg_access },
|
.accessfn = pmreg_access },
|
||||||
/* Unimplemented, RAZ/WI. */
|
#ifndef CONFIG_USER_ONLY
|
||||||
{ .name = "PMCCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 0,
|
{ .name = "PMCCNTR", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 0,
|
||||||
.access = PL0_RW, .type = ARM_CP_CONST, .resetvalue = 0,
|
.access = PL0_RW, .resetvalue = 0, .type = ARM_CP_IO,
|
||||||
|
.readfn = pmccntr_read, .writefn = pmccntr_write,
|
||||||
.accessfn = pmreg_access },
|
.accessfn = pmreg_access },
|
||||||
|
#endif
|
||||||
{ .name = "PMXEVTYPER", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 1,
|
{ .name = "PMXEVTYPER", .cp = 15, .crn = 9, .crm = 13, .opc1 = 0, .opc2 = 1,
|
||||||
.access = PL0_RW,
|
.access = PL0_RW,
|
||||||
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmxevtyper),
|
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmxevtyper),
|
||||||
@@ -1873,8 +1951,10 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|||||||
}
|
}
|
||||||
if (arm_feature(env, ARM_FEATURE_V7)) {
|
if (arm_feature(env, ARM_FEATURE_V7)) {
|
||||||
/* v7 performance monitor control register: same implementor
|
/* v7 performance monitor control register: same implementor
|
||||||
* field as main ID register, and we implement no event counters.
|
* field as main ID register, and we implement only the cycle
|
||||||
|
* count register.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
ARMCPRegInfo pmcr = {
|
ARMCPRegInfo pmcr = {
|
||||||
.name = "PMCR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 0,
|
.name = "PMCR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 0,
|
||||||
.access = PL0_RW, .resetvalue = cpu->midr & 0xff000000,
|
.access = PL0_RW, .resetvalue = cpu->midr & 0xff000000,
|
||||||
@@ -1882,12 +1962,13 @@ void register_cp_regs_for_features(ARMCPU *cpu)
|
|||||||
.accessfn = pmreg_access, .writefn = pmcr_write,
|
.accessfn = pmreg_access, .writefn = pmcr_write,
|
||||||
.raw_writefn = raw_write,
|
.raw_writefn = raw_write,
|
||||||
};
|
};
|
||||||
|
define_one_arm_cp_reg(cpu, &pmcr);
|
||||||
|
#endif
|
||||||
ARMCPRegInfo clidr = {
|
ARMCPRegInfo clidr = {
|
||||||
.name = "CLIDR", .state = ARM_CP_STATE_BOTH,
|
.name = "CLIDR", .state = ARM_CP_STATE_BOTH,
|
||||||
.opc0 = 3, .crn = 0, .crm = 0, .opc1 = 1, .opc2 = 1,
|
.opc0 = 3, .crn = 0, .crm = 0, .opc1 = 1, .opc2 = 1,
|
||||||
.access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->clidr
|
.access = PL1_R, .type = ARM_CP_CONST, .resetvalue = cpu->clidr
|
||||||
};
|
};
|
||||||
define_one_arm_cp_reg(cpu, &pmcr);
|
|
||||||
define_one_arm_cp_reg(cpu, &clidr);
|
define_one_arm_cp_reg(cpu, &clidr);
|
||||||
define_arm_cp_regs(cpu, v7_cp_reginfo);
|
define_arm_cp_regs(cpu, v7_cp_reginfo);
|
||||||
} else {
|
} else {
|
||||||
@@ -2478,7 +2559,7 @@ uint32_t cpsr_read(CPUARMState *env)
|
|||||||
(env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
|
(env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
|
||||||
| (env->thumb << 5) | ((env->condexec_bits & 3) << 25)
|
| (env->thumb << 5) | ((env->condexec_bits & 3) << 25)
|
||||||
| ((env->condexec_bits & 0xfc) << 8)
|
| ((env->condexec_bits & 0xfc) << 8)
|
||||||
| (env->GE << 16) | env->daif;
|
| (env->GE << 16) | (env->daif & CPSR_AIF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
|
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
|
||||||
|
@@ -50,6 +50,7 @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
|
|||||||
i32, i32, i32, i32)
|
i32, i32, i32, i32)
|
||||||
DEF_HELPER_2(exception, void, env, i32)
|
DEF_HELPER_2(exception, void, env, i32)
|
||||||
DEF_HELPER_1(wfi, void, env)
|
DEF_HELPER_1(wfi, void, env)
|
||||||
|
DEF_HELPER_1(wfe, void, env)
|
||||||
|
|
||||||
DEF_HELPER_3(cpsr_write, void, env, i32, i32)
|
DEF_HELPER_3(cpsr_write, void, env, i32, i32)
|
||||||
DEF_HELPER_1(cpsr_read, i32, env)
|
DEF_HELPER_1(cpsr_read, i32, env)
|
||||||
|
@@ -225,6 +225,15 @@ void HELPER(wfi)(CPUARMState *env)
|
|||||||
cpu_loop_exit(env);
|
cpu_loop_exit(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HELPER(wfe)(CPUARMState *env)
|
||||||
|
{
|
||||||
|
/* Don't actually halt the CPU, just yield back to top
|
||||||
|
* level loop
|
||||||
|
*/
|
||||||
|
env->exception_index = EXCP_YIELD;
|
||||||
|
cpu_loop_exit(env);
|
||||||
|
}
|
||||||
|
|
||||||
void HELPER(exception)(CPUARMState *env, uint32_t excp)
|
void HELPER(exception)(CPUARMState *env, uint32_t excp)
|
||||||
{
|
{
|
||||||
env->exception_index = excp;
|
env->exception_index = excp;
|
||||||
|
@@ -210,7 +210,7 @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
|
|||||||
if (use_goto_tb(s, n, dest)) {
|
if (use_goto_tb(s, n, dest)) {
|
||||||
tcg_gen_goto_tb(n);
|
tcg_gen_goto_tb(n);
|
||||||
gen_a64_set_pc_im(dest);
|
gen_a64_set_pc_im(dest);
|
||||||
tcg_gen_exit_tb((tcg_target_long)tb + n);
|
tcg_gen_exit_tb((intptr_t)tb + n);
|
||||||
s->is_jmp = DISAS_TB_JUMP;
|
s->is_jmp = DISAS_TB_JUMP;
|
||||||
} else {
|
} else {
|
||||||
gen_a64_set_pc_im(dest);
|
gen_a64_set_pc_im(dest);
|
||||||
|
@@ -3939,6 +3939,9 @@ static void gen_nop_hint(DisasContext *s, int val)
|
|||||||
s->is_jmp = DISAS_WFI;
|
s->is_jmp = DISAS_WFI;
|
||||||
break;
|
break;
|
||||||
case 2: /* wfe */
|
case 2: /* wfe */
|
||||||
|
gen_set_pc_im(s, s->pc);
|
||||||
|
s->is_jmp = DISAS_WFE;
|
||||||
|
break;
|
||||||
case 4: /* sev */
|
case 4: /* sev */
|
||||||
case 5: /* sevl */
|
case 5: /* sevl */
|
||||||
/* TODO: Implement SEV, SEVL and WFE. May help SMP performance. */
|
/* TODO: Implement SEV, SEVL and WFE. May help SMP performance. */
|
||||||
@@ -10857,6 +10860,9 @@ static inline void gen_intermediate_code_internal(ARMCPU *cpu,
|
|||||||
case DISAS_WFI:
|
case DISAS_WFI:
|
||||||
gen_helper_wfi(cpu_env);
|
gen_helper_wfi(cpu_env);
|
||||||
break;
|
break;
|
||||||
|
case DISAS_WFE:
|
||||||
|
gen_helper_wfe(cpu_env);
|
||||||
|
break;
|
||||||
case DISAS_SWI:
|
case DISAS_SWI:
|
||||||
gen_exception(EXCP_SWI);
|
gen_exception(EXCP_SWI);
|
||||||
break;
|
break;
|
||||||
|
@@ -44,6 +44,8 @@ extern TCGv_ptr cpu_env;
|
|||||||
* emitting unreachable code at the end of the TB in the A64 decoder
|
* emitting unreachable code at the end of the TB in the A64 decoder
|
||||||
*/
|
*/
|
||||||
#define DISAS_EXC 6
|
#define DISAS_EXC 6
|
||||||
|
/* WFE */
|
||||||
|
#define DISAS_WFE 7
|
||||||
|
|
||||||
#ifdef TARGET_AARCH64
|
#ifdef TARGET_AARCH64
|
||||||
void a64_translate_init(void);
|
void a64_translate_init(void);
|
||||||
|
@@ -339,7 +339,7 @@ static const ExtSaveArea ext_save_areas[] = {
|
|||||||
[3] = { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
|
[3] = { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
|
||||||
.offset = 0x3c0, .size = 0x40 },
|
.offset = 0x3c0, .size = 0x40 },
|
||||||
[4] = { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
|
[4] = { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
|
||||||
.offset = 0x400, .size = 0x10 },
|
.offset = 0x400, .size = 0x40 },
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *get_register_name_32(unsigned int reg)
|
const char *get_register_name_32(unsigned int reg)
|
||||||
|
@@ -13,6 +13,11 @@
|
|||||||
#include "tcg-be-ldst.h"
|
#include "tcg-be-ldst.h"
|
||||||
#include "qemu/bitops.h"
|
#include "qemu/bitops.h"
|
||||||
|
|
||||||
|
/* We're going to re-use TCGType in setting of the SF bit, which controls
|
||||||
|
the size of the operation performed. If we know the values match, it
|
||||||
|
makes things much cleaner. */
|
||||||
|
QEMU_BUILD_BUG_ON(TCG_TYPE_I32 != 0 || TCG_TYPE_I64 != 1);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
|
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
|
||||||
"%x0", "%x1", "%x2", "%x3", "%x4", "%x5", "%x6", "%x7",
|
"%x0", "%x1", "%x2", "%x3", "%x4", "%x5", "%x6", "%x7",
|
||||||
@@ -66,24 +71,22 @@ static const int tcg_target_call_oarg_regs[1] = {
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void reloc_pc26(void *code_ptr, tcg_target_long target)
|
static inline void reloc_pc26(void *code_ptr, intptr_t target)
|
||||||
{
|
{
|
||||||
tcg_target_long offset; uint32_t insn;
|
intptr_t offset = (target - (intptr_t)code_ptr) / 4;
|
||||||
offset = (target - (tcg_target_long)code_ptr) / 4;
|
|
||||||
/* read instruction, mask away previous PC_REL26 parameter contents,
|
/* read instruction, mask away previous PC_REL26 parameter contents,
|
||||||
set the proper offset, then write back the instruction. */
|
set the proper offset, then write back the instruction. */
|
||||||
insn = *(uint32_t *)code_ptr;
|
uint32_t insn = *(uint32_t *)code_ptr;
|
||||||
insn = deposit32(insn, 0, 26, offset);
|
insn = deposit32(insn, 0, 26, offset);
|
||||||
*(uint32_t *)code_ptr = insn;
|
*(uint32_t *)code_ptr = insn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void reloc_pc19(void *code_ptr, tcg_target_long target)
|
static inline void reloc_pc19(void *code_ptr, intptr_t target)
|
||||||
{
|
{
|
||||||
tcg_target_long offset; uint32_t insn;
|
intptr_t offset = (target - (intptr_t)code_ptr) / 4;
|
||||||
offset = (target - (tcg_target_long)code_ptr) / 4;
|
|
||||||
/* read instruction, mask away previous PC_REL19 parameter contents,
|
/* read instruction, mask away previous PC_REL19 parameter contents,
|
||||||
set the proper offset, then write back the instruction. */
|
set the proper offset, then write back the instruction. */
|
||||||
insn = *(uint32_t *)code_ptr;
|
uint32_t insn = *(uint32_t *)code_ptr;
|
||||||
insn = deposit32(insn, 5, 19, offset);
|
insn = deposit32(insn, 5, 19, offset);
|
||||||
*(uint32_t *)code_ptr = insn;
|
*(uint32_t *)code_ptr = insn;
|
||||||
}
|
}
|
||||||
@@ -302,18 +305,8 @@ static inline void tcg_out_ldst_9(TCGContext *s,
|
|||||||
TCGReg rd, TCGReg rn, tcg_target_long offset)
|
TCGReg rd, TCGReg rn, tcg_target_long offset)
|
||||||
{
|
{
|
||||||
/* use LDUR with BASE register with 9bit signed unscaled offset */
|
/* use LDUR with BASE register with 9bit signed unscaled offset */
|
||||||
unsigned int mod, off;
|
tcg_out32(s, op_data << 24 | op_type << 20
|
||||||
|
| (offset & 0x1ff) << 12 | rn << 5 | rd);
|
||||||
if (offset < 0) {
|
|
||||||
off = (256 + offset);
|
|
||||||
mod = 0x1;
|
|
||||||
} else {
|
|
||||||
off = offset;
|
|
||||||
mod = 0x0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod |= op_type;
|
|
||||||
tcg_out32(s, op_data << 24 | mod << 20 | off << 12 | rn << 5 | rd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tcg_out_ldst_12 expects a scaled unsigned immediate offset */
|
/* tcg_out_ldst_12 expects a scaled unsigned immediate offset */
|
||||||
@@ -327,7 +320,8 @@ static inline void tcg_out_ldst_12(TCGContext *s,
|
|||||||
| op_type << 20 | scaled_uimm << 10 | rn << 5 | rd);
|
| op_type << 20 | scaled_uimm << 10 | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_movr(TCGContext *s, int ext, TCGReg rd, TCGReg src)
|
static inline void tcg_out_movr(TCGContext *s, TCGType ext,
|
||||||
|
TCGReg rd, TCGReg src)
|
||||||
{
|
{
|
||||||
/* register to register move using MOV (shifted register with no shift) */
|
/* register to register move using MOV (shifted register with no shift) */
|
||||||
/* using MOV 0x2a0003e0 | (shift).. */
|
/* using MOV 0x2a0003e0 | (shift).. */
|
||||||
@@ -408,7 +402,8 @@ static inline void tcg_out_ldst(TCGContext *s, enum aarch64_ldst_op_data data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* mov alias implemented with add immediate, useful to move to/from SP */
|
/* mov alias implemented with add immediate, useful to move to/from SP */
|
||||||
static inline void tcg_out_movr_sp(TCGContext *s, int ext, TCGReg rd, TCGReg rn)
|
static inline void tcg_out_movr_sp(TCGContext *s, TCGType ext,
|
||||||
|
TCGReg rd, TCGReg rn)
|
||||||
{
|
{
|
||||||
/* using ADD 0x11000000 | (ext) | rn << 5 | rd */
|
/* using ADD 0x11000000 | (ext) | rn << 5 | rd */
|
||||||
unsigned int base = ext ? 0x91000000 : 0x11000000;
|
unsigned int base = ext ? 0x91000000 : 0x11000000;
|
||||||
@@ -438,7 +433,7 @@ static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_arith(TCGContext *s, enum aarch64_arith_opc opc,
|
static inline void tcg_out_arith(TCGContext *s, enum aarch64_arith_opc opc,
|
||||||
int ext, TCGReg rd, TCGReg rn, TCGReg rm,
|
TCGType ext, TCGReg rd, TCGReg rn, TCGReg rm,
|
||||||
int shift_imm)
|
int shift_imm)
|
||||||
{
|
{
|
||||||
/* Using shifted register arithmetic operations */
|
/* Using shifted register arithmetic operations */
|
||||||
@@ -454,7 +449,7 @@ static inline void tcg_out_arith(TCGContext *s, enum aarch64_arith_opc opc,
|
|||||||
tcg_out32(s, base | rm << 16 | shift | rn << 5 | rd);
|
tcg_out32(s, base | rm << 16 | shift | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_mul(TCGContext *s, int ext,
|
static inline void tcg_out_mul(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, TCGReg rm)
|
TCGReg rd, TCGReg rn, TCGReg rm)
|
||||||
{
|
{
|
||||||
/* Using MADD 0x1b000000 with Ra = wzr alias MUL 0x1b007c00 */
|
/* Using MADD 0x1b000000 with Ra = wzr alias MUL 0x1b007c00 */
|
||||||
@@ -463,7 +458,7 @@ static inline void tcg_out_mul(TCGContext *s, int ext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_shiftrot_reg(TCGContext *s,
|
static inline void tcg_out_shiftrot_reg(TCGContext *s,
|
||||||
enum aarch64_srr_opc opc, int ext,
|
enum aarch64_srr_opc opc, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, TCGReg rm)
|
TCGReg rd, TCGReg rn, TCGReg rm)
|
||||||
{
|
{
|
||||||
/* using 2-source data processing instructions 0x1ac02000 */
|
/* using 2-source data processing instructions 0x1ac02000 */
|
||||||
@@ -471,23 +466,23 @@ static inline void tcg_out_shiftrot_reg(TCGContext *s,
|
|||||||
tcg_out32(s, base | rm << 16 | opc << 8 | rn << 5 | rd);
|
tcg_out32(s, base | rm << 16 | opc << 8 | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_ubfm(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
|
static inline void tcg_out_ubfm(TCGContext *s, TCGType ext, TCGReg rd,
|
||||||
unsigned int a, unsigned int b)
|
TCGReg rn, unsigned int a, unsigned int b)
|
||||||
{
|
{
|
||||||
/* Using UBFM 0x53000000 Wd, Wn, a, b */
|
/* Using UBFM 0x53000000 Wd, Wn, a, b */
|
||||||
unsigned int base = ext ? 0xd3400000 : 0x53000000;
|
unsigned int base = ext ? 0xd3400000 : 0x53000000;
|
||||||
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
|
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_sbfm(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
|
static inline void tcg_out_sbfm(TCGContext *s, TCGType ext, TCGReg rd,
|
||||||
unsigned int a, unsigned int b)
|
TCGReg rn, unsigned int a, unsigned int b)
|
||||||
{
|
{
|
||||||
/* Using SBFM 0x13000000 Wd, Wn, a, b */
|
/* Using SBFM 0x13000000 Wd, Wn, a, b */
|
||||||
unsigned int base = ext ? 0x93400000 : 0x13000000;
|
unsigned int base = ext ? 0x93400000 : 0x13000000;
|
||||||
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
|
tcg_out32(s, base | a << 16 | b << 10 | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_extr(TCGContext *s, int ext, TCGReg rd,
|
static inline void tcg_out_extr(TCGContext *s, TCGType ext, TCGReg rd,
|
||||||
TCGReg rn, TCGReg rm, unsigned int a)
|
TCGReg rn, TCGReg rm, unsigned int a)
|
||||||
{
|
{
|
||||||
/* Using EXTR 0x13800000 Wd, Wn, Wm, a */
|
/* Using EXTR 0x13800000 Wd, Wn, Wm, a */
|
||||||
@@ -495,7 +490,7 @@ static inline void tcg_out_extr(TCGContext *s, int ext, TCGReg rd,
|
|||||||
tcg_out32(s, base | rm << 16 | a << 10 | rn << 5 | rd);
|
tcg_out32(s, base | rm << 16 | a << 10 | rn << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_shl(TCGContext *s, int ext,
|
static inline void tcg_out_shl(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int m)
|
TCGReg rd, TCGReg rn, unsigned int m)
|
||||||
{
|
{
|
||||||
int bits, max;
|
int bits, max;
|
||||||
@@ -504,28 +499,28 @@ static inline void tcg_out_shl(TCGContext *s, int ext,
|
|||||||
tcg_out_ubfm(s, ext, rd, rn, bits - (m & max), max - (m & max));
|
tcg_out_ubfm(s, ext, rd, rn, bits - (m & max), max - (m & max));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_shr(TCGContext *s, int ext,
|
static inline void tcg_out_shr(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int m)
|
TCGReg rd, TCGReg rn, unsigned int m)
|
||||||
{
|
{
|
||||||
int max = ext ? 63 : 31;
|
int max = ext ? 63 : 31;
|
||||||
tcg_out_ubfm(s, ext, rd, rn, m & max, max);
|
tcg_out_ubfm(s, ext, rd, rn, m & max, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_sar(TCGContext *s, int ext,
|
static inline void tcg_out_sar(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int m)
|
TCGReg rd, TCGReg rn, unsigned int m)
|
||||||
{
|
{
|
||||||
int max = ext ? 63 : 31;
|
int max = ext ? 63 : 31;
|
||||||
tcg_out_sbfm(s, ext, rd, rn, m & max, max);
|
tcg_out_sbfm(s, ext, rd, rn, m & max, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_rotr(TCGContext *s, int ext,
|
static inline void tcg_out_rotr(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int m)
|
TCGReg rd, TCGReg rn, unsigned int m)
|
||||||
{
|
{
|
||||||
int max = ext ? 63 : 31;
|
int max = ext ? 63 : 31;
|
||||||
tcg_out_extr(s, ext, rd, rn, rn, m & max);
|
tcg_out_extr(s, ext, rd, rn, rn, m & max);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_rotl(TCGContext *s, int ext,
|
static inline void tcg_out_rotl(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int m)
|
TCGReg rd, TCGReg rn, unsigned int m)
|
||||||
{
|
{
|
||||||
int bits, max;
|
int bits, max;
|
||||||
@@ -534,24 +529,23 @@ static inline void tcg_out_rotl(TCGContext *s, int ext,
|
|||||||
tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max));
|
tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_cmp(TCGContext *s, int ext, TCGReg rn, TCGReg rm,
|
static void tcg_out_cmp(TCGContext *s, TCGType ext, TCGReg rn, TCGReg rm)
|
||||||
int shift_imm)
|
|
||||||
{
|
{
|
||||||
/* Using CMP alias SUBS wzr, Wn, Wm */
|
/* Using CMP alias SUBS wzr, Wn, Wm */
|
||||||
tcg_out_arith(s, ARITH_SUBS, ext, TCG_REG_XZR, rn, rm, shift_imm);
|
tcg_out_arith(s, ARITH_SUBS, ext, TCG_REG_XZR, rn, rm, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_cset(TCGContext *s, int ext, TCGReg rd, TCGCond c)
|
static inline void tcg_out_cset(TCGContext *s, TCGType ext,
|
||||||
|
TCGReg rd, TCGCond c)
|
||||||
{
|
{
|
||||||
/* Using CSET alias of CSINC 0x1a800400 Xd, XZR, XZR, invert(cond) */
|
/* Using CSET alias of CSINC 0x1a800400 Xd, XZR, XZR, invert(cond) */
|
||||||
unsigned int base = ext ? 0x9a9f07e0 : 0x1a9f07e0;
|
unsigned int base = ext ? 0x9a9f07e0 : 0x1a9f07e0;
|
||||||
tcg_out32(s, base | tcg_cond_to_aarch64[tcg_invert_cond(c)] << 12 | rd);
|
tcg_out32(s, base | tcg_cond_to_aarch64[tcg_invert_cond(c)] << 12 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_goto(TCGContext *s, tcg_target_long target)
|
static inline void tcg_out_goto(TCGContext *s, intptr_t target)
|
||||||
{
|
{
|
||||||
tcg_target_long offset;
|
intptr_t offset = (target - (intptr_t)s->code_ptr) / 4;
|
||||||
offset = (target - (tcg_target_long)s->code_ptr) / 4;
|
|
||||||
|
|
||||||
if (offset < -0x02000000 || offset >= 0x02000000) {
|
if (offset < -0x02000000 || offset >= 0x02000000) {
|
||||||
/* out of 26bit range */
|
/* out of 26bit range */
|
||||||
@@ -582,11 +576,9 @@ static inline void tcg_out_goto_cond_noaddr(TCGContext *s, TCGCond c)
|
|||||||
tcg_out32(s, insn);
|
tcg_out32(s, insn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_goto_cond(TCGContext *s, TCGCond c,
|
static inline void tcg_out_goto_cond(TCGContext *s, TCGCond c, intptr_t target)
|
||||||
tcg_target_long target)
|
|
||||||
{
|
{
|
||||||
tcg_target_long offset;
|
intptr_t offset = (target - (intptr_t)s->code_ptr) / 4;
|
||||||
offset = (target - (tcg_target_long)s->code_ptr) / 4;
|
|
||||||
|
|
||||||
if (offset < -0x40000 || offset >= 0x40000) {
|
if (offset < -0x40000 || offset >= 0x40000) {
|
||||||
/* out of 19bit range */
|
/* out of 19bit range */
|
||||||
@@ -607,11 +599,9 @@ static inline void tcg_out_gotor(TCGContext *s, TCGReg reg)
|
|||||||
tcg_out32(s, 0xd61f0000 | reg << 5);
|
tcg_out32(s, 0xd61f0000 | reg << 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_call(TCGContext *s, tcg_target_long target)
|
static inline void tcg_out_call(TCGContext *s, intptr_t target)
|
||||||
{
|
{
|
||||||
tcg_target_long offset;
|
intptr_t offset = (target - (intptr_t)s->code_ptr) / 4;
|
||||||
|
|
||||||
offset = (target - (tcg_target_long)s->code_ptr) / 4;
|
|
||||||
|
|
||||||
if (offset < -0x02000000 || offset >= 0x02000000) { /* out of 26bit rng */
|
if (offset < -0x02000000 || offset >= 0x02000000) { /* out of 26bit rng */
|
||||||
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, target);
|
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, target);
|
||||||
@@ -638,7 +628,7 @@ aarch64_limm(unsigned int m, unsigned int r)
|
|||||||
to test a 32bit reg against 0xff000000, pass M = 8, R = 8.
|
to test a 32bit reg against 0xff000000, pass M = 8, R = 8.
|
||||||
to test a 32bit reg against 0xff0000ff, pass M = 16, R = 8.
|
to test a 32bit reg against 0xff0000ff, pass M = 16, R = 8.
|
||||||
*/
|
*/
|
||||||
static inline void tcg_out_tst(TCGContext *s, int ext, TCGReg rn,
|
static inline void tcg_out_tst(TCGContext *s, TCGType ext, TCGReg rn,
|
||||||
unsigned int m, unsigned int r)
|
unsigned int m, unsigned int r)
|
||||||
{
|
{
|
||||||
/* using TST alias of ANDS XZR, Xn,#bimm64 0x7200001f */
|
/* using TST alias of ANDS XZR, Xn,#bimm64 0x7200001f */
|
||||||
@@ -647,8 +637,8 @@ static inline void tcg_out_tst(TCGContext *s, int ext, TCGReg rn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* and a register with a bit pattern, similarly to TST, no flags change */
|
/* and a register with a bit pattern, similarly to TST, no flags change */
|
||||||
static inline void tcg_out_andi(TCGContext *s, int ext, TCGReg rd, TCGReg rn,
|
static inline void tcg_out_andi(TCGContext *s, TCGType ext, TCGReg rd,
|
||||||
unsigned int m, unsigned int r)
|
TCGReg rn, unsigned int m, unsigned int r)
|
||||||
{
|
{
|
||||||
/* using AND 0x12000000 */
|
/* using AND 0x12000000 */
|
||||||
unsigned int base = ext ? 0x92400000 : 0x12000000;
|
unsigned int base = ext ? 0x92400000 : 0x12000000;
|
||||||
@@ -663,9 +653,8 @@ static inline void tcg_out_ret(TCGContext *s)
|
|||||||
|
|
||||||
void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
|
void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
|
||||||
{
|
{
|
||||||
tcg_target_long target, offset;
|
intptr_t target = addr;
|
||||||
target = (tcg_target_long)addr;
|
intptr_t offset = (target - (intptr_t)jmp_addr) / 4;
|
||||||
offset = (target - (tcg_target_long)jmp_addr) / 4;
|
|
||||||
|
|
||||||
if (offset < -0x02000000 || offset >= 0x02000000) {
|
if (offset < -0x02000000 || offset >= 0x02000000) {
|
||||||
/* out of 26bit range */
|
/* out of 26bit range */
|
||||||
@@ -701,21 +690,23 @@ static inline void tcg_out_goto_label_cond(TCGContext *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_rev(TCGContext *s, int ext, TCGReg rd, TCGReg rm)
|
static inline void tcg_out_rev(TCGContext *s, TCGType ext,
|
||||||
|
TCGReg rd, TCGReg rm)
|
||||||
{
|
{
|
||||||
/* using REV 0x5ac00800 */
|
/* using REV 0x5ac00800 */
|
||||||
unsigned int base = ext ? 0xdac00c00 : 0x5ac00800;
|
unsigned int base = ext ? 0xdac00c00 : 0x5ac00800;
|
||||||
tcg_out32(s, base | rm << 5 | rd);
|
tcg_out32(s, base | rm << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_rev16(TCGContext *s, int ext, TCGReg rd, TCGReg rm)
|
static inline void tcg_out_rev16(TCGContext *s, TCGType ext,
|
||||||
|
TCGReg rd, TCGReg rm)
|
||||||
{
|
{
|
||||||
/* using REV16 0x5ac00400 */
|
/* using REV16 0x5ac00400 */
|
||||||
unsigned int base = ext ? 0xdac00400 : 0x5ac00400;
|
unsigned int base = ext ? 0xdac00400 : 0x5ac00400;
|
||||||
tcg_out32(s, base | rm << 5 | rd);
|
tcg_out32(s, base | rm << 5 | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_sxt(TCGContext *s, int ext, int s_bits,
|
static inline void tcg_out_sxt(TCGContext *s, TCGType ext, int s_bits,
|
||||||
TCGReg rd, TCGReg rn)
|
TCGReg rd, TCGReg rn)
|
||||||
{
|
{
|
||||||
/* using ALIASes SXTB 0x13001c00, SXTH 0x13003c00, SXTW 0x93407c00
|
/* using ALIASes SXTB 0x13001c00, SXTH 0x13003c00, SXTW 0x93407c00
|
||||||
@@ -733,7 +724,7 @@ static inline void tcg_out_uxt(TCGContext *s, int s_bits,
|
|||||||
tcg_out_ubfm(s, 0, rd, rn, 0, bits);
|
tcg_out_ubfm(s, 0, rd, rn, 0, bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_addi(TCGContext *s, int ext,
|
static inline void tcg_out_addi(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int aimm)
|
TCGReg rd, TCGReg rn, unsigned int aimm)
|
||||||
{
|
{
|
||||||
/* add immediate aimm unsigned 12bit value (with LSL 0 or 12) */
|
/* add immediate aimm unsigned 12bit value (with LSL 0 or 12) */
|
||||||
@@ -753,7 +744,7 @@ static inline void tcg_out_addi(TCGContext *s, int ext,
|
|||||||
tcg_out32(s, base | aimm | (rn << 5) | rd);
|
tcg_out32(s, base | aimm | (rn << 5) | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_subi(TCGContext *s, int ext,
|
static inline void tcg_out_subi(TCGContext *s, TCGType ext,
|
||||||
TCGReg rd, TCGReg rn, unsigned int aimm)
|
TCGReg rd, TCGReg rn, unsigned int aimm)
|
||||||
{
|
{
|
||||||
/* sub immediate aimm unsigned 12bit value (with LSL 0 or 12) */
|
/* sub immediate aimm unsigned 12bit value (with LSL 0 or 12) */
|
||||||
@@ -773,11 +764,6 @@ static inline void tcg_out_subi(TCGContext *s, int ext,
|
|||||||
tcg_out32(s, base | aimm | (rn << 5) | rd);
|
tcg_out32(s, base | aimm | (rn << 5) | rd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void tcg_out_nop(TCGContext *s)
|
|
||||||
{
|
|
||||||
tcg_out32(s, 0xd503201f);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
#ifdef CONFIG_SOFTMMU
|
||||||
/* helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr,
|
/* helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr,
|
||||||
* int mmu_idx, uintptr_t ra)
|
* int mmu_idx, uintptr_t ra)
|
||||||
@@ -801,7 +787,8 @@ static const void * const qemu_st_helpers[4] = {
|
|||||||
|
|
||||||
static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
{
|
{
|
||||||
reloc_pc19(lb->label_ptr[0], (tcg_target_long)s->code_ptr);
|
reloc_pc19(lb->label_ptr[0], (intptr_t)s->code_ptr);
|
||||||
|
|
||||||
tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
|
tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
|
||||||
tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
|
tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, lb->mem_index);
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, lb->mem_index);
|
||||||
@@ -815,23 +802,21 @@ static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||||||
tcg_out_movr(s, 1, lb->datalo_reg, TCG_REG_X0);
|
tcg_out_movr(s, 1, lb->datalo_reg, TCG_REG_X0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tcg_out_goto(s, (tcg_target_long)lb->raddr);
|
tcg_out_goto(s, (intptr_t)lb->raddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
{
|
{
|
||||||
reloc_pc19(lb->label_ptr[0], (tcg_target_long)s->code_ptr);
|
reloc_pc19(lb->label_ptr[0], (intptr_t)s->code_ptr);
|
||||||
|
|
||||||
tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
|
tcg_out_movr(s, 1, TCG_REG_X0, TCG_AREG0);
|
||||||
tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
|
tcg_out_movr(s, (TARGET_LONG_BITS == 64), TCG_REG_X1, lb->addrlo_reg);
|
||||||
tcg_out_movr(s, 1, TCG_REG_X2, lb->datalo_reg);
|
tcg_out_movr(s, 1, TCG_REG_X2, lb->datalo_reg);
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, lb->mem_index);
|
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, lb->mem_index);
|
||||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_X4, (tcg_target_long)lb->raddr);
|
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_X4, (intptr_t)lb->raddr);
|
||||||
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
|
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP,
|
||||||
(tcg_target_long)qemu_st_helpers[lb->opc & 3]);
|
(intptr_t)qemu_st_helpers[lb->opc & 3]);
|
||||||
tcg_out_callr(s, TCG_REG_TMP);
|
tcg_out_callr(s, TCG_REG_TMP);
|
||||||
|
|
||||||
tcg_out_nop(s);
|
|
||||||
tcg_out_goto(s, (tcg_target_long)lb->raddr);
|
tcg_out_goto(s, (tcg_target_long)lb->raddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -893,7 +878,7 @@ static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg,
|
|||||||
(is_read ? offsetof(CPUTLBEntry, addr_read)
|
(is_read ? offsetof(CPUTLBEntry, addr_read)
|
||||||
: offsetof(CPUTLBEntry, addr_write)));
|
: offsetof(CPUTLBEntry, addr_write)));
|
||||||
/* Perform the address comparison. */
|
/* Perform the address comparison. */
|
||||||
tcg_out_cmp(s, (TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3, 0);
|
tcg_out_cmp(s, (TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3);
|
||||||
*label_ptr = s->code_ptr;
|
*label_ptr = s->code_ptr;
|
||||||
/* If not equal, we jump to the slow path. */
|
/* If not equal, we jump to the slow path. */
|
||||||
tcg_out_goto_cond_noaddr(s, TCG_COND_NE);
|
tcg_out_goto_cond_noaddr(s, TCG_COND_NE);
|
||||||
@@ -1088,16 +1073,23 @@ static inline void tcg_out_load_pair(TCGContext *s, TCGReg addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||||
const TCGArg *args, const int *const_args)
|
const TCGArg args[TCG_MAX_OP_ARGS],
|
||||||
|
const int const_args[TCG_MAX_OP_ARGS])
|
||||||
{
|
{
|
||||||
/* ext will be set in the switch below, which will fall through to the
|
/* 99% of the time, we can signal the use of extension registers
|
||||||
common code. It triggers the use of extended regs where appropriate. */
|
by looking to see if the opcode handles 64-bit data. */
|
||||||
int ext = 0;
|
TCGType ext = (tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0;
|
||||||
|
|
||||||
|
/* Hoist the loads of the most common arguments. */
|
||||||
|
TCGArg a0 = args[0];
|
||||||
|
TCGArg a1 = args[1];
|
||||||
|
TCGArg a2 = args[2];
|
||||||
|
int c2 = const_args[2];
|
||||||
|
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case INDEX_op_exit_tb:
|
case INDEX_op_exit_tb:
|
||||||
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, args[0]);
|
tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, a0);
|
||||||
tcg_out_goto(s, (tcg_target_long)tb_ret_addr);
|
tcg_out_goto(s, (intptr_t)tb_ret_addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_goto_tb:
|
case INDEX_op_goto_tb:
|
||||||
@@ -1105,23 +1097,23 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
|||||||
#error "USE_DIRECT_JUMP required for aarch64"
|
#error "USE_DIRECT_JUMP required for aarch64"
|
||||||
#endif
|
#endif
|
||||||
assert(s->tb_jmp_offset != NULL); /* consistency for USE_DIRECT_JUMP */
|
assert(s->tb_jmp_offset != NULL); /* consistency for USE_DIRECT_JUMP */
|
||||||
s->tb_jmp_offset[args[0]] = s->code_ptr - s->code_buf;
|
s->tb_jmp_offset[a0] = s->code_ptr - s->code_buf;
|
||||||
/* actual branch destination will be patched by
|
/* actual branch destination will be patched by
|
||||||
aarch64_tb_set_jmp_target later, beware retranslation. */
|
aarch64_tb_set_jmp_target later, beware retranslation. */
|
||||||
tcg_out_goto_noaddr(s);
|
tcg_out_goto_noaddr(s);
|
||||||
s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf;
|
s->tb_next_offset[a0] = s->code_ptr - s->code_buf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_call:
|
case INDEX_op_call:
|
||||||
if (const_args[0]) {
|
if (const_args[0]) {
|
||||||
tcg_out_call(s, args[0]);
|
tcg_out_call(s, a0);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_callr(s, args[0]);
|
tcg_out_callr(s, a0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_br:
|
case INDEX_op_br:
|
||||||
tcg_out_goto_label(s, args[0]);
|
tcg_out_goto_label(s, a0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_ld_i32:
|
case INDEX_op_ld_i32:
|
||||||
@@ -1144,123 +1136,95 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
|||||||
case INDEX_op_st16_i64:
|
case INDEX_op_st16_i64:
|
||||||
case INDEX_op_st32_i64:
|
case INDEX_op_st32_i64:
|
||||||
tcg_out_ldst(s, aarch64_ldst_get_data(opc), aarch64_ldst_get_type(opc),
|
tcg_out_ldst(s, aarch64_ldst_get_data(opc), aarch64_ldst_get_type(opc),
|
||||||
args[0], args[1], args[2]);
|
a0, a1, a2);
|
||||||
break;
|
|
||||||
|
|
||||||
case INDEX_op_mov_i64:
|
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_mov_i32:
|
|
||||||
tcg_out_movr(s, ext, args[0], args[1]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case INDEX_op_movi_i64:
|
|
||||||
tcg_out_movi(s, TCG_TYPE_I64, args[0], args[1]);
|
|
||||||
break;
|
|
||||||
case INDEX_op_movi_i32:
|
|
||||||
tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_add_i64:
|
case INDEX_op_add_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_add_i32:
|
case INDEX_op_add_i32:
|
||||||
tcg_out_arith(s, ARITH_ADD, ext, args[0], args[1], args[2], 0);
|
tcg_out_arith(s, ARITH_ADD, ext, a0, a1, a2, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_sub_i64:
|
case INDEX_op_sub_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_sub_i32:
|
case INDEX_op_sub_i32:
|
||||||
tcg_out_arith(s, ARITH_SUB, ext, args[0], args[1], args[2], 0);
|
tcg_out_arith(s, ARITH_SUB, ext, a0, a1, a2, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_and_i64:
|
case INDEX_op_and_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_and_i32:
|
case INDEX_op_and_i32:
|
||||||
tcg_out_arith(s, ARITH_AND, ext, args[0], args[1], args[2], 0);
|
tcg_out_arith(s, ARITH_AND, ext, a0, a1, a2, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_or_i64:
|
case INDEX_op_or_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_or_i32:
|
case INDEX_op_or_i32:
|
||||||
tcg_out_arith(s, ARITH_OR, ext, args[0], args[1], args[2], 0);
|
tcg_out_arith(s, ARITH_OR, ext, a0, a1, a2, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_xor_i64:
|
case INDEX_op_xor_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_xor_i32:
|
case INDEX_op_xor_i32:
|
||||||
tcg_out_arith(s, ARITH_XOR, ext, args[0], args[1], args[2], 0);
|
tcg_out_arith(s, ARITH_XOR, ext, a0, a1, a2, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_mul_i64:
|
case INDEX_op_mul_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_mul_i32:
|
case INDEX_op_mul_i32:
|
||||||
tcg_out_mul(s, ext, args[0], args[1], args[2]);
|
tcg_out_mul(s, ext, a0, a1, a2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_shl_i64:
|
case INDEX_op_shl_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_shl_i32:
|
case INDEX_op_shl_i32:
|
||||||
if (const_args[2]) { /* LSL / UBFM Wd, Wn, (32 - m) */
|
if (c2) { /* LSL / UBFM Wd, Wn, (32 - m) */
|
||||||
tcg_out_shl(s, ext, args[0], args[1], args[2]);
|
tcg_out_shl(s, ext, a0, a1, a2);
|
||||||
} else { /* LSL / LSLV */
|
} else { /* LSL / LSLV */
|
||||||
tcg_out_shiftrot_reg(s, SRR_SHL, ext, args[0], args[1], args[2]);
|
tcg_out_shiftrot_reg(s, SRR_SHL, ext, a0, a1, a2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_shr_i64:
|
case INDEX_op_shr_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_shr_i32:
|
case INDEX_op_shr_i32:
|
||||||
if (const_args[2]) { /* LSR / UBFM Wd, Wn, m, 31 */
|
if (c2) { /* LSR / UBFM Wd, Wn, m, 31 */
|
||||||
tcg_out_shr(s, ext, args[0], args[1], args[2]);
|
tcg_out_shr(s, ext, a0, a1, a2);
|
||||||
} else { /* LSR / LSRV */
|
} else { /* LSR / LSRV */
|
||||||
tcg_out_shiftrot_reg(s, SRR_SHR, ext, args[0], args[1], args[2]);
|
tcg_out_shiftrot_reg(s, SRR_SHR, ext, a0, a1, a2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_sar_i64:
|
case INDEX_op_sar_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_sar_i32:
|
case INDEX_op_sar_i32:
|
||||||
if (const_args[2]) { /* ASR / SBFM Wd, Wn, m, 31 */
|
if (c2) { /* ASR / SBFM Wd, Wn, m, 31 */
|
||||||
tcg_out_sar(s, ext, args[0], args[1], args[2]);
|
tcg_out_sar(s, ext, a0, a1, a2);
|
||||||
} else { /* ASR / ASRV */
|
} else { /* ASR / ASRV */
|
||||||
tcg_out_shiftrot_reg(s, SRR_SAR, ext, args[0], args[1], args[2]);
|
tcg_out_shiftrot_reg(s, SRR_SAR, ext, a0, a1, a2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_rotr_i64:
|
case INDEX_op_rotr_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_rotr_i32:
|
case INDEX_op_rotr_i32:
|
||||||
if (const_args[2]) { /* ROR / EXTR Wd, Wm, Wm, m */
|
if (c2) { /* ROR / EXTR Wd, Wm, Wm, m */
|
||||||
tcg_out_rotr(s, ext, args[0], args[1], args[2]);
|
tcg_out_rotr(s, ext, a0, a1, a2);
|
||||||
} else { /* ROR / RORV */
|
} else { /* ROR / RORV */
|
||||||
tcg_out_shiftrot_reg(s, SRR_ROR, ext, args[0], args[1], args[2]);
|
tcg_out_shiftrot_reg(s, SRR_ROR, ext, a0, a1, a2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_rotl_i64:
|
case INDEX_op_rotl_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_rotl_i32: /* same as rotate right by (32 - m) */
|
case INDEX_op_rotl_i32: /* same as rotate right by (32 - m) */
|
||||||
if (const_args[2]) { /* ROR / EXTR Wd, Wm, Wm, 32 - m */
|
if (c2) { /* ROR / EXTR Wd, Wm, Wm, 32 - m */
|
||||||
tcg_out_rotl(s, ext, args[0], args[1], args[2]);
|
tcg_out_rotl(s, ext, a0, a1, a2);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_arith(s, ARITH_SUB, 0,
|
tcg_out_arith(s, ARITH_SUB, 0, TCG_REG_TMP, TCG_REG_XZR, a2, 0);
|
||||||
TCG_REG_TMP, TCG_REG_XZR, args[2], 0);
|
tcg_out_shiftrot_reg(s, SRR_ROR, ext, a0, a1, TCG_REG_TMP);
|
||||||
tcg_out_shiftrot_reg(s, SRR_ROR, ext,
|
|
||||||
args[0], args[1], TCG_REG_TMP);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_brcond_i64:
|
case INDEX_op_brcond_i64:
|
||||||
ext = 1; /* fall through */
|
case INDEX_op_brcond_i32:
|
||||||
case INDEX_op_brcond_i32: /* CMP 0, 1, cond(2), label 3 */
|
tcg_out_cmp(s, ext, a0, a1);
|
||||||
tcg_out_cmp(s, ext, args[0], args[1], 0);
|
tcg_out_goto_label_cond(s, a2, args[3]);
|
||||||
tcg_out_goto_label_cond(s, args[2], args[3]);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_setcond_i64:
|
case INDEX_op_setcond_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_setcond_i32:
|
case INDEX_op_setcond_i32:
|
||||||
tcg_out_cmp(s, ext, args[1], args[2], 0);
|
tcg_out_cmp(s, ext, a1, a2);
|
||||||
tcg_out_cset(s, 0, args[0], args[3]);
|
tcg_out_cset(s, 0, a0, args[3]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_qemu_ld8u:
|
case INDEX_op_qemu_ld8u:
|
||||||
@@ -1300,44 +1264,50 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
|||||||
tcg_out_qemu_st(s, args, 3);
|
tcg_out_qemu_st(s, args, 3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_bswap64_i64:
|
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_bswap32_i64:
|
case INDEX_op_bswap32_i64:
|
||||||
|
/* Despite the _i64, this is a 32-bit bswap. */
|
||||||
|
ext = 0;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case INDEX_op_bswap64_i64:
|
||||||
case INDEX_op_bswap32_i32:
|
case INDEX_op_bswap32_i32:
|
||||||
tcg_out_rev(s, ext, args[0], args[1]);
|
tcg_out_rev(s, ext, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_bswap16_i64:
|
case INDEX_op_bswap16_i64:
|
||||||
case INDEX_op_bswap16_i32:
|
case INDEX_op_bswap16_i32:
|
||||||
tcg_out_rev16(s, 0, args[0], args[1]);
|
tcg_out_rev16(s, 0, a0, a1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INDEX_op_ext8s_i64:
|
case INDEX_op_ext8s_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_ext8s_i32:
|
case INDEX_op_ext8s_i32:
|
||||||
tcg_out_sxt(s, ext, 0, args[0], args[1]);
|
tcg_out_sxt(s, ext, 0, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ext16s_i64:
|
case INDEX_op_ext16s_i64:
|
||||||
ext = 1; /* fall through */
|
|
||||||
case INDEX_op_ext16s_i32:
|
case INDEX_op_ext16s_i32:
|
||||||
tcg_out_sxt(s, ext, 1, args[0], args[1]);
|
tcg_out_sxt(s, ext, 1, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ext32s_i64:
|
case INDEX_op_ext32s_i64:
|
||||||
tcg_out_sxt(s, 1, 2, args[0], args[1]);
|
tcg_out_sxt(s, 1, 2, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ext8u_i64:
|
case INDEX_op_ext8u_i64:
|
||||||
case INDEX_op_ext8u_i32:
|
case INDEX_op_ext8u_i32:
|
||||||
tcg_out_uxt(s, 0, args[0], args[1]);
|
tcg_out_uxt(s, 0, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ext16u_i64:
|
case INDEX_op_ext16u_i64:
|
||||||
case INDEX_op_ext16u_i32:
|
case INDEX_op_ext16u_i32:
|
||||||
tcg_out_uxt(s, 1, args[0], args[1]);
|
tcg_out_uxt(s, 1, a0, a1);
|
||||||
break;
|
break;
|
||||||
case INDEX_op_ext32u_i64:
|
case INDEX_op_ext32u_i64:
|
||||||
tcg_out_movr(s, 0, args[0], args[1]);
|
tcg_out_movr(s, 0, a0, a1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case INDEX_op_mov_i64:
|
||||||
|
case INDEX_op_mov_i32:
|
||||||
|
case INDEX_op_movi_i64:
|
||||||
|
case INDEX_op_movi_i32:
|
||||||
|
/* Always implemented with tcg_out_mov/i, never with tcg_out_op. */
|
||||||
default:
|
default:
|
||||||
tcg_abort(); /* opcode not implemented */
|
/* Opcode not implemented. */
|
||||||
|
tcg_abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1441,12 +1411,6 @@ static const TCGTargetOpDef aarch64_op_defs[] = {
|
|||||||
|
|
||||||
static void tcg_target_init(TCGContext *s)
|
static void tcg_target_init(TCGContext *s)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
/* fail safe */
|
|
||||||
if ((1ULL << CPU_TLB_ENTRY_BITS) != sizeof(CPUTLBEntry)) {
|
|
||||||
tcg_abort();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
tcg_regset_set32(tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff);
|
tcg_regset_set32(tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff);
|
||||||
tcg_regset_set32(tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff);
|
tcg_regset_set32(tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff);
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -34,7 +34,7 @@ typedef struct {
|
|||||||
gchar *asl; /* asl code generated from aml */
|
gchar *asl; /* asl code generated from aml */
|
||||||
gsize asl_len;
|
gsize asl_len;
|
||||||
gchar *asl_file;
|
gchar *asl_file;
|
||||||
bool asl_file_retain; /* do not delete the temp asl */
|
bool tmp_files_retain; /* do not delete the temp asl/aml */
|
||||||
} QEMU_PACKED AcpiSdtTable;
|
} QEMU_PACKED AcpiSdtTable;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -153,7 +153,8 @@ static void free_test_data(test_data *data)
|
|||||||
g_free(temp->aml);
|
g_free(temp->aml);
|
||||||
}
|
}
|
||||||
if (temp->aml_file) {
|
if (temp->aml_file) {
|
||||||
if (g_strstr_len(temp->aml_file, -1, "aml-")) {
|
if (!temp->tmp_files_retain &&
|
||||||
|
g_strstr_len(temp->aml_file, -1, "aml-")) {
|
||||||
unlink(temp->aml_file);
|
unlink(temp->aml_file);
|
||||||
}
|
}
|
||||||
g_free(temp->aml_file);
|
g_free(temp->aml_file);
|
||||||
@@ -162,7 +163,7 @@ static void free_test_data(test_data *data)
|
|||||||
g_free(temp->asl);
|
g_free(temp->asl);
|
||||||
}
|
}
|
||||||
if (temp->asl_file) {
|
if (temp->asl_file) {
|
||||||
if (!temp->asl_file_retain) {
|
if (!temp->tmp_files_retain) {
|
||||||
unlink(temp->asl_file);
|
unlink(temp->asl_file);
|
||||||
}
|
}
|
||||||
g_free(temp->asl_file);
|
g_free(temp->asl_file);
|
||||||
@@ -410,7 +411,7 @@ static bool compare_signature(AcpiSdtTable *sdt, uint32_t signature)
|
|||||||
return sdt->header.signature == signature;
|
return sdt->header.signature == signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void load_asl(GArray *sdts, AcpiSdtTable *sdt)
|
static bool load_asl(GArray *sdts, AcpiSdtTable *sdt)
|
||||||
{
|
{
|
||||||
AcpiSdtTable *temp;
|
AcpiSdtTable *temp;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
@@ -439,18 +440,22 @@ static void load_asl(GArray *sdts, AcpiSdtTable *sdt)
|
|||||||
g_string_append_printf(command_line, "-d %s", sdt->aml_file);
|
g_string_append_printf(command_line, "-d %s", sdt->aml_file);
|
||||||
|
|
||||||
/* pass 'out' and 'out_err' in order to be redirected */
|
/* pass 'out' and 'out_err' in order to be redirected */
|
||||||
g_spawn_command_line_sync(command_line->str, &out, &out_err, NULL, &error);
|
ret = g_spawn_command_line_sync(command_line->str, &out, &out_err, NULL, &error);
|
||||||
g_assert_no_error(error);
|
g_assert_no_error(error);
|
||||||
|
|
||||||
ret = g_file_get_contents(sdt->asl_file, (gchar **)&sdt->asl,
|
if (ret) {
|
||||||
&sdt->asl_len, &error);
|
ret = g_file_get_contents(sdt->asl_file, (gchar **)&sdt->asl,
|
||||||
g_assert(ret);
|
&sdt->asl_len, &error);
|
||||||
g_assert_no_error(error);
|
g_assert(ret);
|
||||||
g_assert(sdt->asl_len);
|
g_assert_no_error(error);
|
||||||
|
g_assert(sdt->asl_len);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(out);
|
g_free(out);
|
||||||
g_free(out_err);
|
g_free(out_err);
|
||||||
g_string_free(command_line, true);
|
g_string_free(command_line, true);
|
||||||
|
|
||||||
|
return !ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define COMMENT_END "*/"
|
#define COMMENT_END "*/"
|
||||||
@@ -517,6 +522,7 @@ static void test_acpi_asl(test_data *data)
|
|||||||
int i;
|
int i;
|
||||||
AcpiSdtTable *sdt, *exp_sdt;
|
AcpiSdtTable *sdt, *exp_sdt;
|
||||||
test_data exp_data;
|
test_data exp_data;
|
||||||
|
gboolean exp_err, err;
|
||||||
|
|
||||||
memset(&exp_data, 0, sizeof(exp_data));
|
memset(&exp_data, 0, sizeof(exp_data));
|
||||||
exp_data.tables = load_expected_aml(data);
|
exp_data.tables = load_expected_aml(data);
|
||||||
@@ -527,20 +533,24 @@ static void test_acpi_asl(test_data *data)
|
|||||||
sdt = &g_array_index(data->tables, AcpiSdtTable, i);
|
sdt = &g_array_index(data->tables, AcpiSdtTable, i);
|
||||||
exp_sdt = &g_array_index(exp_data.tables, AcpiSdtTable, i);
|
exp_sdt = &g_array_index(exp_data.tables, AcpiSdtTable, i);
|
||||||
|
|
||||||
load_asl(data->tables, sdt);
|
err = load_asl(data->tables, sdt);
|
||||||
asl = normalize_asl(sdt->asl);
|
asl = normalize_asl(sdt->asl);
|
||||||
|
|
||||||
load_asl(exp_data.tables, exp_sdt);
|
exp_err = load_asl(exp_data.tables, exp_sdt);
|
||||||
exp_asl = normalize_asl(exp_sdt->asl);
|
exp_asl = normalize_asl(exp_sdt->asl);
|
||||||
|
|
||||||
|
/* TODO: check for warnings */
|
||||||
|
g_assert(!err || exp_err);
|
||||||
|
|
||||||
if (g_strcmp0(asl->str, exp_asl->str)) {
|
if (g_strcmp0(asl->str, exp_asl->str)) {
|
||||||
sdt->asl_file_retain = true;
|
sdt->tmp_files_retain = true;
|
||||||
exp_sdt->asl_file_retain = true;
|
exp_sdt->tmp_files_retain = true;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"acpi-test: Warning! %.4s mismatch. "
|
"acpi-test: Warning! %.4s mismatch. "
|
||||||
"Orig asl: %s, expected asl %s.\n",
|
"Actual [asl:%s, aml:%s], Expected [asl:%s, aml:%s].\n",
|
||||||
(gchar *)&exp_sdt->header.signature,
|
(gchar *)&exp_sdt->header.signature,
|
||||||
sdt->asl_file, exp_sdt->asl_file);
|
sdt->asl_file, sdt->aml_file,
|
||||||
|
exp_sdt->asl_file, exp_sdt->aml_file);
|
||||||
}
|
}
|
||||||
g_string_free(asl, true);
|
g_string_free(asl, true);
|
||||||
g_string_free(exp_asl, true);
|
g_string_free(exp_asl, true);
|
||||||
|
@@ -140,7 +140,7 @@ static void do_spawn_thread(ThreadPool *pool)
|
|||||||
pool->new_threads--;
|
pool->new_threads--;
|
||||||
pool->pending_threads++;
|
pool->pending_threads++;
|
||||||
|
|
||||||
qemu_thread_create(&t, worker_thread, pool, QEMU_THREAD_DETACHED);
|
qemu_thread_create(&t, "worker", worker_thread, pool, QEMU_THREAD_DETACHED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spawn_thread_bh_fn(void *opaque)
|
static void spawn_thread_bh_fn(void *opaque)
|
||||||
|
@@ -486,6 +486,7 @@ runstate_set(int new_state) "new state %d"
|
|||||||
g_malloc(size_t size, void *ptr) "size %zu ptr %p"
|
g_malloc(size_t size, void *ptr) "size %zu ptr %p"
|
||||||
g_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
|
g_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
|
||||||
g_free(void *ptr) "ptr %p"
|
g_free(void *ptr) "ptr %p"
|
||||||
|
system_wakeup_request(int reason) "reason=%d"
|
||||||
|
|
||||||
# block/qcow2.c
|
# block/qcow2.c
|
||||||
qcow2_writev_start_req(void *co, int64_t sector, int nb_sectors) "co %p sector %" PRIx64 " nb_sectors %d"
|
qcow2_writev_start_req(void *co, int64_t sector, int nb_sectors) "co %p sector %" PRIx64 " nb_sectors %d"
|
||||||
@@ -1039,8 +1040,8 @@ vmware_scratch_write(uint32_t index, uint32_t value) "index %d, value 0x%x"
|
|||||||
vmware_setmode(uint32_t w, uint32_t h, uint32_t bpp) "%dx%d @ %d bpp"
|
vmware_setmode(uint32_t w, uint32_t h, uint32_t bpp) "%dx%d @ %d bpp"
|
||||||
|
|
||||||
# savevm.c
|
# savevm.c
|
||||||
savevm_section_start(void) ""
|
savevm_section_start(const char *id, unsigned int section_id) "%s, section_id %u"
|
||||||
savevm_section_end(unsigned int section_id) "section_id %u"
|
savevm_section_end(const char *id, unsigned int section_id) "%s, section_id %u"
|
||||||
|
|
||||||
# arch_init.c
|
# arch_init.c
|
||||||
migration_bitmap_sync_start(void) ""
|
migration_bitmap_sync_start(void) ""
|
||||||
|
@@ -359,6 +359,20 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
|
|||||||
} else {
|
} else {
|
||||||
s->buttons &= ~bmap[evt->btn->button];
|
s->buttons &= ~bmap[evt->btn->button];
|
||||||
}
|
}
|
||||||
|
if (evt->btn->down && evt->btn->button == INPUT_BUTTON_WHEEL_UP) {
|
||||||
|
s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
|
||||||
|
s->axis[INPUT_AXIS_X],
|
||||||
|
s->axis[INPUT_AXIS_Y],
|
||||||
|
-1,
|
||||||
|
s->buttons);
|
||||||
|
}
|
||||||
|
if (evt->btn->down && evt->btn->button == INPUT_BUTTON_WHEEL_DOWN) {
|
||||||
|
s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
|
||||||
|
s->axis[INPUT_AXIS_X],
|
||||||
|
s->axis[INPUT_AXIS_Y],
|
||||||
|
1,
|
||||||
|
s->buttons);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case INPUT_EVENT_KIND_ABS:
|
case INPUT_EVENT_KIND_ABS:
|
||||||
s->axis[evt->abs->axis] = evt->abs->value;
|
s->axis[evt->abs->axis] = evt->abs->value;
|
||||||
|
18
ui/sdl.c
18
ui/sdl.c
@@ -455,13 +455,17 @@ static void sdl_send_mouse_event(int dx, int dy, int x, int y, int state)
|
|||||||
real_screen->w);
|
real_screen->w);
|
||||||
qemu_input_queue_abs(dcl->con, INPUT_AXIS_Y, y,
|
qemu_input_queue_abs(dcl->con, INPUT_AXIS_Y, y,
|
||||||
real_screen->h);
|
real_screen->h);
|
||||||
} else if (guest_cursor) {
|
} else {
|
||||||
x -= guest_x;
|
if (guest_cursor) {
|
||||||
y -= guest_y;
|
x -= guest_x;
|
||||||
guest_x += x;
|
y -= guest_y;
|
||||||
guest_y += y;
|
guest_x += x;
|
||||||
qemu_input_queue_rel(dcl->con, INPUT_AXIS_X, x);
|
guest_y += y;
|
||||||
qemu_input_queue_rel(dcl->con, INPUT_AXIS_Y, y);
|
dx = x;
|
||||||
|
dy = y;
|
||||||
|
}
|
||||||
|
qemu_input_queue_rel(dcl->con, INPUT_AXIS_X, dx);
|
||||||
|
qemu_input_queue_rel(dcl->con, INPUT_AXIS_Y, dy);
|
||||||
}
|
}
|
||||||
qemu_input_event_sync();
|
qemu_input_event_sync();
|
||||||
}
|
}
|
||||||
|
@@ -354,6 +354,7 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
|
|||||||
DisplaySurface *surface)
|
DisplaySurface *surface)
|
||||||
{
|
{
|
||||||
SimpleSpiceUpdate *update;
|
SimpleSpiceUpdate *update;
|
||||||
|
bool need_destroy;
|
||||||
|
|
||||||
dprint(1, "%s/%d:\n", __func__, ssd->qxl.id);
|
dprint(1, "%s/%d:\n", __func__, ssd->qxl.id);
|
||||||
|
|
||||||
@@ -366,14 +367,19 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
qemu_mutex_lock(&ssd->lock);
|
qemu_mutex_lock(&ssd->lock);
|
||||||
|
need_destroy = (ssd->ds != NULL);
|
||||||
ssd->ds = surface;
|
ssd->ds = surface;
|
||||||
while ((update = QTAILQ_FIRST(&ssd->updates)) != NULL) {
|
while ((update = QTAILQ_FIRST(&ssd->updates)) != NULL) {
|
||||||
QTAILQ_REMOVE(&ssd->updates, update, next);
|
QTAILQ_REMOVE(&ssd->updates, update, next);
|
||||||
qemu_spice_destroy_update(ssd, update);
|
qemu_spice_destroy_update(ssd, update);
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&ssd->lock);
|
qemu_mutex_unlock(&ssd->lock);
|
||||||
qemu_spice_destroy_host_primary(ssd);
|
if (need_destroy) {
|
||||||
qemu_spice_create_host_primary(ssd);
|
qemu_spice_destroy_host_primary(ssd);
|
||||||
|
}
|
||||||
|
if (ssd->ds) {
|
||||||
|
qemu_spice_create_host_primary(ssd);
|
||||||
|
}
|
||||||
|
|
||||||
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
|
||||||
ssd->notify++;
|
ssd->notify++;
|
||||||
@@ -537,10 +543,29 @@ static void interface_set_client_capabilities(QXLInstance *sin,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int interface_client_monitors_config(QXLInstance *sin,
|
static int interface_client_monitors_config(QXLInstance *sin,
|
||||||
VDAgentMonitorsConfig *monitors_config)
|
VDAgentMonitorsConfig *mc)
|
||||||
{
|
{
|
||||||
dprint(3, "%s:\n", __func__);
|
SimpleSpiceDisplay *ssd = container_of(sin, SimpleSpiceDisplay, qxl);
|
||||||
return 0; /* == not supported by guest */
|
QemuUIInfo info;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME: multihead is tricky due to the way
|
||||||
|
* spice has multihead implemented.
|
||||||
|
*/
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
if (mc->num_of_monitors > 0) {
|
||||||
|
info.width = mc->monitors[0].width;
|
||||||
|
info.height = mc->monitors[0].height;
|
||||||
|
}
|
||||||
|
rc = dpy_set_ui_info(ssd->dcl.con, &info);
|
||||||
|
dprint(1, "%s/%d: size %dx%d, rc %d <--- ==========================\n",
|
||||||
|
__func__, ssd->qxl.id, info.width, info.height, rc);
|
||||||
|
if (rc != 0) {
|
||||||
|
return 0; /* == not supported by guest */
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const QXLInterface dpy_interface = {
|
static const QXLInterface dpy_interface = {
|
||||||
@@ -610,8 +635,6 @@ static void qemu_spice_display_init_one(QemuConsole *con)
|
|||||||
ssd->dcl.ops = &display_listener_ops;
|
ssd->dcl.ops = &display_listener_ops;
|
||||||
ssd->dcl.con = con;
|
ssd->dcl.con = con;
|
||||||
register_displaychangelistener(&ssd->dcl);
|
register_displaychangelistener(&ssd->dcl);
|
||||||
|
|
||||||
qemu_spice_create_host_primary(ssd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_spice_display_init(void)
|
void qemu_spice_display_init(void)
|
||||||
|
@@ -338,7 +338,8 @@ void vnc_start_worker_thread(void)
|
|||||||
return ;
|
return ;
|
||||||
|
|
||||||
q = vnc_queue_init();
|
q = vnc_queue_init();
|
||||||
qemu_thread_create(&q->thread, vnc_worker_thread, q, QEMU_THREAD_DETACHED);
|
qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, q,
|
||||||
|
QEMU_THREAD_DETACHED);
|
||||||
queue = q; /* Set global queue */
|
queue = q; /* Set global queue */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,7 +88,8 @@ static int qemu_signalfd_compat(const sigset_t *mask)
|
|||||||
memcpy(&info->mask, mask, sizeof(*mask));
|
memcpy(&info->mask, mask, sizeof(*mask));
|
||||||
info->fd = fds[1];
|
info->fd = fds[1];
|
||||||
|
|
||||||
qemu_thread_create(&thread, sigwait_compat, info, QEMU_THREAD_DETACHED);
|
qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, info,
|
||||||
|
QEMU_THREAD_DETACHED);
|
||||||
|
|
||||||
return fds[0];
|
return fds[0];
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,13 @@
|
|||||||
#include "qemu/thread.h"
|
#include "qemu/thread.h"
|
||||||
#include "qemu/atomic.h"
|
#include "qemu/atomic.h"
|
||||||
|
|
||||||
|
static bool name_threads;
|
||||||
|
|
||||||
|
void qemu_thread_naming(bool enable)
|
||||||
|
{
|
||||||
|
name_threads = enable;
|
||||||
|
}
|
||||||
|
|
||||||
static void error_exit(int err, const char *msg)
|
static void error_exit(int err, const char *msg)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err));
|
fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err));
|
||||||
@@ -387,8 +394,7 @@ void qemu_event_wait(QemuEvent *ev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_thread_create(QemuThread *thread, const char *name,
|
||||||
void qemu_thread_create(QemuThread *thread,
|
|
||||||
void *(*start_routine)(void*),
|
void *(*start_routine)(void*),
|
||||||
void *arg, int mode)
|
void *arg, int mode)
|
||||||
{
|
{
|
||||||
@@ -414,6 +420,12 @@ void qemu_thread_create(QemuThread *thread,
|
|||||||
if (err)
|
if (err)
|
||||||
error_exit(err, __func__);
|
error_exit(err, __func__);
|
||||||
|
|
||||||
|
#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12))
|
||||||
|
if (name_threads) {
|
||||||
|
pthread_setname_np(thread->thread, name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
|
||||||
|
|
||||||
pthread_attr_destroy(&attr);
|
pthread_attr_destroy(&attr);
|
||||||
|
@@ -16,6 +16,14 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
static bool name_threads;
|
||||||
|
|
||||||
|
void qemu_thread_naming(bool enable)
|
||||||
|
{
|
||||||
|
/* But note we don't actually name them on Windows yet */
|
||||||
|
name_threads = enable;
|
||||||
|
}
|
||||||
|
|
||||||
static void error_exit(int err, const char *msg)
|
static void error_exit(int err, const char *msg)
|
||||||
{
|
{
|
||||||
char *pstr;
|
char *pstr;
|
||||||
@@ -325,7 +333,7 @@ void *qemu_thread_join(QemuThread *thread)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_thread_create(QemuThread *thread,
|
void qemu_thread_create(QemuThread *thread, const char *name,
|
||||||
void *(*start_routine)(void *),
|
void *(*start_routine)(void *),
|
||||||
void *arg, int mode)
|
void *arg, int mode)
|
||||||
{
|
{
|
||||||
|
63
vl.c
63
vl.c
@@ -479,6 +479,33 @@ static QemuOptsList qemu_msg_opts = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static QemuOptsList qemu_name_opts = {
|
||||||
|
.name = "name",
|
||||||
|
.implied_opt_name = "guest",
|
||||||
|
.merge_lists = true,
|
||||||
|
.head = QTAILQ_HEAD_INITIALIZER(qemu_name_opts.head),
|
||||||
|
.desc = {
|
||||||
|
{
|
||||||
|
.name = "guest",
|
||||||
|
.type = QEMU_OPT_STRING,
|
||||||
|
.help = "Sets the name of the guest.\n"
|
||||||
|
"This name will be displayed in the SDL window caption.\n"
|
||||||
|
"The name will also be used for the VNC server",
|
||||||
|
}, {
|
||||||
|
.name = "process",
|
||||||
|
.type = QEMU_OPT_STRING,
|
||||||
|
.help = "Sets the name of the QEMU process, as shown in top etc",
|
||||||
|
}, {
|
||||||
|
.name = "debug-threads",
|
||||||
|
.type = QEMU_OPT_BOOL,
|
||||||
|
.help = "When enabled, name the individual threads; defaults off.\n"
|
||||||
|
"NOTE: The thread names are for debugging and not a\n"
|
||||||
|
"stable API.",
|
||||||
|
},
|
||||||
|
{ /* End of list */ }
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get machine options
|
* Get machine options
|
||||||
*
|
*
|
||||||
@@ -929,6 +956,21 @@ static int parse_sandbox(QemuOpts *opts, void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_name(QemuOpts *opts)
|
||||||
|
{
|
||||||
|
const char *proc_name;
|
||||||
|
|
||||||
|
if (qemu_opt_get(opts, "debug-threads")) {
|
||||||
|
qemu_thread_naming(qemu_opt_get_bool(opts, "debug-threads", false));
|
||||||
|
}
|
||||||
|
qemu_name = qemu_opt_get(opts, "guest");
|
||||||
|
|
||||||
|
proc_name = qemu_opt_get(opts, "process");
|
||||||
|
if (proc_name) {
|
||||||
|
os_set_proc_name(proc_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool usb_enabled(bool default_usb)
|
bool usb_enabled(bool default_usb)
|
||||||
{
|
{
|
||||||
return qemu_opt_get_bool(qemu_get_machine_opts(), "usb", default_usb);
|
return qemu_opt_get_bool(qemu_get_machine_opts(), "usb", default_usb);
|
||||||
@@ -1837,6 +1879,8 @@ void qemu_register_suspend_notifier(Notifier *notifier)
|
|||||||
|
|
||||||
void qemu_system_wakeup_request(WakeupReason reason)
|
void qemu_system_wakeup_request(WakeupReason reason)
|
||||||
{
|
{
|
||||||
|
trace_system_wakeup_request(reason);
|
||||||
|
|
||||||
if (!runstate_check(RUN_STATE_SUSPENDED)) {
|
if (!runstate_check(RUN_STATE_SUSPENDED)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2887,6 +2931,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
qemu_add_opts(&qemu_tpmdev_opts);
|
qemu_add_opts(&qemu_tpmdev_opts);
|
||||||
qemu_add_opts(&qemu_realtime_opts);
|
qemu_add_opts(&qemu_realtime_opts);
|
||||||
qemu_add_opts(&qemu_msg_opts);
|
qemu_add_opts(&qemu_msg_opts);
|
||||||
|
qemu_add_opts(&qemu_name_opts);
|
||||||
|
|
||||||
runstate_init();
|
runstate_init();
|
||||||
|
|
||||||
@@ -3632,19 +3677,11 @@ int main(int argc, char **argv, char **envp)
|
|||||||
"is no longer supported.\n");
|
"is no longer supported.\n");
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_name:
|
case QEMU_OPTION_name:
|
||||||
qemu_name = g_strdup(optarg);
|
opts = qemu_opts_parse(qemu_find_opts("name"), optarg, 1);
|
||||||
{
|
if (!opts) {
|
||||||
char *p = strchr(qemu_name, ',');
|
exit(1);
|
||||||
if (p != NULL) {
|
}
|
||||||
*p++ = 0;
|
parse_name(opts);
|
||||||
if (strncmp(p, "process=", 8)) {
|
|
||||||
fprintf(stderr, "Unknown subargument %s to -name\n", p);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
p += 8;
|
|
||||||
os_set_proc_name(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_prom_env:
|
case QEMU_OPTION_prom_env:
|
||||||
if (nb_prom_envs >= MAX_PROM_ENVS) {
|
if (nb_prom_envs >= MAX_PROM_ENVS) {
|
||||||
|
Reference in New Issue
Block a user