Compare commits
265 Commits
qemu-sparc
...
qemu-openb
Author | SHA1 | Date | |
---|---|---|---|
|
e9deadb1c1 | ||
|
0266c739ab | ||
|
0d3e41d5ef | ||
|
ba63292445 | ||
|
db37850bb4 | ||
|
fc76f48667 | ||
|
afdc3c515a | ||
|
b62592ab65 | ||
|
85c2a39300 | ||
|
08857c882d | ||
|
d33f672861 | ||
|
51a0e80c6e | ||
|
0454728c22 | ||
|
f5117fd285 | ||
|
41931c0137 | ||
|
215581bdf1 | ||
|
33a07fa2db | ||
|
c7c7e1e9a5 | ||
|
16abfb36c5 | ||
|
7e407466b1 | ||
|
c4c5f6573a | ||
|
4856c2c70c | ||
|
96566d09aa | ||
|
9aed808e35 | ||
|
c1a00ff85b | ||
|
8beaac1228 | ||
|
876d16cd31 | ||
|
66363e9a43 | ||
|
65b182c379 | ||
|
2911b3d3ab | ||
|
190ff53829 | ||
|
604a5b9978 | ||
|
8de73fa88a | ||
|
41b0b34b26 | ||
|
e6e40f80cd | ||
|
b5ec7de7b5 | ||
|
58823a0b48 | ||
|
f7ea2038be | ||
|
f8278c7d74 | ||
|
64c3f266dd | ||
|
b1f1103dba | ||
|
3d9e232240 | ||
|
129263c6c0 | ||
|
4ad6f6cb14 | ||
|
42824b4d16 | ||
|
adf1add292 | ||
|
fdbfba8cbf | ||
|
cb82c5728c | ||
|
60e29463bb | ||
|
b47a4a0290 | ||
|
df0232fe3d | ||
|
5010e5c4f4 | ||
|
31274b46e4 | ||
|
1ca74648f1 | ||
|
c3bad4f839 | ||
|
96927adb8d | ||
|
e8777db7aa | ||
|
740038d7f5 | ||
|
0588e061dc | ||
|
8340f5341e | ||
|
30878590bc | ||
|
01afb7be33 | ||
|
b1e2af576a | ||
|
1cd012a5f7 | ||
|
0c982a2817 | ||
|
deee69a19f | ||
|
7aee8189ad | ||
|
e36f27effb | ||
|
c603e14aef | ||
|
40f9f908ef | ||
|
312347683c | ||
|
211ef6c4b6 | ||
|
9baa6802fe | ||
|
4b47373a0d | ||
|
d1885e549d | ||
|
25d93b6a11 | ||
|
32423ccaa1 | ||
|
b5e18e5149 | ||
|
efae0b9202 | ||
|
e154fd7991 | ||
|
0bf62dc89e | ||
|
5981c3a232 | ||
|
767abe7f49 | ||
|
4a0582f656 | ||
|
1645984b04 | ||
|
dbb44504c2 | ||
|
52d6cfeca2 | ||
|
68cf36a7ea | ||
|
7a9657ef53 | ||
|
0b5e750bea | ||
|
d85e60e993 | ||
|
9a6719d572 | ||
|
6eaa20c836 | ||
|
6c95363d97 | ||
|
40e46e516d | ||
|
ff9f31d9a0 | ||
|
7d04ac3895 | ||
|
f18637cd61 | ||
|
d77c3401e6 | ||
|
db9f3fd69d | ||
|
d75377bf7b | ||
|
fb73883964 | ||
|
7f2b5ff125 | ||
|
533b8f8877 | ||
|
83a7171990 | ||
|
ddd113beed | ||
|
b8968c875f | ||
|
1bf6e9ca92 | ||
|
269ee27e99 | ||
|
22c5f44651 | ||
|
6d967cb86d | ||
|
ae56a2ff92 | ||
|
3115584d39 | ||
|
bef16ab4e6 | ||
|
a044e3de29 | ||
|
920fff9093 | ||
|
29c33cc107 | ||
|
2d4e4c01b1 | ||
|
ddafa31fae | ||
|
5c2ec9b61f | ||
|
a4cefbcd9b | ||
|
bd1497dc87 | ||
|
432d8ad5f6 | ||
|
d10404b193 | ||
|
43c898b75a | ||
|
7e81d19840 | ||
|
d6db2a1cdf | ||
|
d3b442654c | ||
|
54dbfd8504 | ||
|
f3908ff792 | ||
|
570f3c7728 | ||
|
83c3d1b417 | ||
|
7162fbb451 | ||
|
e47f81b617 | ||
|
ff372bb5c4 | ||
|
d55451dcde | ||
|
4f0444fc68 | ||
|
632351e0e1 | ||
|
ee261c0233 | ||
|
3e0fad3aa5 | ||
|
deaeb3f71d | ||
|
6e513a78ea | ||
|
1ab67b98cd | ||
|
625a526b32 | ||
|
d7df0b41dc | ||
|
a9d8b3ec43 | ||
|
4ffa6325d1 | ||
|
85a0e43c45 | ||
|
918f38d037 | ||
|
c1c5c0ff9e | ||
|
e44203db9d | ||
|
759c5a6ab5 | ||
|
d1c4b3e97d | ||
|
ba1be96531 | ||
|
35ee75f343 | ||
|
268c95d771 | ||
|
c21d959440 | ||
|
f6e5aa366f | ||
|
848c7092ba | ||
|
707bd47ef3 | ||
|
9032941640 | ||
|
7fce71723b | ||
|
07abf6d43a | ||
|
8e207c327c | ||
|
8d45a3b946 | ||
|
3624730a32 | ||
|
44b4ff2488 | ||
|
aaa0c642b1 | ||
|
c74e3ae9c8 | ||
|
59fa06ac74 | ||
|
0f5faca782 | ||
|
9d0bd0cdd0 | ||
|
22e4a267a6 | ||
|
1dca054955 | ||
|
713acc316d | ||
|
e67e91b4b5 | ||
|
dab864dc76 | ||
|
4a1335e8df | ||
|
d5b661e676 | ||
|
e633a5c661 | ||
|
e17bebd049 | ||
|
70c9483a30 | ||
|
1dcb3c3b7d | ||
|
68aa851aa2 | ||
|
5c41496dd7 | ||
|
84b41e658b | ||
|
9fd9b7de61 | ||
|
7400d6938c | ||
|
3e29da9fd8 | ||
|
5ed76a4c63 | ||
|
5685349864 | ||
|
59ee950002 | ||
|
473ac56706 | ||
|
26dc4a5bf9 | ||
|
f5ce0a5f5a | ||
|
8e6578831b | ||
|
85e4dcf18d | ||
|
4575bbb4c8 | ||
|
f0975e8f20 | ||
|
714e74621e | ||
|
034c344e30 | ||
|
31be0a43b9 | ||
|
04aa5abc6a | ||
|
3fa86eb366 | ||
|
fa83f64855 | ||
|
d84929da9a | ||
|
27f3ac3fa6 | ||
|
f96c37821f | ||
|
bc0c93eab2 | ||
|
774afd9f50 | ||
|
ee279c4608 | ||
|
ebd76795d4 | ||
|
268dfefa69 | ||
|
48a166cf1d | ||
|
abab3fdeef | ||
|
80500ce637 | ||
|
91b82fec16 | ||
|
5afdd57ca0 | ||
|
e01ee04f8b | ||
|
83d14054f9 | ||
|
d9bf2c5535 | ||
|
9fd7e96aab | ||
|
292fa230cb | ||
|
e909ff9369 | ||
|
7b0f97bade | ||
|
1edead0f72 | ||
|
dce5874fc7 | ||
|
aab50e5344 | ||
|
06e0259a7c | ||
|
1f40547f5c | ||
|
0c249ff71c | ||
|
b86d01ba47 | ||
|
2f9f96b242 | ||
|
82e870bac4 | ||
|
1b9d35f33c | ||
|
6ec6e988fb | ||
|
4591f4ceef | ||
|
4ea1a21d84 | ||
|
bd4d0da7db | ||
|
e53f3466e3 | ||
|
c29b48db1d | ||
|
712f807e19 | ||
|
4c257911dc | ||
|
76e5a4d583 | ||
|
fda672b50e | ||
|
b1b876ca70 | ||
|
1fb0d70990 | ||
|
2785dc7b17 | ||
|
6dfa01437b | ||
|
526d798435 | ||
|
c5bf7847b7 | ||
|
ab969087da | ||
|
20a965067f | ||
|
696aa04c84 | ||
|
4366e1db16 | ||
|
d455ebc4f8 | ||
|
d99e97e691 | ||
|
6aaa24f9d4 | ||
|
8fd3a9b81d | ||
|
2a11ee1019 | ||
|
bae6b59d46 | ||
|
3b72ca381f | ||
|
5a583cc555 | ||
|
acca950ccd | ||
|
04ad1bf68e |
16
.cirrus.yml
Normal file
16
.cirrus.yml
Normal file
@@ -0,0 +1,16 @@
|
||||
freebsd_12_task:
|
||||
freebsd_instance:
|
||||
image: freebsd-12-0-release-amd64
|
||||
cpu: 8
|
||||
memory: 8G
|
||||
env:
|
||||
CIRRUS_CLONE_DEPTH: 1
|
||||
install_script: pkg install -y
|
||||
bison curl cyrus-sasl git glib gmake gnutls
|
||||
nettle perl5 pixman pkgconf png usbredir
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure || { cat config.log; exit 1; }
|
||||
- gmake -j8
|
||||
- gmake -j8 V=1 check
|
4
.gitignore
vendored
4
.gitignore
vendored
@@ -103,6 +103,10 @@
|
||||
/pc-bios/optionrom/linuxboot_dma.bin
|
||||
/pc-bios/optionrom/linuxboot_dma.raw
|
||||
/pc-bios/optionrom/linuxboot_dma.img
|
||||
/pc-bios/optionrom/pvh.asm
|
||||
/pc-bios/optionrom/pvh.bin
|
||||
/pc-bios/optionrom/pvh.raw
|
||||
/pc-bios/optionrom/pvh.img
|
||||
/pc-bios/optionrom/multiboot.asm
|
||||
/pc-bios/optionrom/multiboot.bin
|
||||
/pc-bios/optionrom/multiboot.raw
|
||||
|
31
.travis.yml
31
.travis.yml
@@ -40,8 +40,6 @@ addons:
|
||||
- gcovr
|
||||
homebrew:
|
||||
packages:
|
||||
- libffi
|
||||
- gettext
|
||||
- glib
|
||||
- pixman
|
||||
|
||||
@@ -61,6 +59,7 @@ env:
|
||||
global:
|
||||
- SRC_DIR="."
|
||||
- BUILD_DIR="."
|
||||
- BASE_CONFIG="--disable-docs --disable-tools"
|
||||
- TEST_CMD="make check -j3 V=1"
|
||||
|
||||
|
||||
@@ -71,7 +70,7 @@ git:
|
||||
|
||||
before_script:
|
||||
- mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR}
|
||||
- ${SRC_DIR}/configure ${CONFIG} || { cat config.log && exit 1; }
|
||||
- ${SRC_DIR}/configure ${BASE_CONFIG} ${CONFIG} || { cat config.log && exit 1; }
|
||||
script:
|
||||
- make -j3 && ${TEST_CMD}
|
||||
|
||||
@@ -98,14 +97,29 @@ matrix:
|
||||
- CONFIG="--enable-modules --disable-linux-user"
|
||||
|
||||
|
||||
# Alternate coroutines implementations are only really of interest to KVM users
|
||||
# However we can't test against KVM on Travis so we can only run unit tests
|
||||
- env:
|
||||
- CONFIG="--with-coroutine=ucontext --disable-linux-user"
|
||||
- CONFIG="--with-coroutine=ucontext --disable-tcg"
|
||||
- TEST_CMD="make check-unit -j3 V=1"
|
||||
|
||||
|
||||
- env:
|
||||
- CONFIG="--with-coroutine=sigaltstack --disable-linux-user"
|
||||
- CONFIG="--with-coroutine=sigaltstack --disable-tcg"
|
||||
- TEST_CMD="make check-unit -j3 V=1"
|
||||
|
||||
|
||||
# Check we can build docs and tools
|
||||
- env:
|
||||
- BASE_CONFIG="--enable-tools --enable-docs"
|
||||
- CONFIG="--target-list=x86_64-softmmu,aarch64-linux-user"
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- python-sphinx
|
||||
- texinfo
|
||||
- perl
|
||||
|
||||
# Test out-of-tree builds
|
||||
- env:
|
||||
- CONFIG="--enable-debug --enable-debug-tcg"
|
||||
@@ -152,11 +166,6 @@ matrix:
|
||||
- TEST_CMD=""
|
||||
|
||||
|
||||
- env:
|
||||
- CONFIG="--disable-tcg"
|
||||
- TEST_CMD=""
|
||||
|
||||
|
||||
# MacOSX builds
|
||||
- env:
|
||||
- CONFIG="--target-list=aarch64-softmmu,arm-softmmu,i386-softmmu,mips-softmmu,mips64-softmmu,ppc64-softmmu,riscv64-softmmu,s390x-softmmu,x86_64-softmmu"
|
||||
@@ -243,5 +252,5 @@ matrix:
|
||||
|
||||
|
||||
- env:
|
||||
- CONFIG="--disable-system --disable-docs"
|
||||
- CONFIG="--disable-system"
|
||||
- TEST_CMD="make -j3 check-tcg V=1"
|
||||
|
10
MAINTAINERS
10
MAINTAINERS
@@ -259,7 +259,6 @@ F: include/hw/ppc/
|
||||
F: disas/ppc.c
|
||||
|
||||
RISC-V
|
||||
M: Michael Clark <mjc@sifive.com>
|
||||
M: Palmer Dabbelt <palmer@sifive.com>
|
||||
M: Alistair Francis <Alistair.Francis@wdc.com>
|
||||
M: Sagar Karandikar <sagark@eecs.berkeley.edu>
|
||||
@@ -2471,10 +2470,19 @@ F: scripts/travis/
|
||||
F: .shippable.yml
|
||||
F: tests/docker/
|
||||
F: tests/vm/
|
||||
F: scripts/archive-source.sh
|
||||
W: https://travis-ci.org/qemu/qemu
|
||||
W: https://app.shippable.com/github/qemu/qemu
|
||||
W: http://patchew.org/QEMU/
|
||||
|
||||
FreeBSD Hosted Continuous Integration
|
||||
M: Ed Maste <emaste@freebsd.org>
|
||||
M: Li-Wen Hsu <lwhsu@freebsd.org>
|
||||
L: qemu-devel@nongnu.org
|
||||
S: Maintained
|
||||
F: .cirrus.yml
|
||||
W: https://cirrus-ci.com/github/qemu/qemu
|
||||
|
||||
Guest Test Compilation Support
|
||||
M: Alex Bennée <alex.bennee@linaro.org>
|
||||
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
|
6
Makefile
6
Makefile
@@ -570,8 +570,8 @@ ifneq ($(EXESUF),)
|
||||
qemu-ga: qemu-ga$(EXESUF) $(QGA_VSS_PROVIDER) $(QEMU_GA_MSI)
|
||||
endif
|
||||
|
||||
elf2dmp: LIBS = $(CURL_LIBS)
|
||||
elf2dmp: $(elf2dmp-obj-y)
|
||||
elf2dmp$(EXESUF): LIBS += $(CURL_LIBS)
|
||||
elf2dmp$(EXESUF): $(elf2dmp-obj-y)
|
||||
$(call LINK, $^)
|
||||
|
||||
ifdef CONFIG_IVSHMEM
|
||||
@@ -673,7 +673,7 @@ efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
|
||||
efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
|
||||
efi-e1000e.rom efi-vmxnet3.rom \
|
||||
bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
|
||||
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
|
||||
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin \
|
||||
s390-ccw.img s390-netboot.img \
|
||||
spapr-rtas.bin slof.bin skiboot.lid \
|
||||
palcode-clipper \
|
||||
|
@@ -192,7 +192,6 @@ trace-events-subdirs += net
|
||||
trace-events-subdirs += qapi
|
||||
trace-events-subdirs += qom
|
||||
trace-events-subdirs += scsi
|
||||
trace-events-subdirs += slirp
|
||||
trace-events-subdirs += target/arm
|
||||
trace-events-subdirs += target/i386
|
||||
trace-events-subdirs += target/mips
|
||||
|
@@ -657,6 +657,8 @@ static int kvm_set_ioeventfd_mmio(int fd, hwaddr addr, uint32_t val,
|
||||
.fd = fd,
|
||||
};
|
||||
|
||||
trace_kvm_set_ioeventfd_mmio(fd, (uint64_t)addr, val, assign, size,
|
||||
datamatch);
|
||||
if (!kvm_enabled()) {
|
||||
return -ENOSYS;
|
||||
}
|
||||
@@ -688,6 +690,7 @@ static int kvm_set_ioeventfd_pio(int fd, uint16_t addr, uint16_t val,
|
||||
.fd = fd,
|
||||
};
|
||||
int r;
|
||||
trace_kvm_set_ioeventfd_pio(fd, addr, val, assign, size, datamatch);
|
||||
if (!kvm_enabled()) {
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@@ -12,5 +12,7 @@ kvm_irqchip_commit_routes(void) ""
|
||||
kvm_irqchip_add_msi_route(char *name, int vector, int virq) "dev %s vector %d virq %d"
|
||||
kvm_irqchip_update_msi_route(int virq) "Updating MSI route virq=%d"
|
||||
kvm_irqchip_release_virq(int virq) "virq %d"
|
||||
kvm_set_ioeventfd_mmio(int fd, uint64_t addr, uint32_t val, bool assign, uint32_t size, bool datamatch) "fd: %d @0x%" PRIx64 " val=0x%x assign: %d size: %d match: %d"
|
||||
kvm_set_ioeventfd_pio(int fd, uint16_t addr, uint32_t val, bool assign, uint32_t size, bool datamatch) "fd: %d @0x%x val=0x%x assign: %d size: %d match: %d"
|
||||
kvm_set_user_memory(uint32_t slot, uint32_t flags, uint64_t guest_phys_addr, uint64_t memory_size, uint64_t userspace_addr, int ret) "Slot#%d flags=0x%x gpa=0x%"PRIx64 " size=0x%"PRIx64 " ua=0x%"PRIx64 " ret=%d"
|
||||
|
||||
|
@@ -266,6 +266,9 @@ void cpu_exec_step_atomic(CPUState *cpu)
|
||||
#ifndef CONFIG_SOFTMMU
|
||||
tcg_debug_assert(!have_mmap_lock());
|
||||
#endif
|
||||
if (qemu_mutex_iothread_locked()) {
|
||||
qemu_mutex_unlock_iothread();
|
||||
}
|
||||
assert_no_pages_locked();
|
||||
}
|
||||
|
||||
@@ -325,9 +328,6 @@ TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc,
|
||||
struct tb_desc desc;
|
||||
uint32_t h;
|
||||
|
||||
cf_mask &= ~CF_CLUSTER_MASK;
|
||||
cf_mask |= cpu->cluster_index << CF_CLUSTER_SHIFT;
|
||||
|
||||
desc.env = (CPUArchState *)cpu->env_ptr;
|
||||
desc.cs_base = cs_base;
|
||||
desc.flags = flags;
|
||||
@@ -702,6 +702,7 @@ int cpu_exec(CPUState *cpu)
|
||||
if (qemu_mutex_iothread_locked()) {
|
||||
qemu_mutex_unlock_iothread();
|
||||
}
|
||||
assert_no_pages_locked();
|
||||
}
|
||||
|
||||
/* if an exception is pending, we execute it here */
|
||||
|
@@ -1045,6 +1045,8 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr)
|
||||
if (unlikely(!tlb_hit(entry->addr_code, addr))) {
|
||||
if (!VICTIM_TLB_HIT(addr_code, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, 0, MMU_INST_FETCH, mmu_idx, 0);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
entry = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
assert(tlb_hit(entry->addr_code, addr));
|
||||
}
|
||||
@@ -1125,6 +1127,8 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
||||
if (!VICTIM_TLB_HIT(addr_write, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, 1 << s_bits, MMU_DATA_STORE,
|
||||
mmu_idx, retaddr);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
tlbe = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
tlb_addr = tlb_addr_write(tlbe) & ~TLB_INVALID_MASK;
|
||||
}
|
||||
|
@@ -129,6 +129,8 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
|
||||
if (!VICTIM_TLB_HIT(ADDR_READ, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, DATA_SIZE, READ_ACCESS_TYPE,
|
||||
mmu_idx, retaddr);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
entry = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
tlb_addr = entry->ADDR_READ;
|
||||
}
|
||||
@@ -198,6 +200,8 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
|
||||
if (!VICTIM_TLB_HIT(ADDR_READ, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, DATA_SIZE, READ_ACCESS_TYPE,
|
||||
mmu_idx, retaddr);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
entry = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
tlb_addr = entry->ADDR_READ;
|
||||
}
|
||||
@@ -294,6 +298,8 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
||||
if (!VICTIM_TLB_HIT(addr_write, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, DATA_SIZE, MMU_DATA_STORE,
|
||||
mmu_idx, retaddr);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
entry = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
tlb_addr = tlb_addr_write(entry) & ~TLB_INVALID_MASK;
|
||||
}
|
||||
@@ -372,6 +378,8 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
|
||||
if (!VICTIM_TLB_HIT(addr_write, addr)) {
|
||||
tlb_fill(ENV_GET_CPU(env), addr, DATA_SIZE, MMU_DATA_STORE,
|
||||
mmu_idx, retaddr);
|
||||
index = tlb_index(env, mmu_idx, addr);
|
||||
entry = tlb_entry(env, mmu_idx, addr);
|
||||
}
|
||||
tlb_addr = tlb_addr_write(entry) & ~TLB_INVALID_MASK;
|
||||
}
|
||||
|
@@ -38,30 +38,29 @@ static void wav_destroy (void *opaque)
|
||||
uint8_t dlen[4];
|
||||
uint32_t datalen = wav->bytes;
|
||||
uint32_t rifflen = datalen + 36;
|
||||
Monitor *mon = cur_mon;
|
||||
|
||||
if (wav->f) {
|
||||
le_store (rlen, rifflen, 4);
|
||||
le_store (dlen, datalen, 4);
|
||||
|
||||
if (fseek (wav->f, 4, SEEK_SET)) {
|
||||
monitor_printf (mon, "wav_destroy: rlen fseek failed\nReason: %s\n",
|
||||
strerror (errno));
|
||||
error_report("wav_destroy: rlen fseek failed: %s",
|
||||
strerror(errno));
|
||||
goto doclose;
|
||||
}
|
||||
if (fwrite (rlen, 4, 1, wav->f) != 1) {
|
||||
monitor_printf (mon, "wav_destroy: rlen fwrite failed\nReason %s\n",
|
||||
strerror (errno));
|
||||
error_report("wav_destroy: rlen fwrite failed: %s",
|
||||
strerror(errno));
|
||||
goto doclose;
|
||||
}
|
||||
if (fseek (wav->f, 32, SEEK_CUR)) {
|
||||
monitor_printf (mon, "wav_destroy: dlen fseek failed\nReason %s\n",
|
||||
strerror (errno));
|
||||
error_report("wav_destroy: dlen fseek failed: %s",
|
||||
strerror(errno));
|
||||
goto doclose;
|
||||
}
|
||||
if (fwrite (dlen, 1, 4, wav->f) != 4) {
|
||||
monitor_printf (mon, "wav_destroy: dlen fwrite failed\nReason %s\n",
|
||||
strerror (errno));
|
||||
error_report("wav_destroy: dlen fwrite failed: %s",
|
||||
strerror(errno));
|
||||
goto doclose;
|
||||
}
|
||||
doclose:
|
||||
@@ -78,8 +77,7 @@ static void wav_capture (void *opaque, void *buf, int size)
|
||||
WAVState *wav = opaque;
|
||||
|
||||
if (fwrite (buf, size, 1, wav->f) != 1) {
|
||||
monitor_printf (cur_mon, "wav_capture: fwrite error\nReason: %s",
|
||||
strerror (errno));
|
||||
error_report("wav_capture: fwrite error: %s", strerror(errno));
|
||||
}
|
||||
wav->bytes += size;
|
||||
}
|
||||
@@ -110,7 +108,6 @@ static struct capture_ops wav_capture_ops = {
|
||||
int wav_start_capture (CaptureState *s, const char *path, int freq,
|
||||
int bits, int nchannels)
|
||||
{
|
||||
Monitor *mon = cur_mon;
|
||||
WAVState *wav;
|
||||
uint8_t hdr[] = {
|
||||
0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
|
||||
@@ -124,13 +121,13 @@ int wav_start_capture (CaptureState *s, const char *path, int freq,
|
||||
CaptureVoiceOut *cap;
|
||||
|
||||
if (bits != 8 && bits != 16) {
|
||||
monitor_printf (mon, "incorrect bit count %d, must be 8 or 16\n", bits);
|
||||
error_report("incorrect bit count %d, must be 8 or 16", bits);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (nchannels != 1 && nchannels != 2) {
|
||||
monitor_printf (mon, "incorrect channel count %d, must be 1 or 2\n",
|
||||
nchannels);
|
||||
error_report("incorrect channel count %d, must be 1 or 2",
|
||||
nchannels);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -158,8 +155,8 @@ int wav_start_capture (CaptureState *s, const char *path, int freq,
|
||||
|
||||
wav->f = fopen (path, "wb");
|
||||
if (!wav->f) {
|
||||
monitor_printf (mon, "Failed to open wave file `%s'\nReason: %s\n",
|
||||
path, strerror (errno));
|
||||
error_report("Failed to open wave file `%s': %s",
|
||||
path, strerror(errno));
|
||||
g_free (wav);
|
||||
return -1;
|
||||
}
|
||||
@@ -170,14 +167,13 @@ int wav_start_capture (CaptureState *s, const char *path, int freq,
|
||||
wav->freq = freq;
|
||||
|
||||
if (fwrite (hdr, sizeof (hdr), 1, wav->f) != 1) {
|
||||
monitor_printf (mon, "Failed to write header\nReason: %s\n",
|
||||
strerror (errno));
|
||||
error_report("Failed to write header: %s", strerror(errno));
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
cap = AUD_add_capture (&as, &ops, wav);
|
||||
if (!cap) {
|
||||
monitor_printf (mon, "Failed to add audio capture\n");
|
||||
error_report("Failed to add audio capture");
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
@@ -189,8 +185,7 @@ int wav_start_capture (CaptureState *s, const char *path, int freq,
|
||||
error_free:
|
||||
g_free (wav->path);
|
||||
if (fclose (wav->f)) {
|
||||
monitor_printf (mon, "Failed to close wave file\nReason: %s\n",
|
||||
strerror (errno));
|
||||
error_report("Failed to close wave file: %s", strerror(errno));
|
||||
}
|
||||
g_free (wav);
|
||||
return -1;
|
||||
|
5
block.c
5
block.c
@@ -4462,11 +4462,12 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||
return drv->bdrv_get_info(bs, bdi);
|
||||
}
|
||||
|
||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
|
||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
|
||||
Error **errp)
|
||||
{
|
||||
BlockDriver *drv = bs->drv;
|
||||
if (drv && drv->bdrv_get_specific_info) {
|
||||
return drv->bdrv_get_specific_info(bs);
|
||||
return drv->bdrv_get_specific_info(bs, errp);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -594,20 +594,17 @@ static int block_crypto_get_info_luks(BlockDriverState *bs,
|
||||
}
|
||||
|
||||
static ImageInfoSpecific *
|
||||
block_crypto_get_specific_info_luks(BlockDriverState *bs)
|
||||
block_crypto_get_specific_info_luks(BlockDriverState *bs, Error **errp)
|
||||
{
|
||||
BlockCrypto *crypto = bs->opaque;
|
||||
ImageInfoSpecific *spec_info;
|
||||
QCryptoBlockInfo *info;
|
||||
|
||||
info = qcrypto_block_get_info(crypto->block, NULL);
|
||||
info = qcrypto_block_get_info(crypto->block, errp);
|
||||
if (!info) {
|
||||
return NULL;
|
||||
}
|
||||
if (info->format != Q_CRYPTO_BLOCK_FORMAT_LUKS) {
|
||||
qapi_free_QCryptoBlockInfo(info);
|
||||
return NULL;
|
||||
}
|
||||
assert(info->format == Q_CRYPTO_BLOCK_FORMAT_LUKS);
|
||||
|
||||
spec_info = g_new(ImageInfoSpecific, 1);
|
||||
spec_info->type = IMAGE_INFO_SPECIFIC_KIND_LUKS;
|
||||
|
@@ -282,7 +282,12 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
||||
info->dirty_flag = bdi.is_dirty;
|
||||
info->has_dirty_flag = true;
|
||||
}
|
||||
info->format_specific = bdrv_get_specific_info(bs);
|
||||
info->format_specific = bdrv_get_specific_info(bs, &err);
|
||||
if (err) {
|
||||
error_propagate(errp, err);
|
||||
qapi_free_ImageInfo(info);
|
||||
goto out;
|
||||
}
|
||||
info->has_format_specific = info->format_specific != NULL;
|
||||
|
||||
backing_filename = bs->backing_file;
|
||||
|
@@ -1006,6 +1006,82 @@ fail:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static Qcow2BitmapInfoFlagsList *get_bitmap_info_flags(uint32_t flags)
|
||||
{
|
||||
Qcow2BitmapInfoFlagsList *list = NULL;
|
||||
Qcow2BitmapInfoFlagsList **plist = &list;
|
||||
int i;
|
||||
|
||||
static const struct {
|
||||
int bme; /* Bitmap directory entry flags */
|
||||
int info; /* The flags to report to the user */
|
||||
} map[] = {
|
||||
{ BME_FLAG_IN_USE, QCOW2_BITMAP_INFO_FLAGS_IN_USE },
|
||||
{ BME_FLAG_AUTO, QCOW2_BITMAP_INFO_FLAGS_AUTO },
|
||||
};
|
||||
|
||||
int map_size = ARRAY_SIZE(map);
|
||||
|
||||
for (i = 0; i < map_size; ++i) {
|
||||
if (flags & map[i].bme) {
|
||||
Qcow2BitmapInfoFlagsList *entry =
|
||||
g_new0(Qcow2BitmapInfoFlagsList, 1);
|
||||
entry->value = map[i].info;
|
||||
*plist = entry;
|
||||
plist = &entry->next;
|
||||
flags &= ~map[i].bme;
|
||||
}
|
||||
}
|
||||
/* Check if the BME_* mapping above is complete */
|
||||
assert(!flags);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/*
|
||||
* qcow2_get_bitmap_info_list()
|
||||
* Returns a list of QCOW2 bitmap details.
|
||||
* In case of no bitmaps, the function returns NULL and
|
||||
* the @errp parameter is not set.
|
||||
* When bitmap information can not be obtained, the function returns
|
||||
* NULL and the @errp parameter is set.
|
||||
*/
|
||||
Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
||||
Error **errp)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
Qcow2BitmapList *bm_list;
|
||||
Qcow2Bitmap *bm;
|
||||
Qcow2BitmapInfoList *list = NULL;
|
||||
Qcow2BitmapInfoList **plist = &list;
|
||||
|
||||
if (s->nb_bitmaps == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
|
||||
s->bitmap_directory_size, errp);
|
||||
if (bm_list == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
QSIMPLEQ_FOREACH(bm, bm_list, entry) {
|
||||
Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1);
|
||||
Qcow2BitmapInfoList *obj = g_new0(Qcow2BitmapInfoList, 1);
|
||||
info->granularity = 1U << bm->granularity_bits;
|
||||
info->name = g_strdup(bm->name);
|
||||
info->flags = get_bitmap_info_flags(bm->flags & ~BME_RESERVED_FLAGS);
|
||||
obj->value = info;
|
||||
*plist = obj;
|
||||
plist = &obj->next;
|
||||
}
|
||||
|
||||
bitmap_list_free(bm_list);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
int qcow2_reopen_bitmaps_rw_hint(BlockDriverState *bs, bool *header_updated,
|
||||
Error **errp)
|
||||
{
|
||||
|
@@ -4368,20 +4368,26 @@ static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
||||
static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs,
|
||||
Error **errp)
|
||||
{
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
ImageInfoSpecific *spec_info;
|
||||
QCryptoBlockInfo *encrypt_info = NULL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
if (s->crypto != NULL) {
|
||||
encrypt_info = qcrypto_block_get_info(s->crypto, &error_abort);
|
||||
encrypt_info = qcrypto_block_get_info(s->crypto, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
spec_info = g_new(ImageInfoSpecific, 1);
|
||||
*spec_info = (ImageInfoSpecific){
|
||||
.type = IMAGE_INFO_SPECIFIC_KIND_QCOW2,
|
||||
.u.qcow2.data = g_new(ImageInfoSpecificQCow2, 1),
|
||||
.u.qcow2.data = g_new0(ImageInfoSpecificQCow2, 1),
|
||||
};
|
||||
if (s->qcow_version == 2) {
|
||||
*spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
|
||||
@@ -4389,6 +4395,13 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
||||
.refcount_bits = s->refcount_bits,
|
||||
};
|
||||
} else if (s->qcow_version == 3) {
|
||||
Qcow2BitmapInfoList *bitmaps;
|
||||
bitmaps = qcow2_get_bitmap_info_list(bs, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
qapi_free_ImageInfoSpecific(spec_info);
|
||||
return NULL;
|
||||
}
|
||||
*spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
|
||||
.compat = g_strdup("1.1"),
|
||||
.lazy_refcounts = s->compatible_features &
|
||||
@@ -4398,6 +4411,8 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
||||
QCOW2_INCOMPAT_CORRUPT,
|
||||
.has_corrupt = true,
|
||||
.refcount_bits = s->refcount_bits,
|
||||
.has_bitmaps = !!bitmaps,
|
||||
.bitmaps = bitmaps,
|
||||
};
|
||||
} else {
|
||||
/* if this assertion fails, this probably means a new version was
|
||||
|
@@ -684,6 +684,8 @@ int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
|
||||
void **refcount_table,
|
||||
int64_t *refcount_table_size);
|
||||
bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp);
|
||||
Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs,
|
||||
Error **errp);
|
||||
int qcow2_reopen_bitmaps_rw_hint(BlockDriverState *bs, bool *header_updated,
|
||||
Error **errp);
|
||||
int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp);
|
||||
|
@@ -2543,7 +2543,8 @@ static int coroutine_fn vmdk_co_check(BlockDriverState *bs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs)
|
||||
static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs,
|
||||
Error **errp)
|
||||
{
|
||||
int i;
|
||||
BDRVVmdkState *s = bs->opaque;
|
||||
|
@@ -246,14 +246,15 @@ void qemu_chr_fe_deinit(CharBackend *b, bool del)
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_chr_fe_set_handlers(CharBackend *b,
|
||||
IOCanReadHandler *fd_can_read,
|
||||
IOReadHandler *fd_read,
|
||||
IOEventHandler *fd_event,
|
||||
BackendChangeHandler *be_change,
|
||||
void *opaque,
|
||||
GMainContext *context,
|
||||
bool set_open)
|
||||
void qemu_chr_fe_set_handlers_full(CharBackend *b,
|
||||
IOCanReadHandler *fd_can_read,
|
||||
IOReadHandler *fd_read,
|
||||
IOEventHandler *fd_event,
|
||||
BackendChangeHandler *be_change,
|
||||
void *opaque,
|
||||
GMainContext *context,
|
||||
bool set_open,
|
||||
bool sync_state)
|
||||
{
|
||||
Chardev *s;
|
||||
int fe_open;
|
||||
@@ -285,14 +286,24 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
|
||||
qemu_chr_fe_take_focus(b);
|
||||
/* We're connecting to an already opened device, so let's make sure we
|
||||
also get the open event */
|
||||
if (s->be_open) {
|
||||
if (sync_state && s->be_open) {
|
||||
qemu_chr_be_event(s, CHR_EVENT_OPENED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (CHARDEV_IS_MUX(s)) {
|
||||
mux_chr_set_handlers(s, context);
|
||||
}
|
||||
void qemu_chr_fe_set_handlers(CharBackend *b,
|
||||
IOCanReadHandler *fd_can_read,
|
||||
IOReadHandler *fd_read,
|
||||
IOEventHandler *fd_event,
|
||||
BackendChangeHandler *be_change,
|
||||
void *opaque,
|
||||
GMainContext *context,
|
||||
bool set_open)
|
||||
{
|
||||
qemu_chr_fe_set_handlers_full(b, fd_can_read, fd_read, fd_event, be_change,
|
||||
opaque, context, set_open,
|
||||
true);
|
||||
}
|
||||
|
||||
void qemu_chr_fe_take_focus(CharBackend *b)
|
||||
|
@@ -278,18 +278,18 @@ static void char_mux_finalize(Object *obj)
|
||||
qemu_chr_fe_deinit(&d->chr, false);
|
||||
}
|
||||
|
||||
void mux_chr_set_handlers(Chardev *chr, GMainContext *context)
|
||||
static void mux_chr_update_read_handlers(Chardev *chr)
|
||||
{
|
||||
MuxChardev *d = MUX_CHARDEV(chr);
|
||||
|
||||
/* Fix up the real driver with mux routines */
|
||||
qemu_chr_fe_set_handlers(&d->chr,
|
||||
mux_chr_can_read,
|
||||
mux_chr_read,
|
||||
mux_chr_event,
|
||||
NULL,
|
||||
chr,
|
||||
context, true);
|
||||
qemu_chr_fe_set_handlers_full(&d->chr,
|
||||
mux_chr_can_read,
|
||||
mux_chr_read,
|
||||
mux_chr_event,
|
||||
NULL,
|
||||
chr,
|
||||
chr->gcontext, true, false);
|
||||
}
|
||||
|
||||
void mux_set_focus(Chardev *chr, int focus)
|
||||
@@ -367,7 +367,7 @@ static int open_muxes(Chardev *chr)
|
||||
* mark mux as OPENED so any new FEs will immediately receive
|
||||
* OPENED event
|
||||
*/
|
||||
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
|
||||
chr->be_open = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -383,6 +383,7 @@ static void char_mux_class_init(ObjectClass *oc, void *data)
|
||||
cc->chr_add_watch = mux_chr_add_watch;
|
||||
cc->chr_be_event = mux_chr_be_event;
|
||||
cc->chr_machine_done = open_muxes;
|
||||
cc->chr_update_read_handler = mux_chr_update_read_handlers;
|
||||
}
|
||||
|
||||
static const TypeInfo char_mux_type_info = {
|
||||
|
@@ -36,15 +36,12 @@ typedef struct {
|
||||
QIOChannel *ioc;
|
||||
int read_bytes;
|
||||
|
||||
/* Protected by the Chardev chr_write_lock. */
|
||||
int connected;
|
||||
GSource *timer_src;
|
||||
GSource *open_source;
|
||||
} PtyChardev;
|
||||
|
||||
#define PTY_CHARDEV(obj) OBJECT_CHECK(PtyChardev, (obj), TYPE_CHARDEV_PTY)
|
||||
|
||||
static void pty_chr_update_read_handler_locked(Chardev *chr);
|
||||
static void pty_chr_state(Chardev *chr, int connected);
|
||||
|
||||
static void pty_chr_timer_cancel(PtyChardev *s)
|
||||
@@ -56,32 +53,19 @@ static void pty_chr_timer_cancel(PtyChardev *s)
|
||||
}
|
||||
}
|
||||
|
||||
static void pty_chr_open_src_cancel(PtyChardev *s)
|
||||
{
|
||||
if (s->open_source) {
|
||||
g_source_destroy(s->open_source);
|
||||
g_source_unref(s->open_source);
|
||||
s->open_source = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean pty_chr_timer(gpointer opaque)
|
||||
{
|
||||
struct Chardev *chr = CHARDEV(opaque);
|
||||
PtyChardev *s = PTY_CHARDEV(opaque);
|
||||
|
||||
qemu_mutex_lock(&chr->chr_write_lock);
|
||||
pty_chr_timer_cancel(s);
|
||||
pty_chr_open_src_cancel(s);
|
||||
if (!s->connected) {
|
||||
/* Next poll ... */
|
||||
pty_chr_update_read_handler_locked(chr);
|
||||
qemu_chr_be_update_read_handlers(chr, chr->gcontext);
|
||||
}
|
||||
qemu_mutex_unlock(&chr->chr_write_lock);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Called with chr_write_lock held. */
|
||||
static void pty_chr_rearm_timer(Chardev *chr, int ms)
|
||||
{
|
||||
PtyChardev *s = PTY_CHARDEV(chr);
|
||||
@@ -94,8 +78,7 @@ static void pty_chr_rearm_timer(Chardev *chr, int ms)
|
||||
g_free(name);
|
||||
}
|
||||
|
||||
/* Called with chr_write_lock held. */
|
||||
static void pty_chr_update_read_handler_locked(Chardev *chr)
|
||||
static void pty_chr_update_read_handler(Chardev *chr)
|
||||
{
|
||||
PtyChardev *s = PTY_CHARDEV(chr);
|
||||
GPollFD pfd;
|
||||
@@ -117,24 +100,12 @@ static void pty_chr_update_read_handler_locked(Chardev *chr)
|
||||
}
|
||||
}
|
||||
|
||||
static void pty_chr_update_read_handler(Chardev *chr)
|
||||
{
|
||||
qemu_mutex_lock(&chr->chr_write_lock);
|
||||
pty_chr_update_read_handler_locked(chr);
|
||||
qemu_mutex_unlock(&chr->chr_write_lock);
|
||||
}
|
||||
|
||||
/* Called with chr_write_lock held. */
|
||||
static int char_pty_chr_write(Chardev *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
PtyChardev *s = PTY_CHARDEV(chr);
|
||||
|
||||
if (!s->connected) {
|
||||
/* guest sends data, check for (re-)connect */
|
||||
pty_chr_update_read_handler_locked(chr);
|
||||
if (!s->connected) {
|
||||
return len;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
return io_channel_send(s->ioc, buf, len);
|
||||
}
|
||||
@@ -183,23 +154,11 @@ static gboolean pty_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean qemu_chr_be_generic_open_func(gpointer opaque)
|
||||
{
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
PtyChardev *s = PTY_CHARDEV(opaque);
|
||||
|
||||
s->open_source = NULL;
|
||||
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Called with chr_write_lock held. */
|
||||
static void pty_chr_state(Chardev *chr, int connected)
|
||||
{
|
||||
PtyChardev *s = PTY_CHARDEV(chr);
|
||||
|
||||
if (!connected) {
|
||||
pty_chr_open_src_cancel(s);
|
||||
remove_fd_in_watch(chr);
|
||||
s->connected = 0;
|
||||
/* (re-)connect poll interval for idle guests: once per second.
|
||||
@@ -209,13 +168,8 @@ static void pty_chr_state(Chardev *chr, int connected)
|
||||
} else {
|
||||
pty_chr_timer_cancel(s);
|
||||
if (!s->connected) {
|
||||
g_assert(s->open_source == NULL);
|
||||
s->open_source = g_idle_source_new();
|
||||
s->connected = 1;
|
||||
g_source_set_callback(s->open_source,
|
||||
qemu_chr_be_generic_open_func,
|
||||
chr, NULL);
|
||||
g_source_attach(s->open_source, chr->gcontext);
|
||||
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
|
||||
}
|
||||
if (!chr->gsource) {
|
||||
chr->gsource = io_add_watch_poll(chr, s->ioc,
|
||||
@@ -231,11 +185,9 @@ static void char_pty_finalize(Object *obj)
|
||||
Chardev *chr = CHARDEV(obj);
|
||||
PtyChardev *s = PTY_CHARDEV(obj);
|
||||
|
||||
qemu_mutex_lock(&chr->chr_write_lock);
|
||||
pty_chr_state(chr, 0);
|
||||
object_unref(OBJECT(s->ioc));
|
||||
pty_chr_timer_cancel(s);
|
||||
qemu_mutex_unlock(&chr->chr_write_lock);
|
||||
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
|
||||
}
|
||||
|
||||
|
@@ -57,7 +57,7 @@ static void qmp_chardev_open_serial(Chardev *chr,
|
||||
static void tty_serial_init(int fd, int speed,
|
||||
int parity, int data_bits, int stop_bits)
|
||||
{
|
||||
struct termios tty;
|
||||
struct termios tty = {0};
|
||||
speed_t spd;
|
||||
|
||||
#if 0
|
||||
|
@@ -46,6 +46,12 @@ typedef struct {
|
||||
size_t buflen;
|
||||
} TCPChardevTelnetInit;
|
||||
|
||||
typedef enum {
|
||||
TCP_CHARDEV_STATE_DISCONNECTED,
|
||||
TCP_CHARDEV_STATE_CONNECTING,
|
||||
TCP_CHARDEV_STATE_CONNECTED,
|
||||
} TCPChardevState;
|
||||
|
||||
typedef struct {
|
||||
Chardev parent;
|
||||
QIOChannel *ioc; /* Client I/O channel */
|
||||
@@ -53,7 +59,7 @@ typedef struct {
|
||||
QIONetListener *listener;
|
||||
GSource *hup_source;
|
||||
QCryptoTLSCreds *tls_creds;
|
||||
int connected;
|
||||
TCPChardevState state;
|
||||
int max_size;
|
||||
int do_telnetopt;
|
||||
int do_nodelay;
|
||||
@@ -74,6 +80,8 @@ typedef struct {
|
||||
GSource *reconnect_timer;
|
||||
int64_t reconnect_time;
|
||||
bool connect_err_reported;
|
||||
|
||||
QIOTask *connect_task;
|
||||
} SocketChardev;
|
||||
|
||||
#define SOCKET_CHARDEV(obj) \
|
||||
@@ -82,6 +90,21 @@ typedef struct {
|
||||
static gboolean socket_reconnect_timeout(gpointer opaque);
|
||||
static void tcp_chr_telnet_init(Chardev *chr);
|
||||
|
||||
static void tcp_chr_change_state(SocketChardev *s, TCPChardevState state)
|
||||
{
|
||||
switch (state) {
|
||||
case TCP_CHARDEV_STATE_DISCONNECTED:
|
||||
break;
|
||||
case TCP_CHARDEV_STATE_CONNECTING:
|
||||
assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
|
||||
break;
|
||||
case TCP_CHARDEV_STATE_CONNECTED:
|
||||
assert(s->state == TCP_CHARDEV_STATE_CONNECTING);
|
||||
break;
|
||||
}
|
||||
s->state = state;
|
||||
}
|
||||
|
||||
static void tcp_chr_reconn_timer_cancel(SocketChardev *s)
|
||||
{
|
||||
if (s->reconnect_timer) {
|
||||
@@ -96,7 +119,8 @@ static void qemu_chr_socket_restart_timer(Chardev *chr)
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
char *name;
|
||||
|
||||
assert(s->connected == 0);
|
||||
assert(s->state == TCP_CHARDEV_STATE_DISCONNECTED);
|
||||
assert(!s->reconnect_timer);
|
||||
name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label);
|
||||
s->reconnect_timer = qemu_chr_timeout_add_ms(chr,
|
||||
s->reconnect_time * 1000,
|
||||
@@ -131,7 +155,7 @@ static int tcp_chr_write(Chardev *chr, const uint8_t *buf, int len)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
|
||||
if (s->connected) {
|
||||
if (s->state == TCP_CHARDEV_STATE_CONNECTED) {
|
||||
int ret = io_channel_send_full(s->ioc, buf, len,
|
||||
s->write_msgfds,
|
||||
s->write_msgfds_num);
|
||||
@@ -164,7 +188,7 @@ static int tcp_chr_read_poll(void *opaque)
|
||||
{
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
SocketChardev *s = SOCKET_CHARDEV(opaque);
|
||||
if (!s->connected) {
|
||||
if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
||||
return 0;
|
||||
}
|
||||
s->max_size = qemu_chr_be_can_write(chr);
|
||||
@@ -277,7 +301,7 @@ static int tcp_set_msgfds(Chardev *chr, int *fds, int num)
|
||||
s->write_msgfds = NULL;
|
||||
s->write_msgfds_num = 0;
|
||||
|
||||
if (!s->connected ||
|
||||
if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
|
||||
!qio_channel_has_feature(s->ioc,
|
||||
QIO_CHANNEL_FEATURE_FD_PASS)) {
|
||||
return -1;
|
||||
@@ -389,7 +413,7 @@ static void tcp_chr_free_connection(Chardev *chr)
|
||||
s->ioc = NULL;
|
||||
g_free(chr->filename);
|
||||
chr->filename = NULL;
|
||||
s->connected = 0;
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
|
||||
}
|
||||
|
||||
static const char *qemu_chr_socket_protocol(SocketChardev *s)
|
||||
@@ -442,12 +466,12 @@ static void update_disconnected_filename(SocketChardev *s)
|
||||
|
||||
/* NB may be called even if tcp_chr_connect has not been
|
||||
* reached, due to TLS or telnet initialization failure,
|
||||
* so can *not* assume s->connected == true
|
||||
* so can *not* assume s->state == TCP_CHARDEV_STATE_CONNECTED
|
||||
*/
|
||||
static void tcp_chr_disconnect(Chardev *chr)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
bool emit_close = s->connected;
|
||||
bool emit_close = s->state == TCP_CHARDEV_STATE_CONNECTED;
|
||||
|
||||
tcp_chr_free_connection(chr);
|
||||
|
||||
@@ -471,7 +495,8 @@ static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
|
||||
uint8_t buf[CHR_READ_BUF_LEN];
|
||||
int len, size;
|
||||
|
||||
if (!s->connected || s->max_size <= 0) {
|
||||
if ((s->state != TCP_CHARDEV_STATE_CONNECTED) ||
|
||||
s->max_size <= 0) {
|
||||
return TRUE;
|
||||
}
|
||||
len = sizeof(buf);
|
||||
@@ -508,7 +533,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
int size;
|
||||
|
||||
if (!s->connected) {
|
||||
if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -564,7 +589,7 @@ static void update_ioc_handlers(SocketChardev *s)
|
||||
{
|
||||
Chardev *chr = CHARDEV(s);
|
||||
|
||||
if (!s->connected) {
|
||||
if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -589,7 +614,7 @@ static void tcp_chr_connect(void *opaque)
|
||||
g_free(chr->filename);
|
||||
chr->filename = qemu_chr_compute_filename(s);
|
||||
|
||||
s->connected = 1;
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTED);
|
||||
update_ioc_handlers(s);
|
||||
qemu_chr_be_event(chr, CHR_EVENT_OPENED);
|
||||
}
|
||||
@@ -828,7 +853,7 @@ static int tcp_chr_new_client(Chardev *chr, QIOChannelSocket *sioc)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
|
||||
if (s->ioc != NULL) {
|
||||
if (s->state != TCP_CHARDEV_STATE_CONNECTING) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -865,11 +890,17 @@ static int tcp_chr_add_client(Chardev *chr, int fd)
|
||||
{
|
||||
int ret;
|
||||
QIOChannelSocket *sioc;
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
|
||||
if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
sioc = qio_channel_socket_new_fd(fd, NULL);
|
||||
if (!sioc) {
|
||||
return -1;
|
||||
}
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
ret = tcp_chr_new_client(chr, sioc);
|
||||
object_unref(OBJECT(sioc));
|
||||
@@ -881,35 +912,125 @@ static void tcp_chr_accept(QIONetListener *listener,
|
||||
void *opaque)
|
||||
{
|
||||
Chardev *chr = CHARDEV(opaque);
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
|
||||
tcp_chr_set_client_ioc_name(chr, cioc);
|
||||
tcp_chr_new_client(chr, cioc);
|
||||
}
|
||||
|
||||
static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
|
||||
|
||||
static int tcp_chr_connect_client_sync(Chardev *chr, Error **errp)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
QIOChannelSocket *sioc = qio_channel_socket_new();
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
|
||||
object_unref(OBJECT(sioc));
|
||||
return -1;
|
||||
}
|
||||
tcp_chr_new_client(chr, sioc);
|
||||
object_unref(OBJECT(sioc));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void tcp_chr_accept_server_sync(Chardev *chr)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
QIOChannelSocket *sioc;
|
||||
info_report("QEMU waiting for connection on: %s",
|
||||
chr->filename);
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
|
||||
sioc = qio_net_listener_wait_client(s->listener);
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
tcp_chr_new_client(chr, sioc);
|
||||
object_unref(OBJECT(sioc));
|
||||
}
|
||||
|
||||
/* It can't wait on s->connected, since it is set asynchronously
|
||||
* in TLS and telnet cases, only wait for an accepted socket */
|
||||
while (!s->ioc) {
|
||||
|
||||
static int tcp_chr_wait_connected(Chardev *chr, Error **errp)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
const char *opts[] = { "telnet", "tn3270", "websock", "tls-creds" };
|
||||
bool optset[] = { s->is_telnet, s->is_tn3270, s->is_websock, s->tls_creds };
|
||||
size_t i;
|
||||
|
||||
QEMU_BUILD_BUG_ON(G_N_ELEMENTS(opts) != G_N_ELEMENTS(optset));
|
||||
for (i = 0; i < G_N_ELEMENTS(opts); i++) {
|
||||
if (optset[i]) {
|
||||
error_setg(errp,
|
||||
"'%s' option is incompatible with waiting for "
|
||||
"connection completion", opts[i]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
tcp_chr_reconn_timer_cancel(s);
|
||||
|
||||
/*
|
||||
* We expect states to be as follows:
|
||||
*
|
||||
* - server
|
||||
* - wait -> CONNECTED
|
||||
* - nowait -> DISCONNECTED
|
||||
* - client
|
||||
* - reconnect == 0 -> CONNECTED
|
||||
* - reconnect != 0 -> CONNECTING
|
||||
*
|
||||
*/
|
||||
if (s->state == TCP_CHARDEV_STATE_CONNECTING) {
|
||||
if (!s->connect_task) {
|
||||
error_setg(errp,
|
||||
"Unexpected 'connecting' state without connect task "
|
||||
"while waiting for connection completion");
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
* tcp_chr_wait_connected should only ever be run from the
|
||||
* main loop thread associated with chr->gcontext, otherwise
|
||||
* qio_task_wait_thread has a dangerous race condition with
|
||||
* free'ing of the s->connect_task object.
|
||||
*
|
||||
* Acquiring the main context doesn't 100% prove we're in
|
||||
* the main loop thread, but it does at least guarantee
|
||||
* that the main loop won't be executed by another thread
|
||||
* avoiding the race condition with the task idle callback.
|
||||
*/
|
||||
g_main_context_acquire(chr->gcontext);
|
||||
qio_task_wait_thread(s->connect_task);
|
||||
g_main_context_release(chr->gcontext);
|
||||
|
||||
/*
|
||||
* The completion callback (qemu_chr_socket_connected) for
|
||||
* s->connect_task should have set this to NULL by the time
|
||||
* qio_task_wait_thread has returned.
|
||||
*/
|
||||
assert(!s->connect_task);
|
||||
|
||||
/*
|
||||
* NB we are *not* guaranteed to have "s->state == ..CONNECTED"
|
||||
* at this point as this first connect may be failed, so
|
||||
* allow the next loop to run regardless.
|
||||
*/
|
||||
}
|
||||
|
||||
while (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
||||
if (s->is_listen) {
|
||||
info_report("QEMU waiting for connection on: %s",
|
||||
chr->filename);
|
||||
sioc = qio_net_listener_wait_client(s->listener);
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
tcp_chr_new_client(chr, sioc);
|
||||
object_unref(OBJECT(sioc));
|
||||
tcp_chr_accept_server_sync(chr);
|
||||
} else {
|
||||
sioc = qio_channel_socket_new();
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
|
||||
object_unref(OBJECT(sioc));
|
||||
return -1;
|
||||
Error *err = NULL;
|
||||
if (tcp_chr_connect_client_sync(chr, &err) < 0) {
|
||||
if (s->reconnect_time) {
|
||||
error_free(err);
|
||||
g_usleep(s->reconnect_time * 1000ULL * 1000ULL);
|
||||
} else {
|
||||
error_propagate(errp, err);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
tcp_chr_new_client(chr, sioc);
|
||||
object_unref(OBJECT(sioc));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -945,7 +1066,10 @@ static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
Error *err = NULL;
|
||||
|
||||
s->connect_task = NULL;
|
||||
|
||||
if (qio_task_propagate_error(task, &err)) {
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
|
||||
check_report_connect_error(chr, err);
|
||||
error_free(err);
|
||||
goto cleanup;
|
||||
@@ -958,16 +1082,45 @@ cleanup:
|
||||
object_unref(OBJECT(sioc));
|
||||
}
|
||||
|
||||
static void tcp_chr_connect_async(Chardev *chr)
|
||||
|
||||
static void tcp_chr_connect_client_task(QIOTask *task,
|
||||
gpointer opaque)
|
||||
{
|
||||
QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task));
|
||||
SocketAddress *addr = opaque;
|
||||
Error *err = NULL;
|
||||
|
||||
qio_channel_socket_connect_sync(ioc, addr, &err);
|
||||
|
||||
qio_task_set_error(task, err);
|
||||
}
|
||||
|
||||
|
||||
static void tcp_chr_connect_client_async(Chardev *chr)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
QIOChannelSocket *sioc;
|
||||
|
||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
|
||||
sioc = qio_channel_socket_new();
|
||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||
qio_channel_socket_connect_async(sioc, s->addr,
|
||||
qemu_chr_socket_connected,
|
||||
chr, NULL, chr->gcontext);
|
||||
/*
|
||||
* Normally code would use the qio_channel_socket_connect_async
|
||||
* method which uses a QIOTask + qio_task_set_error internally
|
||||
* to avoid blocking. The tcp_chr_wait_connected method, however,
|
||||
* needs a way to synchronize with completion of the background
|
||||
* connect task which can't be done with the QIOChannelSocket
|
||||
* async APIs. Thus we must use QIOTask directly to implement
|
||||
* the non-blocking concept locally.
|
||||
*/
|
||||
s->connect_task = qio_task_new(OBJECT(sioc),
|
||||
qemu_chr_socket_connected,
|
||||
chr, NULL);
|
||||
qio_task_run_in_thread(s->connect_task,
|
||||
tcp_chr_connect_client_task,
|
||||
s->addr,
|
||||
NULL,
|
||||
chr->gcontext);
|
||||
}
|
||||
|
||||
static gboolean socket_reconnect_timeout(gpointer opaque)
|
||||
@@ -982,11 +1135,138 @@ static gboolean socket_reconnect_timeout(gpointer opaque)
|
||||
return false;
|
||||
}
|
||||
|
||||
tcp_chr_connect_async(chr);
|
||||
tcp_chr_connect_client_async(chr);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static int qmp_chardev_open_socket_server(Chardev *chr,
|
||||
bool is_telnet,
|
||||
bool is_waitconnect,
|
||||
Error **errp)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
char *name;
|
||||
if (is_telnet) {
|
||||
s->do_telnetopt = 1;
|
||||
}
|
||||
s->listener = qio_net_listener_new();
|
||||
|
||||
name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
|
||||
qio_net_listener_set_name(s->listener, name);
|
||||
g_free(name);
|
||||
|
||||
if (qio_net_listener_open_sync(s->listener, s->addr, errp) < 0) {
|
||||
object_unref(OBJECT(s->listener));
|
||||
s->listener = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
qapi_free_SocketAddress(s->addr);
|
||||
s->addr = socket_local_address(s->listener->sioc[0]->fd, errp);
|
||||
update_disconnected_filename(s);
|
||||
|
||||
if (is_waitconnect) {
|
||||
tcp_chr_accept_server_sync(chr);
|
||||
} else {
|
||||
qio_net_listener_set_client_func_full(s->listener,
|
||||
tcp_chr_accept,
|
||||
chr, NULL,
|
||||
chr->gcontext);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int qmp_chardev_open_socket_client(Chardev *chr,
|
||||
int64_t reconnect,
|
||||
Error **errp)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||
|
||||
if (reconnect > 0) {
|
||||
s->reconnect_time = reconnect;
|
||||
tcp_chr_connect_client_async(chr);
|
||||
return 0;
|
||||
} else {
|
||||
return tcp_chr_connect_client_sync(chr, errp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool qmp_chardev_validate_socket(ChardevSocket *sock,
|
||||
SocketAddress *addr,
|
||||
Error **errp)
|
||||
{
|
||||
/* Validate any options which have a dependency on address type */
|
||||
switch (addr->type) {
|
||||
case SOCKET_ADDRESS_TYPE_FD:
|
||||
if (sock->has_reconnect) {
|
||||
error_setg(errp,
|
||||
"'reconnect' option is incompatible with "
|
||||
"'fd' address type");
|
||||
return false;
|
||||
}
|
||||
if (sock->has_tls_creds &&
|
||||
!(sock->has_server && sock->server)) {
|
||||
error_setg(errp,
|
||||
"'tls_creds' option is incompatible with "
|
||||
"'fd' address type as client");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_UNIX:
|
||||
if (sock->has_tls_creds) {
|
||||
error_setg(errp,
|
||||
"'tls_creds' option is incompatible with "
|
||||
"'unix' address type");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_INET:
|
||||
break;
|
||||
|
||||
case SOCKET_ADDRESS_TYPE_VSOCK:
|
||||
if (sock->has_tls_creds) {
|
||||
error_setg(errp,
|
||||
"'tls_creds' option is incompatible with "
|
||||
"'vsock' address type");
|
||||
return false;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Validate any options which have a dependancy on client vs server */
|
||||
if (!sock->has_server || sock->server) {
|
||||
if (sock->has_reconnect) {
|
||||
error_setg(errp,
|
||||
"'reconnect' option is incompatible with "
|
||||
"socket in server listen mode");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (sock->has_websocket && sock->websocket) {
|
||||
error_setg(errp, "%s", "Websocket client is not implemented");
|
||||
return false;
|
||||
}
|
||||
if (sock->has_wait) {
|
||||
error_setg(errp, "%s",
|
||||
"'wait' option is incompatible with "
|
||||
"socket in client connect mode");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void qmp_chardev_open_socket(Chardev *chr,
|
||||
ChardevBackend *backend,
|
||||
bool *be_opened,
|
||||
@@ -1001,14 +1281,8 @@ static void qmp_chardev_open_socket(Chardev *chr,
|
||||
bool is_waitconnect = sock->has_wait ? sock->wait : false;
|
||||
bool is_websock = sock->has_websocket ? sock->websocket : false;
|
||||
int64_t reconnect = sock->has_reconnect ? sock->reconnect : 0;
|
||||
QIOChannelSocket *sioc = NULL;
|
||||
SocketAddress *addr;
|
||||
|
||||
if (!is_listen && is_websock) {
|
||||
error_setg(errp, "%s", "Websocket client is not implemented");
|
||||
goto error;
|
||||
}
|
||||
|
||||
s->is_listen = is_listen;
|
||||
s->is_telnet = is_telnet;
|
||||
s->is_tn3270 = is_tn3270;
|
||||
@@ -1021,7 +1295,7 @@ static void qmp_chardev_open_socket(Chardev *chr,
|
||||
if (!creds) {
|
||||
error_setg(errp, "No TLS credentials with id '%s'",
|
||||
sock->tls_creds);
|
||||
goto error;
|
||||
return;
|
||||
}
|
||||
s->tls_creds = (QCryptoTLSCreds *)
|
||||
object_dynamic_cast(creds,
|
||||
@@ -1029,30 +1303,30 @@ static void qmp_chardev_open_socket(Chardev *chr,
|
||||
if (!s->tls_creds) {
|
||||
error_setg(errp, "Object with id '%s' is not TLS credentials",
|
||||
sock->tls_creds);
|
||||
goto error;
|
||||
return;
|
||||
}
|
||||
object_ref(OBJECT(s->tls_creds));
|
||||
if (is_listen) {
|
||||
if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) {
|
||||
error_setg(errp, "%s",
|
||||
"Expected TLS credentials for server endpoint");
|
||||
goto error;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (s->tls_creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT) {
|
||||
error_setg(errp, "%s",
|
||||
"Expected TLS credentials for client endpoint");
|
||||
goto error;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s->addr = addr = socket_address_flatten(sock->addr);
|
||||
|
||||
if (sock->has_reconnect && addr->type == SOCKET_ADDRESS_TYPE_FD) {
|
||||
error_setg(errp, "'reconnect' option is incompatible with 'fd'");
|
||||
goto error;
|
||||
if (!qmp_chardev_validate_socket(sock, addr, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_RECONNECTABLE);
|
||||
/* TODO SOCKET_ADDRESS_FD where fd has AF_UNIX */
|
||||
if (addr->type == SOCKET_ADDRESS_TYPE_UNIX) {
|
||||
@@ -1064,73 +1338,25 @@ static void qmp_chardev_open_socket(Chardev *chr,
|
||||
|
||||
update_disconnected_filename(s);
|
||||
|
||||
if (is_listen) {
|
||||
if (is_telnet || is_tn3270) {
|
||||
s->do_telnetopt = 1;
|
||||
if (s->is_listen) {
|
||||
if (qmp_chardev_open_socket_server(chr, is_telnet || is_tn3270,
|
||||
is_waitconnect, errp) < 0) {
|
||||
return;
|
||||
}
|
||||
} else if (reconnect > 0) {
|
||||
s->reconnect_time = reconnect;
|
||||
}
|
||||
|
||||
if (s->reconnect_time) {
|
||||
tcp_chr_connect_async(chr);
|
||||
} else {
|
||||
if (s->is_listen) {
|
||||
char *name;
|
||||
s->listener = qio_net_listener_new();
|
||||
|
||||
name = g_strdup_printf("chardev-tcp-listener-%s", chr->label);
|
||||
qio_net_listener_set_name(s->listener, name);
|
||||
g_free(name);
|
||||
|
||||
if (qio_net_listener_open_sync(s->listener, s->addr, errp) < 0) {
|
||||
object_unref(OBJECT(s->listener));
|
||||
s->listener = NULL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
qapi_free_SocketAddress(s->addr);
|
||||
s->addr = socket_local_address(s->listener->sioc[0]->fd, errp);
|
||||
update_disconnected_filename(s);
|
||||
|
||||
if (is_waitconnect &&
|
||||
qemu_chr_wait_connected(chr, errp) < 0) {
|
||||
return;
|
||||
}
|
||||
if (!s->ioc) {
|
||||
qio_net_listener_set_client_func_full(s->listener,
|
||||
tcp_chr_accept,
|
||||
chr, NULL,
|
||||
chr->gcontext);
|
||||
}
|
||||
} else if (qemu_chr_wait_connected(chr, errp) < 0) {
|
||||
goto error;
|
||||
if (qmp_chardev_open_socket_client(chr, reconnect, errp) < 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
if (sioc) {
|
||||
object_unref(OBJECT(sioc));
|
||||
}
|
||||
}
|
||||
|
||||
static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
|
||||
Error **errp)
|
||||
{
|
||||
bool is_listen = qemu_opt_get_bool(opts, "server", false);
|
||||
bool is_waitconnect = is_listen && qemu_opt_get_bool(opts, "wait", true);
|
||||
bool is_telnet = qemu_opt_get_bool(opts, "telnet", false);
|
||||
bool is_tn3270 = qemu_opt_get_bool(opts, "tn3270", false);
|
||||
bool is_websock = qemu_opt_get_bool(opts, "websocket", false);
|
||||
bool do_nodelay = !qemu_opt_get_bool(opts, "delay", true);
|
||||
int64_t reconnect = qemu_opt_get_number(opts, "reconnect", 0);
|
||||
const char *path = qemu_opt_get(opts, "path");
|
||||
const char *host = qemu_opt_get(opts, "host");
|
||||
const char *port = qemu_opt_get(opts, "port");
|
||||
const char *fd = qemu_opt_get(opts, "fd");
|
||||
const char *tls_creds = qemu_opt_get(opts, "tls-creds");
|
||||
SocketAddressLegacy *addr;
|
||||
ChardevSocket *sock;
|
||||
|
||||
@@ -1140,45 +1366,39 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
|
||||
return;
|
||||
}
|
||||
|
||||
backend->type = CHARDEV_BACKEND_KIND_SOCKET;
|
||||
if (path) {
|
||||
if (tls_creds) {
|
||||
error_setg(errp, "TLS can only be used over TCP socket");
|
||||
return;
|
||||
}
|
||||
} else if (host) {
|
||||
if (!port) {
|
||||
error_setg(errp, "chardev: socket: no port given");
|
||||
return;
|
||||
}
|
||||
} else if (fd) {
|
||||
/* We don't know what host to validate against when in client mode */
|
||||
if (tls_creds && !is_listen) {
|
||||
error_setg(errp, "TLS can not be used with pre-opened client FD");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
g_assert_not_reached();
|
||||
if (host && !port) {
|
||||
error_setg(errp, "chardev: socket: no port given");
|
||||
return;
|
||||
}
|
||||
|
||||
backend->type = CHARDEV_BACKEND_KIND_SOCKET;
|
||||
sock = backend->u.socket.data = g_new0(ChardevSocket, 1);
|
||||
qemu_chr_parse_common(opts, qapi_ChardevSocket_base(sock));
|
||||
|
||||
sock->has_nodelay = true;
|
||||
sock->nodelay = do_nodelay;
|
||||
sock->has_nodelay = qemu_opt_get(opts, "delay");
|
||||
sock->nodelay = !qemu_opt_get_bool(opts, "delay", true);
|
||||
/*
|
||||
* We have different default to QMP for 'server', hence
|
||||
* we can't just check for existence of 'server'
|
||||
*/
|
||||
sock->has_server = true;
|
||||
sock->server = is_listen;
|
||||
sock->has_telnet = true;
|
||||
sock->telnet = is_telnet;
|
||||
sock->has_tn3270 = true;
|
||||
sock->tn3270 = is_tn3270;
|
||||
sock->has_websocket = true;
|
||||
sock->websocket = is_websock;
|
||||
sock->has_wait = true;
|
||||
sock->wait = is_waitconnect;
|
||||
sock->server = qemu_opt_get_bool(opts, "server", false);
|
||||
sock->has_telnet = qemu_opt_get(opts, "telnet");
|
||||
sock->telnet = qemu_opt_get_bool(opts, "telnet", false);
|
||||
sock->has_tn3270 = qemu_opt_get(opts, "tn3270");
|
||||
sock->tn3270 = qemu_opt_get_bool(opts, "tn3270", false);
|
||||
sock->has_websocket = qemu_opt_get(opts, "websocket");
|
||||
sock->websocket = qemu_opt_get_bool(opts, "websocket", false);
|
||||
/*
|
||||
* We have different default to QMP for 'wait' when 'server'
|
||||
* is set, hence we can't just check for existence of 'wait'
|
||||
*/
|
||||
sock->has_wait = qemu_opt_find(opts, "wait") || sock->server;
|
||||
sock->wait = qemu_opt_get_bool(opts, "wait", true);
|
||||
sock->has_reconnect = qemu_opt_find(opts, "reconnect");
|
||||
sock->reconnect = reconnect;
|
||||
sock->tls_creds = g_strdup(tls_creds);
|
||||
sock->reconnect = qemu_opt_get_number(opts, "reconnect", 0);
|
||||
sock->has_tls_creds = qemu_opt_get(opts, "tls-creds");
|
||||
sock->tls_creds = g_strdup(qemu_opt_get(opts, "tls-creds"));
|
||||
|
||||
addr = g_new0(SocketAddressLegacy, 1);
|
||||
if (path) {
|
||||
@@ -1223,7 +1443,7 @@ char_socket_get_connected(Object *obj, Error **errp)
|
||||
{
|
||||
SocketChardev *s = SOCKET_CHARDEV(obj);
|
||||
|
||||
return s->connected;
|
||||
return s->state == TCP_CHARDEV_STATE_CONNECTED;
|
||||
}
|
||||
|
||||
static void char_socket_class_init(ObjectClass *oc, void *data)
|
||||
|
@@ -490,6 +490,8 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename,
|
||||
return opts;
|
||||
}
|
||||
|
||||
error_report("'%s' is not a valid char driver", filename);
|
||||
|
||||
fail:
|
||||
qemu_opts_del(opts);
|
||||
return NULL;
|
||||
@@ -634,7 +636,8 @@ ChardevBackend *qemu_chr_parse_opts(QemuOpts *opts, Error **errp)
|
||||
return backend;
|
||||
}
|
||||
|
||||
Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
|
||||
Chardev *qemu_chr_new_from_opts(QemuOpts *opts, GMainContext *context,
|
||||
Error **errp)
|
||||
{
|
||||
const ChardevClass *cc;
|
||||
Chardev *chr = NULL;
|
||||
@@ -674,7 +677,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
|
||||
|
||||
chr = qemu_chardev_new(bid ? bid : id,
|
||||
object_class_get_name(OBJECT_CLASS(cc)),
|
||||
backend, errp);
|
||||
backend, context, errp);
|
||||
|
||||
if (chr == NULL) {
|
||||
goto out;
|
||||
@@ -687,7 +690,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
|
||||
backend->type = CHARDEV_BACKEND_KIND_MUX;
|
||||
backend->u.mux.data = g_new0(ChardevMux, 1);
|
||||
backend->u.mux.data->chardev = g_strdup(bid);
|
||||
mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, errp);
|
||||
mux = qemu_chardev_new(id, TYPE_CHARDEV_MUX, backend, context, errp);
|
||||
if (mux == NULL) {
|
||||
object_unparent(OBJECT(chr));
|
||||
chr = NULL;
|
||||
@@ -703,7 +706,7 @@ out:
|
||||
}
|
||||
|
||||
Chardev *qemu_chr_new_noreplay(const char *label, const char *filename,
|
||||
bool permit_mux_mon)
|
||||
bool permit_mux_mon, GMainContext *context)
|
||||
{
|
||||
const char *p;
|
||||
Chardev *chr;
|
||||
@@ -718,7 +721,7 @@ Chardev *qemu_chr_new_noreplay(const char *label, const char *filename,
|
||||
if (!opts)
|
||||
return NULL;
|
||||
|
||||
chr = qemu_chr_new_from_opts(opts, &err);
|
||||
chr = qemu_chr_new_from_opts(opts, context, &err);
|
||||
if (!chr) {
|
||||
error_report_err(err);
|
||||
goto out;
|
||||
@@ -736,10 +739,11 @@ out:
|
||||
|
||||
static Chardev *qemu_chr_new_permit_mux_mon(const char *label,
|
||||
const char *filename,
|
||||
bool permit_mux_mon)
|
||||
bool permit_mux_mon,
|
||||
GMainContext *context)
|
||||
{
|
||||
Chardev *chr;
|
||||
chr = qemu_chr_new_noreplay(label, filename, permit_mux_mon);
|
||||
chr = qemu_chr_new_noreplay(label, filename, permit_mux_mon, context);
|
||||
if (chr) {
|
||||
if (replay_mode != REPLAY_MODE_NONE) {
|
||||
qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_REPLAY);
|
||||
@@ -753,14 +757,16 @@ static Chardev *qemu_chr_new_permit_mux_mon(const char *label,
|
||||
return chr;
|
||||
}
|
||||
|
||||
Chardev *qemu_chr_new(const char *label, const char *filename)
|
||||
Chardev *qemu_chr_new(const char *label, const char *filename,
|
||||
GMainContext *context)
|
||||
{
|
||||
return qemu_chr_new_permit_mux_mon(label, filename, false);
|
||||
return qemu_chr_new_permit_mux_mon(label, filename, false, context);
|
||||
}
|
||||
|
||||
Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename)
|
||||
Chardev *qemu_chr_new_mux_mon(const char *label, const char *filename,
|
||||
GMainContext *context)
|
||||
{
|
||||
return qemu_chr_new_permit_mux_mon(label, filename, true);
|
||||
return qemu_chr_new_permit_mux_mon(label, filename, true, context);
|
||||
}
|
||||
|
||||
static int qmp_query_chardev_foreach(Object *obj, void *data)
|
||||
@@ -935,6 +941,7 @@ void qemu_chr_set_feature(Chardev *chr,
|
||||
|
||||
Chardev *qemu_chardev_new(const char *id, const char *typename,
|
||||
ChardevBackend *backend,
|
||||
GMainContext *gcontext,
|
||||
Error **errp)
|
||||
{
|
||||
Object *obj;
|
||||
@@ -947,6 +954,7 @@ Chardev *qemu_chardev_new(const char *id, const char *typename,
|
||||
obj = object_new(typename);
|
||||
chr = CHARDEV(obj);
|
||||
chr->label = g_strdup(id);
|
||||
chr->gcontext = gcontext;
|
||||
|
||||
qemu_char_open(chr, backend, &be_opened, &local_err);
|
||||
if (local_err) {
|
||||
@@ -991,7 +999,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
|
||||
}
|
||||
|
||||
chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
|
||||
backend, errp);
|
||||
backend, NULL, errp);
|
||||
if (!chr) {
|
||||
return NULL;
|
||||
}
|
||||
@@ -1049,7 +1057,7 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
|
||||
}
|
||||
|
||||
chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
|
||||
backend, errp);
|
||||
backend, chr->gcontext, errp);
|
||||
if (!chr_new) {
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -177,7 +177,7 @@ static void wctablet_input_sync(DeviceState *dev)
|
||||
}
|
||||
|
||||
static QemuInputHandler wctablet_handler = {
|
||||
.name = "QEMU Wacome Pen Tablet",
|
||||
.name = "QEMU Wacom Pen Tablet",
|
||||
.mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_ABS,
|
||||
.event = wctablet_input_event,
|
||||
.sync = wctablet_input_sync,
|
||||
|
109
configure
vendored
109
configure
vendored
@@ -817,6 +817,7 @@ DragonFly)
|
||||
;;
|
||||
NetBSD)
|
||||
bsd="yes"
|
||||
hax="yes"
|
||||
make="${MAKE-gmake}"
|
||||
audio_drv_list="oss try-sdl"
|
||||
audio_possible_drivers="oss sdl"
|
||||
@@ -1768,7 +1769,7 @@ disabled with --disable-FEATURE, default is enabled if available:
|
||||
virglrenderer virgl rendering support
|
||||
xfsctl xfsctl support
|
||||
qom-cast-debug cast debugging support
|
||||
tools build qemu-io, qemu-nbd and qemu-image tools
|
||||
tools build qemu-io, qemu-nbd and qemu-img tools
|
||||
vxhs Veritas HyperScale vDisk backend support
|
||||
bochs bochs image format support
|
||||
cloop cloop image format support
|
||||
@@ -1834,8 +1835,8 @@ fi
|
||||
# Consult white-list to determine whether to enable werror
|
||||
# by default. Only enable by default for git builds
|
||||
if test -z "$werror" ; then
|
||||
if test -d "$source_path/.git" -a \
|
||||
\( "$linux" = "yes" -o "$mingw32" = "yes" \) ; then
|
||||
if test -d "$source_path/.git" && \
|
||||
{ test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
|
||||
werror="yes"
|
||||
else
|
||||
werror="no"
|
||||
@@ -1881,7 +1882,6 @@ gcc_flags="-Wno-missing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
|
||||
gcc_flags="-Wendif-labels -Wno-shift-negative-value $gcc_flags"
|
||||
gcc_flags="-Wno-initializer-overrides -Wexpansion-to-defined $gcc_flags"
|
||||
gcc_flags="-Wno-string-plus-int $gcc_flags"
|
||||
gcc_flags="-Wno-error=address-of-packed-member $gcc_flags"
|
||||
# Note that we do not add -Werror to gcc_flags here, because that would
|
||||
# enable it for all configure tests. If a configure test failed due
|
||||
# to -Werror this would just silently disable some features,
|
||||
@@ -2940,7 +2940,7 @@ EOF
|
||||
sdl=yes
|
||||
|
||||
# static link with sdl ? (note: sdl.pc's --static --libs is broken)
|
||||
if test "$sdl" = "yes" -a "$static" = "yes" ; then
|
||||
if test "$sdl" = "yes" && test "$static" = "yes" ; then
|
||||
if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
|
||||
sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)"
|
||||
sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)"
|
||||
@@ -3082,7 +3082,7 @@ fi
|
||||
|
||||
##########################################
|
||||
# VNC SASL detection
|
||||
if test "$vnc" = "yes" -a "$vnc_sasl" != "no" ; then
|
||||
if test "$vnc" = "yes" && test "$vnc_sasl" != "no" ; then
|
||||
cat > $TMPC <<EOF
|
||||
#include <sasl/sasl.h>
|
||||
#include <stdio.h>
|
||||
@@ -3105,7 +3105,7 @@ fi
|
||||
|
||||
##########################################
|
||||
# VNC JPEG detection
|
||||
if test "$vnc" = "yes" -a "$vnc_jpeg" != "no" ; then
|
||||
if test "$vnc" = "yes" && test "$vnc_jpeg" != "no" ; then
|
||||
cat > $TMPC <<EOF
|
||||
#include <stdio.h>
|
||||
#include <jpeglib.h>
|
||||
@@ -3127,7 +3127,7 @@ fi
|
||||
|
||||
##########################################
|
||||
# VNC PNG detection
|
||||
if test "$vnc" = "yes" -a "$vnc_png" != "no" ; then
|
||||
if test "$vnc" = "yes" && test "$vnc_png" != "no" ; then
|
||||
cat > $TMPC <<EOF
|
||||
//#include <stdio.h>
|
||||
#include <png.h>
|
||||
@@ -3350,10 +3350,6 @@ for drv in $audio_drv_list; do
|
||||
oss_libs="$oss_lib"
|
||||
;;
|
||||
|
||||
wav)
|
||||
# XXX: Probes for CoreAudio, DirectSound
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
|
||||
error_exit "Unknown driver '$drv' selected" \
|
||||
@@ -3491,7 +3487,7 @@ fi
|
||||
# This workaround is required due to a bug in pkg-config file for glib as it
|
||||
# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
|
||||
|
||||
if test "$static" = yes -a "$mingw32" = yes; then
|
||||
if test "$static" = yes && test "$mingw32" = yes; then
|
||||
QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS"
|
||||
fi
|
||||
|
||||
@@ -3584,7 +3580,7 @@ fi
|
||||
##########################################
|
||||
# pixman support probe
|
||||
|
||||
if test "$want_tools" = "no" -a "$softmmu" = "no"; then
|
||||
if test "$want_tools" = "no" && test "$softmmu" = "no"; then
|
||||
pixman_cflags=
|
||||
pixman_libs=
|
||||
elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
|
||||
@@ -3699,7 +3695,7 @@ else
|
||||
done
|
||||
fi
|
||||
|
||||
if test "$mingw32" != yes -a "$pthread" = no; then
|
||||
if test "$mingw32" != yes && test "$pthread" = no; then
|
||||
error_exit "pthread check failed" \
|
||||
"Make sure to have the pthread libs and headers installed."
|
||||
fi
|
||||
@@ -3826,7 +3822,7 @@ fi
|
||||
##########################################
|
||||
# TPM passthrough is only on x86 Linux
|
||||
|
||||
if test "$targetos" = Linux && test "$cpu" = i386 -o "$cpu" = x86_64; then
|
||||
if test "$targetos" = Linux && { test "$cpu" = i386 || test "$cpu" = x86_64; }; then
|
||||
tpm_passthrough=$tpm
|
||||
else
|
||||
tpm_passthrough=no
|
||||
@@ -3992,7 +3988,7 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$opengl" = "yes" -a "$have_x11" = "yes"; then
|
||||
if test "$opengl" = "yes" && test "$have_x11" = "yes"; then
|
||||
for target in $target_list; do
|
||||
case $target in
|
||||
lm32-softmmu) # milkymist-tmu2 requires X11 and OpenGL
|
||||
@@ -4266,10 +4262,25 @@ fi
|
||||
# check for usbfs
|
||||
have_usbfs=no
|
||||
if test "$linux_user" = "yes"; then
|
||||
if check_include linux/usbdevice_fs.h; then
|
||||
cat > $TMPC << EOF
|
||||
#include <linux/usbdevice_fs.h>
|
||||
|
||||
#ifndef USBDEVFS_GET_CAPABILITIES
|
||||
#error "USBDEVFS_GET_CAPABILITIES undefined"
|
||||
#endif
|
||||
|
||||
#ifndef USBDEVFS_DISCONNECT_CLAIM
|
||||
#error "USBDEVFS_DISCONNECT_CLAIM undefined"
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" ""; then
|
||||
have_usbfs=yes
|
||||
fi
|
||||
have_usbfs=yes
|
||||
fi
|
||||
|
||||
# check for fallocate
|
||||
@@ -4612,9 +4623,17 @@ elif compile_prog "" "$pthread_lib -lrt" ; then
|
||||
libs_qga="$libs_qga -lrt"
|
||||
fi
|
||||
|
||||
if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
|
||||
"$haiku" != "yes" ; then
|
||||
# Check whether we need to link libutil for openpty()
|
||||
cat > $TMPC << EOF
|
||||
extern int openpty(int *am, int *as, char *name, void *termp, void *winp);
|
||||
int main(void) { return openpty(0, 0, 0, 0, 0); }
|
||||
EOF
|
||||
|
||||
if ! compile_prog "" "" ; then
|
||||
if compile_prog "" "-lutil" ; then
|
||||
libs_softmmu="-lutil $libs_softmmu"
|
||||
libs_tools="-lutil $libs_tools"
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
@@ -4688,7 +4707,8 @@ fi
|
||||
##########################################
|
||||
# check if we have VSS SDK headers for win
|
||||
|
||||
if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$vss_win32_sdk" != "no" ; then
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
|
||||
test "$vss_win32_sdk" != "no" ; then
|
||||
case "$vss_win32_sdk" in
|
||||
"") vss_win32_include="-isystem $source_path" ;;
|
||||
*\ *) # The SDK is installed in "Program Files" by default, but we cannot
|
||||
@@ -4727,7 +4747,8 @@ fi
|
||||
# VSS provider from the source. It is usually unnecessary because the
|
||||
# pre-compiled .tlb file is included.
|
||||
|
||||
if test "$mingw32" = "yes" -a "$guest_agent" != "no" -a "$guest_agent_with_vss" = "yes" ; then
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
|
||||
test "$guest_agent_with_vss" = "yes" ; then
|
||||
if test -z "$win_sdk"; then
|
||||
programfiles="$PROGRAMFILES"
|
||||
test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
|
||||
@@ -4743,7 +4764,7 @@ fi
|
||||
|
||||
##########################################
|
||||
# check if mingw environment provides a recent ntddscsi.h
|
||||
if test "$mingw32" = "yes" -a "$guest_agent" != "no"; then
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
|
||||
cat > $TMPC << EOF
|
||||
#include <windows.h>
|
||||
#include <ntddscsi.h>
|
||||
@@ -4790,7 +4811,7 @@ case "$capstone" in
|
||||
"" | yes)
|
||||
if $pkg_config capstone; then
|
||||
capstone=system
|
||||
elif test -e "${source_path}/.git" -a $git_update = 'yes' ; then
|
||||
elif test -e "${source_path}/.git" && test $git_update = 'yes' ; then
|
||||
capstone=git
|
||||
elif test -e "${source_path}/capstone/Makefile" ; then
|
||||
capstone=internal
|
||||
@@ -5162,7 +5183,7 @@ fi
|
||||
# There is no point enabling this if cpuid.h is not usable,
|
||||
# since we won't be able to select the new routines.
|
||||
|
||||
if test "$cpuid_h" = "yes" -a "$avx2_opt" != "no"; then
|
||||
if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
|
||||
cat > $TMPC << EOF
|
||||
#pragma GCC push_options
|
||||
#pragma GCC target("avx2")
|
||||
@@ -5220,7 +5241,7 @@ EOF
|
||||
fi
|
||||
|
||||
cmpxchg128=no
|
||||
if test "$int128" = yes -a "$atomic128" = no; then
|
||||
if test "$int128" = yes && test "$atomic128" = no; then
|
||||
cat > $TMPC << EOF
|
||||
int main(void)
|
||||
{
|
||||
@@ -5782,8 +5803,8 @@ if test "$want_tools" = "yes" ; then
|
||||
if [ "$ivshmem" = "yes" ]; then
|
||||
tools="ivshmem-client\$(EXESUF) ivshmem-server\$(EXESUF) $tools"
|
||||
fi
|
||||
if [ "$posix" = "yes" ] && [ "$curl" = "yes" ]; then
|
||||
tools="elf2dmp $tools"
|
||||
if [ "$curl" = "yes" ]; then
|
||||
tools="elf2dmp\$(EXESUF) $tools"
|
||||
fi
|
||||
fi
|
||||
if test "$softmmu" = yes ; then
|
||||
@@ -5893,9 +5914,9 @@ fi
|
||||
|
||||
# Mac OS X ships with a broken assembler
|
||||
roms=
|
||||
if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
|
||||
"$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
|
||||
"$softmmu" = yes ; then
|
||||
if { test "$cpu" = "i386" || test "$cpu" = "x86_64"; } && \
|
||||
test "$targetos" != "Darwin" && test "$targetos" != "SunOS" && \
|
||||
test "$softmmu" = yes ; then
|
||||
# Different host OS linkers have different ideas about the name of the ELF
|
||||
# emulation. Linux and OpenBSD/amd64 use 'elf_i386'; FreeBSD uses the _fbsd
|
||||
# variant; OpenBSD/i386 uses the _obsd variant; and Windows uses i386pe.
|
||||
@@ -5907,7 +5928,7 @@ if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
|
||||
if test "$cpu" = "ppc64" && test "$targetos" != "Darwin" ; then
|
||||
roms="$roms spapr-rtas"
|
||||
fi
|
||||
|
||||
@@ -6373,7 +6394,7 @@ if test "$modules" = "yes"; then
|
||||
echo "CONFIG_STAMP=_$( (echo $qemu_version; echo $pkgversion; cat $0) | $shacmd - | cut -f1 -d\ )" >> $config_host_mak
|
||||
echo "CONFIG_MODULES=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$have_x11" = "yes" -a "$need_x11" = "yes"; then
|
||||
if test "$have_x11" = "yes" && test "$need_x11" = "yes"; then
|
||||
echo "CONFIG_X11=y" >> $config_host_mak
|
||||
echo "X11_CFLAGS=$x11_cflags" >> $config_host_mak
|
||||
echo "X11_LIBS=$x11_libs" >> $config_host_mak
|
||||
@@ -6568,7 +6589,7 @@ fi
|
||||
if test "$vhost_scsi" = "yes" ; then
|
||||
echo "CONFIG_VHOST_SCSI=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$vhost_net" = "yes" -a "$vhost_user" = "yes"; then
|
||||
if test "$vhost_net" = "yes" && test "$vhost_user" = "yes"; then
|
||||
echo "CONFIG_VHOST_NET_USED=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$vhost_crypto" = "yes" ; then
|
||||
@@ -6963,11 +6984,11 @@ elif test "$ARCH" = "sparc64" ; then
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "s390x" ; then
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then
|
||||
elif test "$ARCH" = "x86_64" || test "$ARCH" = "x32" ; then
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "ppc64" ; then
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES"
|
||||
elif test "$ARCH" = "riscv32" -o "$ARCH" = "riscv64" ; then
|
||||
elif test "$ARCH" = "riscv32" || test "$ARCH" = "riscv64" ; then
|
||||
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/riscv $QEMU_INCLUDES"
|
||||
else
|
||||
QEMU_INCLUDES="-iquote \$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES"
|
||||
@@ -7129,14 +7150,14 @@ TARGET_ABI_DIR=""
|
||||
case "$target_name" in
|
||||
i386)
|
||||
mttcg="yes"
|
||||
gdb_xml_files="i386-32bit.xml i386-32bit-core.xml i386-32bit-sse.xml"
|
||||
gdb_xml_files="i386-32bit.xml"
|
||||
target_compiler=$cross_cc_i386
|
||||
target_compiler_cflags=$cross_cc_ccflags_i386
|
||||
;;
|
||||
x86_64)
|
||||
TARGET_BASE_ARCH=i386
|
||||
mttcg="yes"
|
||||
gdb_xml_files="i386-64bit.xml i386-64bit-core.xml i386-64bit-sse.xml"
|
||||
gdb_xml_files="i386-64bit.xml"
|
||||
target_compiler=$cross_cc_x86_64
|
||||
;;
|
||||
alpha)
|
||||
@@ -7182,11 +7203,13 @@ case "$target_name" in
|
||||
target_compiler=$cross_cc_microblaze
|
||||
;;
|
||||
mips|mipsel)
|
||||
mttcg="yes"
|
||||
TARGET_ARCH=mips
|
||||
target_compiler=$cross_cc_mips
|
||||
echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
|
||||
;;
|
||||
mipsn32|mipsn32el)
|
||||
mttcg="yes"
|
||||
TARGET_ARCH=mips64
|
||||
TARGET_BASE_ARCH=mips
|
||||
target_compiler=$cross_cc_mipsn32
|
||||
@@ -7194,6 +7217,7 @@ case "$target_name" in
|
||||
echo "TARGET_ABI32=y" >> $config_target_mak
|
||||
;;
|
||||
mips64|mips64el)
|
||||
mttcg="yes"
|
||||
TARGET_ARCH=mips64
|
||||
TARGET_BASE_ARCH=mips
|
||||
target_compiler=$cross_cc_mips64
|
||||
@@ -7384,7 +7408,7 @@ if test ! -z "$gdb_xml_files" ; then
|
||||
echo "TARGET_XML_FILES=$list" >> $config_target_mak
|
||||
fi
|
||||
|
||||
if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
|
||||
if test "$target_user_only" = "yes" && test "$bflt" = "yes"; then
|
||||
echo "TARGET_HAS_BFLT=y" >> $config_target_mak
|
||||
fi
|
||||
if test "$target_bsd_user" = "yes" ; then
|
||||
@@ -7506,7 +7530,7 @@ if test "$gprof" = "yes" ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
|
||||
if test "$target_linux_user" = "yes" || test "$target_bsd_user" = "yes" ; then
|
||||
ldflags="$ldflags $textseg_ldflags"
|
||||
fi
|
||||
|
||||
@@ -7518,7 +7542,8 @@ fi
|
||||
# - we build the system emulation for s390x (qemu-system-s390x)
|
||||
# - KVM is enabled
|
||||
# - the linker supports --s390-pgste
|
||||
if test "$TARGET_ARCH" = "s390x" -a "$target_softmmu" = "yes" -a "$ARCH" = "s390x" -a "$kvm" = "yes"; then
|
||||
if test "$TARGET_ARCH" = "s390x" && test "$target_softmmu" = "yes" && \
|
||||
test "$ARCH" = "s390x" && test "$kvm" = "yes"; then
|
||||
if ld_has --s390-pgste ; then
|
||||
ldflags="-Wl,--s390-pgste $ldflags"
|
||||
fi
|
||||
|
@@ -25,11 +25,15 @@ typedef struct DBGKD_GET_VERSION64 {
|
||||
uint64_t DebuggerDataList;
|
||||
} DBGKD_GET_VERSION64;
|
||||
|
||||
#ifndef _WIN32
|
||||
typedef struct LIST_ENTRY64 {
|
||||
struct LIST_ENTRY64 *Flink;
|
||||
struct LIST_ENTRY64 *Blink;
|
||||
} LIST_ENTRY64;
|
||||
#endif
|
||||
|
||||
typedef struct DBGKD_DEBUG_DATA_HEADER64 {
|
||||
struct LIST_ENTRY64 {
|
||||
struct LIST_ENTRY64 *Flink;
|
||||
struct LIST_ENTRY64 *Blink;
|
||||
} List;
|
||||
LIST_ENTRY64 List;
|
||||
uint32_t OwnerTag;
|
||||
uint32_t Size;
|
||||
} DBGKD_DEBUG_DATA_HEADER64;
|
||||
|
@@ -5,6 +5,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "err.h"
|
||||
#include "addrspace.h"
|
||||
@@ -41,7 +43,8 @@ static const uint64_t SharedUserData = 0xfffff78000000000;
|
||||
#define KUSD_OFFSET_PRODUCT_TYPE 0x264
|
||||
|
||||
#define SYM_RESOLVE(base, r, s) ((s = pdb_resolve(base, r, #s)),\
|
||||
s ? printf(#s" = 0x%016lx\n", s) : eprintf("Failed to resolve "#s"\n"), s)
|
||||
s ? printf(#s" = 0x%016"PRIx64"\n", s) :\
|
||||
eprintf("Failed to resolve "#s"\n"), s)
|
||||
|
||||
static uint64_t rol(uint64_t x, uint64_t y)
|
||||
{
|
||||
@@ -98,8 +101,8 @@ static KDDEBUGGER_DATA64 *get_kdbg(uint64_t KernBase, struct pdb_reader *pdb,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
printf("[KiWaitNever] = 0x%016lx\n", kwn);
|
||||
printf("[KiWaitAlways] = 0x%016lx\n", kwa);
|
||||
printf("[KiWaitNever] = 0x%016"PRIx64"\n", kwn);
|
||||
printf("[KiWaitAlways] = 0x%016"PRIx64"\n", kwa);
|
||||
|
||||
/*
|
||||
* If KDBG header can be decoded, KDBG size is available
|
||||
@@ -202,7 +205,7 @@ static int fix_dtb(struct va_space *vs, QEMU_Elf *qe)
|
||||
|
||||
if (is_system(s)) {
|
||||
va_space_set_dtb(vs, s->cr[3]);
|
||||
printf("DTB 0x%016lx has been found from CPU #%zu"
|
||||
printf("DTB 0x%016"PRIx64" has been found from CPU #%zu"
|
||||
" as system task CR3\n", vs->dtb, i);
|
||||
return !(va_space_resolve(vs, SharedUserData));
|
||||
}
|
||||
@@ -222,7 +225,7 @@ static int fix_dtb(struct va_space *vs, QEMU_Elf *qe)
|
||||
}
|
||||
|
||||
va_space_set_dtb(vs, *cr3);
|
||||
printf("DirectoryTableBase = 0x%016lx has been found from CPU #0"
|
||||
printf("DirectoryTableBase = 0x%016"PRIx64" has been found from CPU #0"
|
||||
" as interrupt handling CR3\n", vs->dtb);
|
||||
return !(va_space_resolve(vs, SharedUserData));
|
||||
}
|
||||
@@ -393,8 +396,8 @@ static int pe_get_pdb_symstore_hash(uint64_t base, void *start_addr,
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Debug Directory RVA = 0x%016x\n",
|
||||
data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress);
|
||||
printf("Debug Directory RVA = 0x%08"PRIx32"\n",
|
||||
(uint32_t)data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress);
|
||||
|
||||
if (va_space_rw(vs,
|
||||
base + data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress,
|
||||
@@ -488,7 +491,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
state = qemu_elf.state[0];
|
||||
printf("CPU #0 CR3 is 0x%016lx\n", state->cr[3]);
|
||||
printf("CPU #0 CR3 is 0x%016"PRIx64"\n", state->cr[3]);
|
||||
|
||||
va_space_create(&vs, &ps, state->cr[3]);
|
||||
if (fix_dtb(&vs, &qemu_elf)) {
|
||||
@@ -497,7 +500,7 @@ int main(int argc, char *argv[])
|
||||
goto out_elf;
|
||||
}
|
||||
|
||||
printf("CPU #0 IDT is at 0x%016lx\n", state->idt.base);
|
||||
printf("CPU #0 IDT is at 0x%016"PRIx64"\n", state->idt.base);
|
||||
|
||||
if (va_space_rw(&vs, state->idt.base,
|
||||
&first_idt_desc, sizeof(first_idt_desc), 0)) {
|
||||
@@ -505,10 +508,10 @@ int main(int argc, char *argv[])
|
||||
err = 1;
|
||||
goto out_ps;
|
||||
}
|
||||
printf("CPU #0 IDT[0] -> 0x%016lx\n", idt_desc_addr(first_idt_desc));
|
||||
printf("CPU #0 IDT[0] -> 0x%016"PRIx64"\n", idt_desc_addr(first_idt_desc));
|
||||
|
||||
KernBase = idt_desc_addr(first_idt_desc) & ~(PAGE_SIZE - 1);
|
||||
printf("Searching kernel downwards from 0x%16lx...\n", KernBase);
|
||||
printf("Searching kernel downwards from 0x%016"PRIx64"...\n", KernBase);
|
||||
|
||||
for (; KernBase >= 0xfffff78000000000; KernBase -= PAGE_SIZE) {
|
||||
nt_start_addr = va_space_resolve(&vs, KernBase);
|
||||
@@ -521,7 +524,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
printf("KernBase = 0x%16lx, signature is \'%.2s\'\n", KernBase,
|
||||
printf("KernBase = 0x%016"PRIx64", signature is \'%.2s\'\n", KernBase,
|
||||
(char *)nt_start_addr);
|
||||
|
||||
if (pe_get_pdb_symstore_hash(KernBase, nt_start_addr, pdb_hash, &vs)) {
|
||||
|
@@ -18,6 +18,8 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "pdb.h"
|
||||
#include "err.h"
|
||||
@@ -66,7 +68,7 @@ uint64_t pdb_find_public_v3_symbol(struct pdb_reader *r, const char *name)
|
||||
uint32_t sect_rva = segment->dword[1];
|
||||
uint64_t rva = sect_rva + sym->public_v3.offset;
|
||||
|
||||
printf("%s: 0x%016x(%d:\'%.8s\') + 0x%08x = 0x%09lx\n", name,
|
||||
printf("%s: 0x%016x(%d:\'%.8s\') + 0x%08x = 0x%09"PRIx64"\n", name,
|
||||
sect_rva, sym->public_v3.segment,
|
||||
((char *)segment - 8), sym->public_v3.offset, rva);
|
||||
return rva;
|
||||
@@ -277,28 +279,18 @@ static void pdb_reader_exit(struct pdb_reader *r)
|
||||
|
||||
int pdb_init_from_file(const char *name, struct pdb_reader *reader)
|
||||
{
|
||||
GError *gerr = NULL;
|
||||
int err = 0;
|
||||
int fd;
|
||||
void *map;
|
||||
struct stat st;
|
||||
|
||||
fd = open(name, O_RDONLY, 0);
|
||||
if (fd == -1) {
|
||||
eprintf("Failed to open PDB file \'%s\'\n", name);
|
||||
reader->gmf = g_mapped_file_new(name, TRUE, &gerr);
|
||||
if (gerr) {
|
||||
eprintf("Failed to map PDB file \'%s\'\n", name);
|
||||
return 1;
|
||||
}
|
||||
reader->fd = fd;
|
||||
|
||||
fstat(fd, &st);
|
||||
reader->file_size = st.st_size;
|
||||
|
||||
map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
if (map == MAP_FAILED) {
|
||||
eprintf("Failed to map PDB file\n");
|
||||
err = 1;
|
||||
goto out_fd;
|
||||
}
|
||||
|
||||
reader->file_size = g_mapped_file_get_length(reader->gmf);
|
||||
map = g_mapped_file_get_contents(reader->gmf);
|
||||
if (pdb_reader_init(reader, map)) {
|
||||
err = 1;
|
||||
goto out_unmap;
|
||||
@@ -307,16 +299,13 @@ int pdb_init_from_file(const char *name, struct pdb_reader *reader)
|
||||
return 0;
|
||||
|
||||
out_unmap:
|
||||
munmap(map, st.st_size);
|
||||
out_fd:
|
||||
close(fd);
|
||||
g_mapped_file_unref(reader->gmf);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void pdb_exit(struct pdb_reader *reader)
|
||||
{
|
||||
munmap(reader->ds.header, reader->file_size);
|
||||
close(reader->fd);
|
||||
g_mapped_file_unref(reader->gmf);
|
||||
pdb_reader_exit(reader);
|
||||
}
|
||||
|
@@ -9,12 +9,14 @@
|
||||
#define PDB_H
|
||||
|
||||
|
||||
#ifndef _WIN32
|
||||
typedef struct GUID {
|
||||
unsigned int Data1;
|
||||
unsigned short Data2;
|
||||
unsigned short Data3;
|
||||
unsigned char Data4[8];
|
||||
} GUID;
|
||||
#endif
|
||||
|
||||
struct PDB_FILE {
|
||||
uint32_t size;
|
||||
@@ -216,7 +218,7 @@ typedef struct pdb_seg {
|
||||
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
||||
|
||||
struct pdb_reader {
|
||||
int fd;
|
||||
GMappedFile *gmf;
|
||||
size_t file_size;
|
||||
struct {
|
||||
PDB_DS_HEADER *header;
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#define PE_H
|
||||
|
||||
|
||||
#ifndef _WIN32
|
||||
typedef struct IMAGE_DOS_HEADER {
|
||||
uint16_t e_magic; /* 0x00: MZ Header signature */
|
||||
uint16_t e_cblp; /* 0x02: Bytes on last page of file */
|
||||
@@ -87,8 +88,6 @@ typedef struct IMAGE_NT_HEADERS64 {
|
||||
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
|
||||
} __attribute__ ((packed)) IMAGE_NT_HEADERS64;
|
||||
|
||||
#define IMAGE_FILE_DEBUG_DIRECTORY 6
|
||||
|
||||
typedef struct IMAGE_DEBUG_DIRECTORY {
|
||||
uint32_t Characteristics;
|
||||
uint32_t TimeDateStamp;
|
||||
@@ -101,6 +100,9 @@ typedef struct IMAGE_DEBUG_DIRECTORY {
|
||||
} __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY;
|
||||
|
||||
#define IMAGE_DEBUG_TYPE_CODEVIEW 2
|
||||
#endif
|
||||
|
||||
#define IMAGE_FILE_DEBUG_DIRECTORY 6
|
||||
|
||||
typedef struct guid_t {
|
||||
uint32_t a;
|
||||
|
@@ -120,25 +120,17 @@ static void exit_states(QEMU_Elf *qe)
|
||||
|
||||
int QEMU_Elf_init(QEMU_Elf *qe, const char *filename)
|
||||
{
|
||||
GError *gerr = NULL;
|
||||
int err = 0;
|
||||
struct stat st;
|
||||
|
||||
qe->fd = open(filename, O_RDONLY, 0);
|
||||
if (qe->fd == -1) {
|
||||
eprintf("Failed to open ELF dump file \'%s\'\n", filename);
|
||||
qe->gmf = g_mapped_file_new(filename, TRUE, &gerr);
|
||||
if (gerr) {
|
||||
eprintf("Failed to map ELF dump file \'%s\'\n", filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fstat(qe->fd, &st);
|
||||
qe->size = st.st_size;
|
||||
|
||||
qe->map = mmap(NULL, qe->size, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE, qe->fd, 0);
|
||||
if (qe->map == MAP_FAILED) {
|
||||
eprintf("Failed to map ELF file\n");
|
||||
err = 1;
|
||||
goto out_fd;
|
||||
}
|
||||
qe->map = g_mapped_file_get_contents(qe->gmf);
|
||||
qe->size = g_mapped_file_get_length(qe->gmf);
|
||||
|
||||
if (init_states(qe)) {
|
||||
eprintf("Failed to extract QEMU CPU states\n");
|
||||
@@ -149,9 +141,7 @@ int QEMU_Elf_init(QEMU_Elf *qe, const char *filename)
|
||||
return 0;
|
||||
|
||||
out_unmap:
|
||||
munmap(qe->map, qe->size);
|
||||
out_fd:
|
||||
close(qe->fd);
|
||||
g_mapped_file_unref(qe->gmf);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -159,6 +149,5 @@ out_fd:
|
||||
void QEMU_Elf_exit(QEMU_Elf *qe)
|
||||
{
|
||||
exit_states(qe);
|
||||
munmap(qe->map, qe->size);
|
||||
close(qe->fd);
|
||||
g_mapped_file_unref(qe->gmf);
|
||||
}
|
||||
|
@@ -5,10 +5,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef QEMU_ELF_H
|
||||
#define QEMU_ELF_H
|
||||
#ifndef ELF2DMP_ELF_H
|
||||
#define ELF2DMP_ELF_H
|
||||
|
||||
#include <elf.h>
|
||||
#include "elf.h"
|
||||
|
||||
typedef struct QEMUCPUSegment {
|
||||
uint32_t selector;
|
||||
@@ -33,7 +33,7 @@ typedef struct QEMUCPUState {
|
||||
int is_system(QEMUCPUState *s);
|
||||
|
||||
typedef struct QEMU_Elf {
|
||||
int fd;
|
||||
GMappedFile *gmf;
|
||||
size_t size;
|
||||
void *map;
|
||||
QEMUCPUState **state;
|
||||
@@ -47,4 +47,4 @@ void QEMU_Elf_exit(QEMU_Elf *qe);
|
||||
Elf64_Phdr *elf64_getphdr(void *map);
|
||||
Elf64_Half elf_getphdrnum(void *map);
|
||||
|
||||
#endif /* QEMU_ELF_H */
|
||||
#endif /* ELF2DMP_ELF_H */
|
||||
|
2
cpus.c
2
cpus.c
@@ -1778,7 +1778,7 @@ static void qemu_cpu_kick_thread(CPUState *cpu)
|
||||
}
|
||||
cpu->thread_kicked = true;
|
||||
err = pthread_kill(cpu->thread->thread, SIG_IPI);
|
||||
if (err) {
|
||||
if (err && err != ESRCH) {
|
||||
fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
|
||||
exit(1);
|
||||
}
|
||||
|
414
crypto/aes.c
414
crypto/aes.c
@@ -1059,109 +1059,109 @@ const uint32_t AES_Td4[256] = {
|
||||
0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
|
||||
};
|
||||
static const u32 rcon[] = {
|
||||
0x01000000, 0x02000000, 0x04000000, 0x08000000,
|
||||
0x10000000, 0x20000000, 0x40000000, 0x80000000,
|
||||
0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
|
||||
0x01000000, 0x02000000, 0x04000000, 0x08000000,
|
||||
0x10000000, 0x20000000, 0x40000000, 0x80000000,
|
||||
0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
|
||||
};
|
||||
|
||||
/**
|
||||
* Expand the cipher key into the encryption key schedule.
|
||||
*/
|
||||
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key) {
|
||||
AES_KEY *key) {
|
||||
|
||||
u32 *rk;
|
||||
int i = 0;
|
||||
u32 temp;
|
||||
u32 *rk;
|
||||
int i = 0;
|
||||
u32 temp;
|
||||
|
||||
if (!userKey || !key)
|
||||
return -1;
|
||||
if (bits != 128 && bits != 192 && bits != 256)
|
||||
return -2;
|
||||
if (!userKey || !key)
|
||||
return -1;
|
||||
if (bits != 128 && bits != 192 && bits != 256)
|
||||
return -2;
|
||||
|
||||
rk = key->rd_key;
|
||||
rk = key->rd_key;
|
||||
|
||||
if (bits==128)
|
||||
key->rounds = 10;
|
||||
else if (bits==192)
|
||||
key->rounds = 12;
|
||||
else
|
||||
key->rounds = 14;
|
||||
if (bits==128)
|
||||
key->rounds = 10;
|
||||
else if (bits==192)
|
||||
key->rounds = 12;
|
||||
else
|
||||
key->rounds = 14;
|
||||
|
||||
rk[0] = GETU32(userKey );
|
||||
rk[1] = GETU32(userKey + 4);
|
||||
rk[2] = GETU32(userKey + 8);
|
||||
rk[3] = GETU32(userKey + 12);
|
||||
if (bits == 128) {
|
||||
while (1) {
|
||||
temp = rk[3];
|
||||
rk[4] = rk[0] ^
|
||||
rk[0] = GETU32(userKey );
|
||||
rk[1] = GETU32(userKey + 4);
|
||||
rk[2] = GETU32(userKey + 8);
|
||||
rk[3] = GETU32(userKey + 12);
|
||||
if (bits == 128) {
|
||||
while (1) {
|
||||
temp = rk[3];
|
||||
rk[4] = rk[0] ^
|
||||
(AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
|
||||
(AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(temp >> 24) ] & 0x000000ff) ^
|
||||
rcon[i];
|
||||
rk[5] = rk[1] ^ rk[4];
|
||||
rk[6] = rk[2] ^ rk[5];
|
||||
rk[7] = rk[3] ^ rk[6];
|
||||
if (++i == 10) {
|
||||
return 0;
|
||||
}
|
||||
rk += 4;
|
||||
}
|
||||
}
|
||||
rk[4] = GETU32(userKey + 16);
|
||||
rk[5] = GETU32(userKey + 20);
|
||||
if (bits == 192) {
|
||||
while (1) {
|
||||
temp = rk[ 5];
|
||||
rk[ 6] = rk[ 0] ^
|
||||
rcon[i];
|
||||
rk[5] = rk[1] ^ rk[4];
|
||||
rk[6] = rk[2] ^ rk[5];
|
||||
rk[7] = rk[3] ^ rk[6];
|
||||
if (++i == 10) {
|
||||
return 0;
|
||||
}
|
||||
rk += 4;
|
||||
}
|
||||
}
|
||||
rk[4] = GETU32(userKey + 16);
|
||||
rk[5] = GETU32(userKey + 20);
|
||||
if (bits == 192) {
|
||||
while (1) {
|
||||
temp = rk[ 5];
|
||||
rk[ 6] = rk[ 0] ^
|
||||
(AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
|
||||
(AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(temp >> 24) ] & 0x000000ff) ^
|
||||
rcon[i];
|
||||
rk[ 7] = rk[ 1] ^ rk[ 6];
|
||||
rk[ 8] = rk[ 2] ^ rk[ 7];
|
||||
rk[ 9] = rk[ 3] ^ rk[ 8];
|
||||
if (++i == 8) {
|
||||
return 0;
|
||||
}
|
||||
rk[10] = rk[ 4] ^ rk[ 9];
|
||||
rk[11] = rk[ 5] ^ rk[10];
|
||||
rk += 6;
|
||||
}
|
||||
}
|
||||
rk[6] = GETU32(userKey + 24);
|
||||
rk[7] = GETU32(userKey + 28);
|
||||
if (bits == 256) {
|
||||
while (1) {
|
||||
temp = rk[ 7];
|
||||
rk[ 8] = rk[ 0] ^
|
||||
rcon[i];
|
||||
rk[ 7] = rk[ 1] ^ rk[ 6];
|
||||
rk[ 8] = rk[ 2] ^ rk[ 7];
|
||||
rk[ 9] = rk[ 3] ^ rk[ 8];
|
||||
if (++i == 8) {
|
||||
return 0;
|
||||
}
|
||||
rk[10] = rk[ 4] ^ rk[ 9];
|
||||
rk[11] = rk[ 5] ^ rk[10];
|
||||
rk += 6;
|
||||
}
|
||||
}
|
||||
rk[6] = GETU32(userKey + 24);
|
||||
rk[7] = GETU32(userKey + 28);
|
||||
if (bits == 256) {
|
||||
while (1) {
|
||||
temp = rk[ 7];
|
||||
rk[ 8] = rk[ 0] ^
|
||||
(AES_Te4[(temp >> 16) & 0xff] & 0xff000000) ^
|
||||
(AES_Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(temp ) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(temp >> 24) ] & 0x000000ff) ^
|
||||
rcon[i];
|
||||
rk[ 9] = rk[ 1] ^ rk[ 8];
|
||||
rk[10] = rk[ 2] ^ rk[ 9];
|
||||
rk[11] = rk[ 3] ^ rk[10];
|
||||
if (++i == 7) {
|
||||
return 0;
|
||||
}
|
||||
temp = rk[11];
|
||||
rk[12] = rk[ 4] ^
|
||||
rcon[i];
|
||||
rk[ 9] = rk[ 1] ^ rk[ 8];
|
||||
rk[10] = rk[ 2] ^ rk[ 9];
|
||||
rk[11] = rk[ 3] ^ rk[10];
|
||||
if (++i == 7) {
|
||||
return 0;
|
||||
}
|
||||
temp = rk[11];
|
||||
rk[12] = rk[ 4] ^
|
||||
(AES_Te4[(temp >> 24) ] & 0xff000000) ^
|
||||
(AES_Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(temp ) & 0xff] & 0x000000ff);
|
||||
rk[13] = rk[ 5] ^ rk[12];
|
||||
rk[14] = rk[ 6] ^ rk[13];
|
||||
rk[15] = rk[ 7] ^ rk[14];
|
||||
rk[13] = rk[ 5] ^ rk[12];
|
||||
rk[14] = rk[ 6] ^ rk[13];
|
||||
rk[15] = rk[ 7] ^ rk[14];
|
||||
|
||||
rk += 8;
|
||||
}
|
||||
}
|
||||
rk += 8;
|
||||
}
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -1169,51 +1169,51 @@ int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
|
||||
* Expand the cipher key into the decryption key schedule.
|
||||
*/
|
||||
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
|
||||
AES_KEY *key) {
|
||||
AES_KEY *key) {
|
||||
|
||||
u32 *rk;
|
||||
int i, j, status;
|
||||
u32 temp;
|
||||
int i, j, status;
|
||||
u32 temp;
|
||||
|
||||
/* first, start with an encryption schedule */
|
||||
status = AES_set_encrypt_key(userKey, bits, key);
|
||||
if (status < 0)
|
||||
return status;
|
||||
/* first, start with an encryption schedule */
|
||||
status = AES_set_encrypt_key(userKey, bits, key);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
rk = key->rd_key;
|
||||
rk = key->rd_key;
|
||||
|
||||
/* invert the order of the round keys: */
|
||||
for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
|
||||
temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp;
|
||||
temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
|
||||
temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
|
||||
temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
|
||||
}
|
||||
/* apply the inverse MixColumn transform to all round keys but the first and the last: */
|
||||
for (i = 1; i < (key->rounds); i++) {
|
||||
rk += 4;
|
||||
rk[0] =
|
||||
/* invert the order of the round keys: */
|
||||
for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
|
||||
temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp;
|
||||
temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
|
||||
temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
|
||||
temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
|
||||
}
|
||||
/* apply the inverse MixColumn transform to all round keys but the first and the last: */
|
||||
for (i = 1; i < (key->rounds); i++) {
|
||||
rk += 4;
|
||||
rk[0] =
|
||||
AES_Td0[AES_Te4[(rk[0] >> 24) ] & 0xff] ^
|
||||
AES_Td1[AES_Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
|
||||
AES_Td2[AES_Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
|
||||
AES_Td3[AES_Te4[(rk[0] ) & 0xff] & 0xff];
|
||||
rk[1] =
|
||||
rk[1] =
|
||||
AES_Td0[AES_Te4[(rk[1] >> 24) ] & 0xff] ^
|
||||
AES_Td1[AES_Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
|
||||
AES_Td2[AES_Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
|
||||
AES_Td3[AES_Te4[(rk[1] ) & 0xff] & 0xff];
|
||||
rk[2] =
|
||||
rk[2] =
|
||||
AES_Td0[AES_Te4[(rk[2] >> 24) ] & 0xff] ^
|
||||
AES_Td1[AES_Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
|
||||
AES_Td2[AES_Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
|
||||
AES_Td3[AES_Te4[(rk[2] ) & 0xff] & 0xff];
|
||||
rk[3] =
|
||||
rk[3] =
|
||||
AES_Td0[AES_Te4[(rk[3] >> 24) ] & 0xff] ^
|
||||
AES_Td1[AES_Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
|
||||
AES_Td2[AES_Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
|
||||
AES_Td3[AES_Te4[(rk[3] ) & 0xff] & 0xff];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef AES_ASM
|
||||
@@ -1222,67 +1222,67 @@ int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
|
||||
* in and out can overlap
|
||||
*/
|
||||
void AES_encrypt(const unsigned char *in, unsigned char *out,
|
||||
const AES_KEY *key) {
|
||||
const AES_KEY *key) {
|
||||
|
||||
const u32 *rk;
|
||||
u32 s0, s1, s2, s3, t0, t1, t2, t3;
|
||||
const u32 *rk;
|
||||
u32 s0, s1, s2, s3, t0, t1, t2, t3;
|
||||
#ifndef FULL_UNROLL
|
||||
int r;
|
||||
int r;
|
||||
#endif /* ?FULL_UNROLL */
|
||||
|
||||
assert(in && out && key);
|
||||
rk = key->rd_key;
|
||||
assert(in && out && key);
|
||||
rk = key->rd_key;
|
||||
|
||||
/*
|
||||
* map byte array block to cipher state
|
||||
* and add initial round key:
|
||||
*/
|
||||
s0 = GETU32(in ) ^ rk[0];
|
||||
s1 = GETU32(in + 4) ^ rk[1];
|
||||
s2 = GETU32(in + 8) ^ rk[2];
|
||||
s3 = GETU32(in + 12) ^ rk[3];
|
||||
/*
|
||||
* map byte array block to cipher state
|
||||
* and add initial round key:
|
||||
*/
|
||||
s0 = GETU32(in ) ^ rk[0];
|
||||
s1 = GETU32(in + 4) ^ rk[1];
|
||||
s2 = GETU32(in + 8) ^ rk[2];
|
||||
s3 = GETU32(in + 12) ^ rk[3];
|
||||
#ifdef FULL_UNROLL
|
||||
/* round 1: */
|
||||
/* round 1: */
|
||||
t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[ 4];
|
||||
t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[ 5];
|
||||
t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[ 6];
|
||||
t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[ 7];
|
||||
/* round 2: */
|
||||
/* round 2: */
|
||||
s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[ 8];
|
||||
s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[ 9];
|
||||
s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[10];
|
||||
s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[11];
|
||||
/* round 3: */
|
||||
/* round 3: */
|
||||
t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[12];
|
||||
t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[13];
|
||||
t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[14];
|
||||
t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[15];
|
||||
/* round 4: */
|
||||
/* round 4: */
|
||||
s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[16];
|
||||
s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[17];
|
||||
s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[18];
|
||||
s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[19];
|
||||
/* round 5: */
|
||||
/* round 5: */
|
||||
t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[20];
|
||||
t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[21];
|
||||
t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[22];
|
||||
t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[23];
|
||||
/* round 6: */
|
||||
/* round 6: */
|
||||
s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[24];
|
||||
s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[25];
|
||||
s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[26];
|
||||
s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[27];
|
||||
/* round 7: */
|
||||
/* round 7: */
|
||||
t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[28];
|
||||
t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[29];
|
||||
t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[30];
|
||||
t3 = AES_Te0[s3 >> 24] ^ AES_Te1[(s0 >> 16) & 0xff] ^ AES_Te2[(s1 >> 8) & 0xff] ^ AES_Te3[s2 & 0xff] ^ rk[31];
|
||||
/* round 8: */
|
||||
/* round 8: */
|
||||
s0 = AES_Te0[t0 >> 24] ^ AES_Te1[(t1 >> 16) & 0xff] ^ AES_Te2[(t2 >> 8) & 0xff] ^ AES_Te3[t3 & 0xff] ^ rk[32];
|
||||
s1 = AES_Te0[t1 >> 24] ^ AES_Te1[(t2 >> 16) & 0xff] ^ AES_Te2[(t3 >> 8) & 0xff] ^ AES_Te3[t0 & 0xff] ^ rk[33];
|
||||
s2 = AES_Te0[t2 >> 24] ^ AES_Te1[(t3 >> 16) & 0xff] ^ AES_Te2[(t0 >> 8) & 0xff] ^ AES_Te3[t1 & 0xff] ^ rk[34];
|
||||
s3 = AES_Te0[t3 >> 24] ^ AES_Te1[(t0 >> 16) & 0xff] ^ AES_Te2[(t1 >> 8) & 0xff] ^ AES_Te3[t2 & 0xff] ^ rk[35];
|
||||
/* round 9: */
|
||||
/* round 9: */
|
||||
t0 = AES_Te0[s0 >> 24] ^ AES_Te1[(s1 >> 16) & 0xff] ^ AES_Te2[(s2 >> 8) & 0xff] ^ AES_Te3[s3 & 0xff] ^ rk[36];
|
||||
t1 = AES_Te0[s1 >> 24] ^ AES_Te1[(s2 >> 16) & 0xff] ^ AES_Te2[(s3 >> 8) & 0xff] ^ AES_Te3[s0 & 0xff] ^ rk[37];
|
||||
t2 = AES_Te0[s2 >> 24] ^ AES_Te1[(s3 >> 16) & 0xff] ^ AES_Te2[(s0 >> 8) & 0xff] ^ AES_Te3[s1 & 0xff] ^ rk[38];
|
||||
@@ -1375,37 +1375,37 @@ void AES_encrypt(const unsigned char *in, unsigned char *out,
|
||||
}
|
||||
#endif /* ?FULL_UNROLL */
|
||||
/*
|
||||
* apply last round and
|
||||
* map cipher state to byte array block:
|
||||
*/
|
||||
s0 =
|
||||
* apply last round and
|
||||
* map cipher state to byte array block:
|
||||
*/
|
||||
s0 =
|
||||
(AES_Te4[(t0 >> 24) ] & 0xff000000) ^
|
||||
(AES_Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(t3 ) & 0xff] & 0x000000ff) ^
|
||||
rk[0];
|
||||
PUTU32(out , s0);
|
||||
s1 =
|
||||
rk[0];
|
||||
PUTU32(out , s0);
|
||||
s1 =
|
||||
(AES_Te4[(t1 >> 24) ] & 0xff000000) ^
|
||||
(AES_Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(t0 ) & 0xff] & 0x000000ff) ^
|
||||
rk[1];
|
||||
PUTU32(out + 4, s1);
|
||||
s2 =
|
||||
rk[1];
|
||||
PUTU32(out + 4, s1);
|
||||
s2 =
|
||||
(AES_Te4[(t2 >> 24) ] & 0xff000000) ^
|
||||
(AES_Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(t1 ) & 0xff] & 0x000000ff) ^
|
||||
rk[2];
|
||||
PUTU32(out + 8, s2);
|
||||
s3 =
|
||||
rk[2];
|
||||
PUTU32(out + 8, s2);
|
||||
s3 =
|
||||
(AES_Te4[(t3 >> 24) ] & 0xff000000) ^
|
||||
(AES_Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Te4[(t2 ) & 0xff] & 0x000000ff) ^
|
||||
rk[3];
|
||||
PUTU32(out + 12, s3);
|
||||
rk[3];
|
||||
PUTU32(out + 12, s3);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1413,21 +1413,21 @@ void AES_encrypt(const unsigned char *in, unsigned char *out,
|
||||
* in and out can overlap
|
||||
*/
|
||||
void AES_decrypt(const unsigned char *in, unsigned char *out,
|
||||
const AES_KEY *key) {
|
||||
const AES_KEY *key) {
|
||||
|
||||
const u32 *rk;
|
||||
u32 s0, s1, s2, s3, t0, t1, t2, t3;
|
||||
const u32 *rk;
|
||||
u32 s0, s1, s2, s3, t0, t1, t2, t3;
|
||||
#ifndef FULL_UNROLL
|
||||
int r;
|
||||
int r;
|
||||
#endif /* ?FULL_UNROLL */
|
||||
|
||||
assert(in && out && key);
|
||||
rk = key->rd_key;
|
||||
assert(in && out && key);
|
||||
rk = key->rd_key;
|
||||
|
||||
/*
|
||||
* map byte array block to cipher state
|
||||
* and add initial round key:
|
||||
*/
|
||||
/*
|
||||
* map byte array block to cipher state
|
||||
* and add initial round key:
|
||||
*/
|
||||
s0 = GETU32(in ) ^ rk[0];
|
||||
s1 = GETU32(in + 4) ^ rk[1];
|
||||
s2 = GETU32(in + 8) ^ rk[2];
|
||||
@@ -1502,7 +1502,7 @@ void AES_decrypt(const unsigned char *in, unsigned char *out,
|
||||
t3 = AES_Td0[s3 >> 24] ^ AES_Td1[(s2 >> 16) & 0xff] ^ AES_Td2[(s1 >> 8) & 0xff] ^ AES_Td3[s0 & 0xff] ^ rk[55];
|
||||
}
|
||||
}
|
||||
rk += key->rounds << 2;
|
||||
rk += key->rounds << 2;
|
||||
#else /* !FULL_UNROLL */
|
||||
/*
|
||||
* Nr - 1 full rounds:
|
||||
@@ -1566,88 +1566,88 @@ void AES_decrypt(const unsigned char *in, unsigned char *out,
|
||||
}
|
||||
#endif /* ?FULL_UNROLL */
|
||||
/*
|
||||
* apply last round and
|
||||
* map cipher state to byte array block:
|
||||
*/
|
||||
s0 =
|
||||
* apply last round and
|
||||
* map cipher state to byte array block:
|
||||
*/
|
||||
s0 =
|
||||
(AES_Td4[(t0 >> 24) ] & 0xff000000) ^
|
||||
(AES_Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Td4[(t1 ) & 0xff] & 0x000000ff) ^
|
||||
rk[0];
|
||||
PUTU32(out , s0);
|
||||
s1 =
|
||||
rk[0];
|
||||
PUTU32(out , s0);
|
||||
s1 =
|
||||
(AES_Td4[(t1 >> 24) ] & 0xff000000) ^
|
||||
(AES_Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Td4[(t2 ) & 0xff] & 0x000000ff) ^
|
||||
rk[1];
|
||||
PUTU32(out + 4, s1);
|
||||
s2 =
|
||||
rk[1];
|
||||
PUTU32(out + 4, s1);
|
||||
s2 =
|
||||
(AES_Td4[(t2 >> 24) ] & 0xff000000) ^
|
||||
(AES_Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Td4[(t3 ) & 0xff] & 0x000000ff) ^
|
||||
rk[2];
|
||||
PUTU32(out + 8, s2);
|
||||
s3 =
|
||||
rk[2];
|
||||
PUTU32(out + 8, s2);
|
||||
s3 =
|
||||
(AES_Td4[(t3 >> 24) ] & 0xff000000) ^
|
||||
(AES_Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
|
||||
(AES_Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
|
||||
(AES_Td4[(t0 ) & 0xff] & 0x000000ff) ^
|
||||
rk[3];
|
||||
PUTU32(out + 12, s3);
|
||||
rk[3];
|
||||
PUTU32(out + 12, s3);
|
||||
}
|
||||
|
||||
#endif /* AES_ASM */
|
||||
|
||||
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
|
||||
const unsigned long length, const AES_KEY *key,
|
||||
unsigned char *ivec, const int enc)
|
||||
const unsigned long length, const AES_KEY *key,
|
||||
unsigned char *ivec, const int enc)
|
||||
{
|
||||
|
||||
unsigned long n;
|
||||
unsigned long len = length;
|
||||
unsigned char tmp[AES_BLOCK_SIZE];
|
||||
unsigned long n;
|
||||
unsigned long len = length;
|
||||
unsigned char tmp[AES_BLOCK_SIZE];
|
||||
|
||||
assert(in && out && key && ivec);
|
||||
assert(in && out && key && ivec);
|
||||
|
||||
if (enc) {
|
||||
while (len >= AES_BLOCK_SIZE) {
|
||||
for(n=0; n < AES_BLOCK_SIZE; ++n)
|
||||
tmp[n] = in[n] ^ ivec[n];
|
||||
AES_encrypt(tmp, out, key);
|
||||
memcpy(ivec, out, AES_BLOCK_SIZE);
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
if (len) {
|
||||
for(n=0; n < len; ++n)
|
||||
tmp[n] = in[n] ^ ivec[n];
|
||||
for(n=len; n < AES_BLOCK_SIZE; ++n)
|
||||
tmp[n] = ivec[n];
|
||||
AES_encrypt(tmp, tmp, key);
|
||||
memcpy(out, tmp, AES_BLOCK_SIZE);
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
}
|
||||
} else {
|
||||
while (len >= AES_BLOCK_SIZE) {
|
||||
memcpy(tmp, in, AES_BLOCK_SIZE);
|
||||
AES_decrypt(in, out, key);
|
||||
for(n=0; n < AES_BLOCK_SIZE; ++n)
|
||||
out[n] ^= ivec[n];
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
if (len) {
|
||||
memcpy(tmp, in, AES_BLOCK_SIZE);
|
||||
AES_decrypt(tmp, tmp, key);
|
||||
for(n=0; n < len; ++n)
|
||||
out[n] = tmp[n] ^ ivec[n];
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
}
|
||||
}
|
||||
if (enc) {
|
||||
while (len >= AES_BLOCK_SIZE) {
|
||||
for(n=0; n < AES_BLOCK_SIZE; ++n)
|
||||
tmp[n] = in[n] ^ ivec[n];
|
||||
AES_encrypt(tmp, out, key);
|
||||
memcpy(ivec, out, AES_BLOCK_SIZE);
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
if (len) {
|
||||
for(n=0; n < len; ++n)
|
||||
tmp[n] = in[n] ^ ivec[n];
|
||||
for(n=len; n < AES_BLOCK_SIZE; ++n)
|
||||
tmp[n] = ivec[n];
|
||||
AES_encrypt(tmp, tmp, key);
|
||||
memcpy(out, tmp, AES_BLOCK_SIZE);
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
}
|
||||
} else {
|
||||
while (len >= AES_BLOCK_SIZE) {
|
||||
memcpy(tmp, in, AES_BLOCK_SIZE);
|
||||
AES_decrypt(in, out, key);
|
||||
for(n=0; n < AES_BLOCK_SIZE; ++n)
|
||||
out[n] ^= ivec[n];
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
len -= AES_BLOCK_SIZE;
|
||||
in += AES_BLOCK_SIZE;
|
||||
out += AES_BLOCK_SIZE;
|
||||
}
|
||||
if (len) {
|
||||
memcpy(tmp, in, AES_BLOCK_SIZE);
|
||||
AES_decrypt(tmp, tmp, key);
|
||||
for(n=0; n < len; ++n)
|
||||
out[n] = tmp[n] ^ ivec[n];
|
||||
memcpy(ivec, tmp, AES_BLOCK_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
584
crypto/desrfb.c
584
crypto/desrfb.c
@@ -37,353 +37,353 @@ static void cookey(unsigned long *);
|
||||
static unsigned long KnL[32] = { 0L };
|
||||
|
||||
static const unsigned short bytebit[8] = {
|
||||
01, 02, 04, 010, 020, 040, 0100, 0200 };
|
||||
01, 02, 04, 010, 020, 040, 0100, 0200 };
|
||||
|
||||
static const unsigned long bigbyte[24] = {
|
||||
0x800000L, 0x400000L, 0x200000L, 0x100000L,
|
||||
0x80000L, 0x40000L, 0x20000L, 0x10000L,
|
||||
0x8000L, 0x4000L, 0x2000L, 0x1000L,
|
||||
0x800L, 0x400L, 0x200L, 0x100L,
|
||||
0x80L, 0x40L, 0x20L, 0x10L,
|
||||
0x8L, 0x4L, 0x2L, 0x1L };
|
||||
0x800000L, 0x400000L, 0x200000L, 0x100000L,
|
||||
0x80000L, 0x40000L, 0x20000L, 0x10000L,
|
||||
0x8000L, 0x4000L, 0x2000L, 0x1000L,
|
||||
0x800L, 0x400L, 0x200L, 0x100L,
|
||||
0x80L, 0x40L, 0x20L, 0x10L,
|
||||
0x8L, 0x4L, 0x2L, 0x1L };
|
||||
|
||||
/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
|
||||
|
||||
static const unsigned char pc1[56] = {
|
||||
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
|
||||
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
|
||||
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
|
||||
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 };
|
||||
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
|
||||
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
|
||||
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
|
||||
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 };
|
||||
|
||||
static const unsigned char totrot[16] = {
|
||||
1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };
|
||||
1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 };
|
||||
|
||||
static const unsigned char pc2[48] = {
|
||||
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
|
||||
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
|
||||
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
|
||||
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
|
||||
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
|
||||
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
|
||||
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
|
||||
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
|
||||
|
||||
/* Thanks to James Gillogly & Phil Karn! */
|
||||
void deskey(unsigned char *key, int edf)
|
||||
{
|
||||
register int i, j, l, m, n;
|
||||
unsigned char pc1m[56], pcr[56];
|
||||
unsigned long kn[32];
|
||||
register int i, j, l, m, n;
|
||||
unsigned char pc1m[56], pcr[56];
|
||||
unsigned long kn[32];
|
||||
|
||||
for ( j = 0; j < 56; j++ ) {
|
||||
l = pc1[j];
|
||||
m = l & 07;
|
||||
pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
|
||||
}
|
||||
for( i = 0; i < 16; i++ ) {
|
||||
if( edf == DE1 ) m = (15 - i) << 1;
|
||||
else m = i << 1;
|
||||
n = m + 1;
|
||||
kn[m] = kn[n] = 0L;
|
||||
for( j = 0; j < 28; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 28 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 28; j < 56; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 56 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 0; j < 24; j++ ) {
|
||||
if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
|
||||
if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
|
||||
}
|
||||
}
|
||||
cookey(kn);
|
||||
return;
|
||||
}
|
||||
for ( j = 0; j < 56; j++ ) {
|
||||
l = pc1[j];
|
||||
m = l & 07;
|
||||
pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0;
|
||||
}
|
||||
for( i = 0; i < 16; i++ ) {
|
||||
if( edf == DE1 ) m = (15 - i) << 1;
|
||||
else m = i << 1;
|
||||
n = m + 1;
|
||||
kn[m] = kn[n] = 0L;
|
||||
for( j = 0; j < 28; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 28 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 28; j < 56; j++ ) {
|
||||
l = j + totrot[i];
|
||||
if( l < 56 ) pcr[j] = pc1m[l];
|
||||
else pcr[j] = pc1m[l - 28];
|
||||
}
|
||||
for( j = 0; j < 24; j++ ) {
|
||||
if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
|
||||
if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
|
||||
}
|
||||
}
|
||||
cookey(kn);
|
||||
return;
|
||||
}
|
||||
|
||||
static void cookey(register unsigned long *raw1)
|
||||
{
|
||||
register unsigned long *cook, *raw0;
|
||||
unsigned long dough[32];
|
||||
register int i;
|
||||
register unsigned long *cook, *raw0;
|
||||
unsigned long dough[32];
|
||||
register int i;
|
||||
|
||||
cook = dough;
|
||||
for( i = 0; i < 16; i++, raw1++ ) {
|
||||
raw0 = raw1++;
|
||||
*cook = (*raw0 & 0x00fc0000L) << 6;
|
||||
*cook |= (*raw0 & 0x00000fc0L) << 10;
|
||||
*cook |= (*raw1 & 0x00fc0000L) >> 10;
|
||||
*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
|
||||
*cook = (*raw0 & 0x0003f000L) << 12;
|
||||
*cook |= (*raw0 & 0x0000003fL) << 16;
|
||||
*cook |= (*raw1 & 0x0003f000L) >> 4;
|
||||
*cook++ |= (*raw1 & 0x0000003fL);
|
||||
}
|
||||
usekey(dough);
|
||||
return;
|
||||
}
|
||||
cook = dough;
|
||||
for( i = 0; i < 16; i++, raw1++ ) {
|
||||
raw0 = raw1++;
|
||||
*cook = (*raw0 & 0x00fc0000L) << 6;
|
||||
*cook |= (*raw0 & 0x00000fc0L) << 10;
|
||||
*cook |= (*raw1 & 0x00fc0000L) >> 10;
|
||||
*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
|
||||
*cook = (*raw0 & 0x0003f000L) << 12;
|
||||
*cook |= (*raw0 & 0x0000003fL) << 16;
|
||||
*cook |= (*raw1 & 0x0003f000L) >> 4;
|
||||
*cook++ |= (*raw1 & 0x0000003fL);
|
||||
}
|
||||
usekey(dough);
|
||||
return;
|
||||
}
|
||||
|
||||
void usekey(register unsigned long *from)
|
||||
{
|
||||
register unsigned long *to, *endp;
|
||||
register unsigned long *to, *endp;
|
||||
|
||||
to = KnL, endp = &KnL[32];
|
||||
while( to < endp ) *to++ = *from++;
|
||||
return;
|
||||
}
|
||||
to = KnL, endp = &KnL[32];
|
||||
while( to < endp ) *to++ = *from++;
|
||||
return;
|
||||
}
|
||||
|
||||
void des(unsigned char *inblock, unsigned char *outblock)
|
||||
{
|
||||
unsigned long work[2];
|
||||
unsigned long work[2];
|
||||
|
||||
scrunch(inblock, work);
|
||||
desfunc(work, KnL);
|
||||
unscrun(work, outblock);
|
||||
return;
|
||||
}
|
||||
scrunch(inblock, work);
|
||||
desfunc(work, KnL);
|
||||
unscrun(work, outblock);
|
||||
return;
|
||||
}
|
||||
|
||||
static void scrunch(register unsigned char *outof, register unsigned long *into)
|
||||
{
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into++ |= (*outof++ & 0xffL);
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into |= (*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into++ |= (*outof++ & 0xffL);
|
||||
*into = (*outof++ & 0xffL) << 24;
|
||||
*into |= (*outof++ & 0xffL) << 16;
|
||||
*into |= (*outof++ & 0xffL) << 8;
|
||||
*into |= (*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
|
||||
static void unscrun(register unsigned long *outof, register unsigned char *into)
|
||||
{
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into++ = (unsigned char)(*outof++ & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into = (unsigned char)(*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into++ = (unsigned char)(*outof++ & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 24) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 16) & 0xffL);
|
||||
*into++ = (unsigned char)((*outof >> 8) & 0xffL);
|
||||
*into = (unsigned char)(*outof & 0xffL);
|
||||
return;
|
||||
}
|
||||
|
||||
static const unsigned long SP1[64] = {
|
||||
0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
|
||||
0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
|
||||
0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
|
||||
0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
|
||||
0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
|
||||
0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
|
||||
0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
|
||||
0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
|
||||
0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
|
||||
0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
|
||||
0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
|
||||
0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
|
||||
0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
|
||||
0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };
|
||||
0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
|
||||
0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
|
||||
0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
|
||||
0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
|
||||
0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
|
||||
0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
|
||||
0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
|
||||
0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
|
||||
0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
|
||||
0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
|
||||
0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
|
||||
0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
|
||||
0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
|
||||
0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
|
||||
0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };
|
||||
|
||||
static const unsigned long SP2[64] = {
|
||||
0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
|
||||
0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
|
||||
0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
|
||||
0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
|
||||
0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
|
||||
0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
|
||||
0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
|
||||
0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
|
||||
0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
|
||||
0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
|
||||
0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
|
||||
0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
|
||||
0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
|
||||
0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
|
||||
0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
|
||||
0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L };
|
||||
0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
|
||||
0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
|
||||
0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
|
||||
0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
|
||||
0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
|
||||
0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
|
||||
0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
|
||||
0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
|
||||
0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
|
||||
0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
|
||||
0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
|
||||
0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
|
||||
0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
|
||||
0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
|
||||
0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
|
||||
0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L };
|
||||
|
||||
static const unsigned long SP3[64] = {
|
||||
0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
|
||||
0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
|
||||
0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
|
||||
0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
|
||||
0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
|
||||
0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
|
||||
0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
|
||||
0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
|
||||
0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
|
||||
0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
|
||||
0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
|
||||
0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
|
||||
0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
|
||||
0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
|
||||
0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
|
||||
0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L };
|
||||
0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
|
||||
0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
|
||||
0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
|
||||
0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
|
||||
0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
|
||||
0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
|
||||
0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
|
||||
0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
|
||||
0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
|
||||
0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
|
||||
0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
|
||||
0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
|
||||
0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
|
||||
0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
|
||||
0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
|
||||
0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L };
|
||||
|
||||
static const unsigned long SP4[64] = {
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
|
||||
0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
|
||||
0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
|
||||
0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
|
||||
0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
|
||||
0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
|
||||
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
|
||||
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
|
||||
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
|
||||
0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
|
||||
0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
|
||||
0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
|
||||
0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
|
||||
0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
|
||||
0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
|
||||
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
|
||||
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
|
||||
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
|
||||
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
|
||||
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
|
||||
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
|
||||
|
||||
static const unsigned long SP5[64] = {
|
||||
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
|
||||
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
|
||||
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
|
||||
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
|
||||
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
|
||||
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
|
||||
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
|
||||
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
|
||||
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
|
||||
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
|
||||
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
|
||||
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
|
||||
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
|
||||
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
|
||||
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
|
||||
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
|
||||
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
|
||||
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
|
||||
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
|
||||
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
|
||||
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
|
||||
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
|
||||
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
|
||||
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
|
||||
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
|
||||
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
|
||||
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
|
||||
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
|
||||
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
|
||||
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
|
||||
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
|
||||
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
|
||||
|
||||
static const unsigned long SP6[64] = {
|
||||
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
|
||||
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
|
||||
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
|
||||
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
|
||||
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
|
||||
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
|
||||
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
|
||||
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
|
||||
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
|
||||
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
|
||||
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
|
||||
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
|
||||
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
|
||||
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
|
||||
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
|
||||
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
|
||||
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
|
||||
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
|
||||
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
|
||||
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
|
||||
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
|
||||
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
|
||||
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
|
||||
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
|
||||
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
|
||||
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
|
||||
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
|
||||
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
|
||||
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
|
||||
|
||||
static const unsigned long SP7[64] = {
|
||||
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
|
||||
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
|
||||
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
|
||||
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
|
||||
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
|
||||
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
|
||||
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
|
||||
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
|
||||
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
|
||||
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
|
||||
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
|
||||
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
|
||||
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
|
||||
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
|
||||
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
|
||||
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
|
||||
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
|
||||
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
|
||||
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
|
||||
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
|
||||
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
|
||||
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
|
||||
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
|
||||
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
|
||||
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
|
||||
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
|
||||
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
|
||||
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
|
||||
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
|
||||
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
|
||||
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
|
||||
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
|
||||
|
||||
static const unsigned long SP8[64] = {
|
||||
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
|
||||
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
|
||||
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
|
||||
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
|
||||
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
|
||||
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
|
||||
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
|
||||
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
|
||||
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
|
||||
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
|
||||
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
|
||||
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
|
||||
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
|
||||
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
|
||||
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
|
||||
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
|
||||
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
|
||||
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
|
||||
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
|
||||
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
|
||||
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
|
||||
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
|
||||
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
|
||||
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
|
||||
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
|
||||
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
|
||||
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
|
||||
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
|
||||
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
|
||||
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
|
||||
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
|
||||
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
|
||||
|
||||
static void desfunc(register unsigned long *block, register unsigned long *keys)
|
||||
{
|
||||
register unsigned long fval, work, right, leftt;
|
||||
register int round;
|
||||
register unsigned long fval, work, right, leftt;
|
||||
register int round;
|
||||
|
||||
leftt = block[0];
|
||||
right = block[1];
|
||||
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 4);
|
||||
work = ((leftt >> 16) ^ right) & 0x0000ffffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 16);
|
||||
work = ((right >> 2) ^ leftt) & 0x33333333L;
|
||||
leftt ^= work;
|
||||
right ^= (work << 2);
|
||||
work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 8);
|
||||
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
|
||||
leftt = block[0];
|
||||
right = block[1];
|
||||
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 4);
|
||||
work = ((leftt >> 16) ^ right) & 0x0000ffffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 16);
|
||||
work = ((right >> 2) ^ leftt) & 0x33333333L;
|
||||
leftt ^= work;
|
||||
right ^= (work << 2);
|
||||
work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 8);
|
||||
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
|
||||
|
||||
for( round = 0; round < 8; round++ ) {
|
||||
work = (right << 28) | (right >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = right ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
leftt ^= fval;
|
||||
work = (leftt << 28) | (leftt >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = leftt ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
right ^= fval;
|
||||
}
|
||||
for( round = 0; round < 8; round++ ) {
|
||||
work = (right << 28) | (right >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = right ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
leftt ^= fval;
|
||||
work = (leftt << 28) | (leftt >> 4);
|
||||
work ^= *keys++;
|
||||
fval = SP7[ work & 0x3fL];
|
||||
fval |= SP5[(work >> 8) & 0x3fL];
|
||||
fval |= SP3[(work >> 16) & 0x3fL];
|
||||
fval |= SP1[(work >> 24) & 0x3fL];
|
||||
work = leftt ^ *keys++;
|
||||
fval |= SP8[ work & 0x3fL];
|
||||
fval |= SP6[(work >> 8) & 0x3fL];
|
||||
fval |= SP4[(work >> 16) & 0x3fL];
|
||||
fval |= SP2[(work >> 24) & 0x3fL];
|
||||
right ^= fval;
|
||||
}
|
||||
|
||||
right = (right << 31) | (right >> 1);
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = (leftt << 31) | (leftt >> 1);
|
||||
work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 8);
|
||||
work = ((leftt >> 2) ^ right) & 0x33333333L;
|
||||
right ^= work;
|
||||
leftt ^= (work << 2);
|
||||
work = ((right >> 16) ^ leftt) & 0x0000ffffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 16);
|
||||
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 4);
|
||||
*block++ = right;
|
||||
*block = leftt;
|
||||
return;
|
||||
}
|
||||
right = (right << 31) | (right >> 1);
|
||||
work = (leftt ^ right) & 0xaaaaaaaaL;
|
||||
leftt ^= work;
|
||||
right ^= work;
|
||||
leftt = (leftt << 31) | (leftt >> 1);
|
||||
work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
|
||||
right ^= work;
|
||||
leftt ^= (work << 8);
|
||||
work = ((leftt >> 2) ^ right) & 0x33333333L;
|
||||
right ^= work;
|
||||
leftt ^= (work << 2);
|
||||
work = ((right >> 16) ^ leftt) & 0x0000ffffL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 16);
|
||||
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
|
||||
leftt ^= work;
|
||||
right ^= (work << 4);
|
||||
*block++ = right;
|
||||
*block = leftt;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Validation sets:
|
||||
*
|
||||
|
@@ -19,3 +19,4 @@ CONFIG_I8259=y
|
||||
CONFIG_MC146818RTC=y
|
||||
CONFIG_ISA_TESTDEV=y
|
||||
CONFIG_SMC37C669=y
|
||||
CONFIG_DP264=y
|
||||
|
@@ -6,7 +6,6 @@ CONFIG_VGA=y
|
||||
CONFIG_NAND=y
|
||||
CONFIG_ECC=y
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_SERIAL_ISA=y
|
||||
CONFIG_PTIMER=y
|
||||
CONFIG_SD=y
|
||||
CONFIG_MAX7310=y
|
||||
@@ -124,7 +123,9 @@ CONFIG_VERSATILE=y
|
||||
CONFIG_VERSATILE_PCI=y
|
||||
CONFIG_VERSATILE_I2C=y
|
||||
|
||||
CONFIG_PCI_GENERIC=y
|
||||
CONFIG_PCI_EXPRESS_GENERIC_BRIDGE=y
|
||||
CONFIG_VFIO=$(CONFIG_LINUX)
|
||||
CONFIG_VFIO_PLATFORM=y
|
||||
CONFIG_VFIO_XGMAC=y
|
||||
CONFIG_VFIO_AMD_XGBE=y
|
||||
|
||||
@@ -149,13 +150,15 @@ CONFIG_XIO3130=y
|
||||
CONFIG_IOH3420=y
|
||||
CONFIG_I82801B11=y
|
||||
CONFIG_ACPI=y
|
||||
CONFIG_ARM_VIRT=y
|
||||
CONFIG_SMBIOS=y
|
||||
CONFIG_ASPEED_SOC=y
|
||||
CONFIG_SMBUS_EEPROM=y
|
||||
CONFIG_GPIO_KEY=y
|
||||
CONFIG_MSF2=y
|
||||
CONFIG_FW_CFG_DMA=y
|
||||
CONFIG_XILINX_AXI=y
|
||||
CONFIG_PCI_DESIGNWARE=y
|
||||
CONFIG_PCI_EXPRESS_DESIGNWARE=y
|
||||
|
||||
CONFIG_STRONGARM=y
|
||||
CONFIG_HIGHBANK=y
|
||||
|
@@ -4,3 +4,4 @@ CONFIG_ETRAXFS=y
|
||||
CONFIG_NAND=y
|
||||
CONFIG_PTIMER=y
|
||||
CONFIG_PFLASH_CFI02=y
|
||||
CONFIG_AXIS=y
|
||||
|
@@ -10,3 +10,4 @@ CONFIG_IDE_CMD646=y
|
||||
# CONFIG_IDE_MMIO=y
|
||||
CONFIG_VIRTIO_VGA=y
|
||||
CONFIG_MC146818RTC=y
|
||||
CONFIG_DINO=y
|
||||
|
@@ -47,7 +47,7 @@ CONFIG_ISA_TESTDEV=y
|
||||
CONFIG_VMPORT=y
|
||||
CONFIG_SGA=y
|
||||
CONFIG_LPC_ICH9=y
|
||||
CONFIG_PCI_Q35=y
|
||||
CONFIG_PCI_EXPRESS_Q35=y
|
||||
CONFIG_APIC=y
|
||||
CONFIG_IOAPIC=y
|
||||
CONFIG_PVPANIC=y
|
||||
@@ -62,8 +62,13 @@ CONFIG_I82801B11=y
|
||||
CONFIG_SMBIOS=y
|
||||
CONFIG_PXB=y
|
||||
CONFIG_ACPI_VMGENID=y
|
||||
CONFIG_ACPI_SMBUS=y
|
||||
CONFIG_SMBUS_EEPROM=y
|
||||
CONFIG_FW_CFG_DMA=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_SEV=$(CONFIG_KVM)
|
||||
CONFIG_VTD=y
|
||||
CONFIG_AMD_IOMMU=y
|
||||
CONFIG_PAM=y
|
||||
CONFIG_I440FX=y
|
||||
CONFIG_Q35=y
|
||||
|
@@ -2,3 +2,5 @@
|
||||
|
||||
CONFIG_COLDFIRE=y
|
||||
CONFIG_PTIMER=y
|
||||
CONFIG_AN5206=y
|
||||
CONFIG_MCF5208=y
|
||||
|
@@ -10,3 +10,6 @@ CONFIG_XILINX_ETHLITE=y
|
||||
CONFIG_SSI=y
|
||||
CONFIG_SSI_M25P80=y
|
||||
CONFIG_XLNX_ZYNQMP=y
|
||||
CONFIG_PETALOGIX_S3ADSP1800=y
|
||||
CONFIG_PETALOGIX_ML605=y
|
||||
CONFIG_XLNX_ZYNQMP_PMU=y
|
||||
|
@@ -36,3 +36,8 @@ CONFIG_EMPTY_SLOT=y
|
||||
CONFIG_MIPS_CPS=y
|
||||
CONFIG_MIPS_ITU=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_R4K=y
|
||||
CONFIG_MALTA=y
|
||||
CONFIG_MIPSSIM=y
|
||||
CONFIG_ACPI_SMBUS=y
|
||||
CONFIG_SMBUS_EEPROM=y
|
||||
|
@@ -12,4 +12,4 @@ CONFIG_JAZZ_LED=y
|
||||
CONFIG_VT82C686=y
|
||||
CONFIG_MIPS_BOSTON=y
|
||||
CONFIG_FITLOADER=y
|
||||
CONFIG_PCI_XILINX=y
|
||||
CONFIG_PCI_EXPRESS_XILINX=y
|
||||
|
@@ -5,3 +5,4 @@ CONFIG_MC146818RTC=y
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_SERIAL_ISA=y
|
||||
CONFIG_VGA=y
|
||||
CONFIG_MOXIESIM=y
|
||||
|
@@ -4,3 +4,4 @@ CONFIG_NIOS2=y
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_PTIMER=y
|
||||
CONFIG_ALTERA_TIMER=y
|
||||
CONFIG_NIOS2_10M50=y
|
||||
|
@@ -3,3 +3,4 @@
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_OPENCORES_ETH=y
|
||||
CONFIG_OMPIC=y
|
||||
CONFIG_OR1K_SIM=y
|
||||
|
@@ -22,7 +22,7 @@ CONFIG_MEGASAS_SCSI_PCI=y
|
||||
CONFIG_MPTSAS_SCSI_PCI=y
|
||||
CONFIG_RTL8139_PCI=y
|
||||
CONFIG_E1000_PCI=y
|
||||
CONFIG_E1000E_PCI=y
|
||||
CONFIG_E1000E_PCI_EXPRESS=y
|
||||
CONFIG_IDE_CORE=y
|
||||
CONFIG_IDE_QDEV=y
|
||||
CONFIG_IDE_PCI=y
|
||||
@@ -47,3 +47,5 @@ CONFIG_VGA_PCI=y
|
||||
CONFIG_BOCHS_DISPLAY=y
|
||||
CONFIG_IVSHMEM_DEVICE=$(CONFIG_IVSHMEM)
|
||||
CONFIG_ROCKER=y
|
||||
CONFIG_VFIO=$(CONFIG_LINUX)
|
||||
CONFIG_VFIO_PCI=y
|
||||
|
@@ -21,6 +21,10 @@ CONFIG_E500=y
|
||||
CONFIG_OPENPIC_KVM=$(call land,$(CONFIG_E500),$(CONFIG_KVM))
|
||||
CONFIG_PLATFORM_BUS=y
|
||||
CONFIG_ETSEC=y
|
||||
CONFIG_PPC405=y
|
||||
CONFIG_PPC440=y
|
||||
CONFIG_VIRTEX=y
|
||||
|
||||
# For Sam460ex
|
||||
CONFIG_SAM460EX=y
|
||||
CONFIG_USB_EHCI_SYSBUS=y
|
||||
@@ -32,9 +36,9 @@ CONFIG_AT24C=y
|
||||
CONFIG_BITBANG_I2C=y
|
||||
CONFIG_M41T80=y
|
||||
CONFIG_VGA_CIRRUS=y
|
||||
CONFIG_SMBUS_EEPROM=y
|
||||
|
||||
# For Macs
|
||||
CONFIG_MAC=y
|
||||
CONFIG_ESCC=y
|
||||
CONFIG_MACIO=y
|
||||
CONFIG_MACIO_GPIO=y
|
||||
@@ -50,6 +54,8 @@ CONFIG_GRACKLE_PCI=y
|
||||
CONFIG_UNIN_PCI=y
|
||||
CONFIG_DEC_PCI=y
|
||||
CONFIG_IDE_MACIO=y
|
||||
CONFIG_MAC_OLDWORLD=y
|
||||
CONFIG_MAC_NEWWORLD=y
|
||||
|
||||
# For PReP
|
||||
CONFIG_PREP=y
|
||||
|
@@ -8,7 +8,14 @@ CONFIG_VIRTIO_MMIO=y
|
||||
|
||||
CONFIG_CADENCE=y
|
||||
|
||||
CONFIG_PCI_GENERIC=y
|
||||
CONFIG_PCI_EXPRESS_GENERIC_BRIDGE=y
|
||||
|
||||
CONFIG_VGA=y
|
||||
CONFIG_VGA_PCI=y
|
||||
|
||||
CONFIG_SPIKE=y
|
||||
CONFIG_HART=y
|
||||
CONFIG_SIFIVE_E=y
|
||||
CONFIG_SIFIVE=y
|
||||
CONFIG_SIFIVE_U=y
|
||||
CONFIG_RISCV_VIRT=y
|
||||
|
@@ -8,7 +8,14 @@ CONFIG_VIRTIO_MMIO=y
|
||||
|
||||
CONFIG_CADENCE=y
|
||||
|
||||
CONFIG_PCI_GENERIC=y
|
||||
CONFIG_PCI_EXPRESS_GENERIC_BRIDGE=y
|
||||
|
||||
CONFIG_VGA=y
|
||||
CONFIG_VGA_PCI=y
|
||||
|
||||
CONFIG_SPIKE=y
|
||||
CONFIG_HART=y
|
||||
CONFIG_SIFIVE_E=y
|
||||
CONFIG_SIFIVE=y
|
||||
CONFIG_SIFIVE_U=y
|
||||
CONFIG_RISCV_VIRT=y
|
||||
|
@@ -5,6 +5,8 @@ CONFIG_SCLPCONSOLE=y
|
||||
CONFIG_TERMINAL3270=y
|
||||
CONFIG_S390_FLIC=y
|
||||
CONFIG_S390_FLIC_KVM=$(CONFIG_KVM)
|
||||
CONFIG_VFIO_CCW=$(CONFIG_LINUX)
|
||||
CONFIG_WDT_DIAG288=y
|
||||
CONFIG_VFIO_AP=$(CONFIG_LINUX)
|
||||
CONFIG_S390_CCW_VIRTIO=y
|
||||
CONFIG_VFIO=$(CONFIG_LINUX)
|
||||
CONFIG_VFIO_CCW=y
|
||||
CONFIG_VFIO_AP=y
|
||||
|
@@ -19,3 +19,5 @@ CONFIG_PCSPK=y
|
||||
CONFIG_I82374=y
|
||||
CONFIG_I8257=y
|
||||
CONFIG_MC146818RTC=y
|
||||
CONFIG_R2D=y
|
||||
CONFIG_SHIX=y
|
||||
|
@@ -19,3 +19,5 @@ CONFIG_PCSPK=y
|
||||
CONFIG_I82374=y
|
||||
CONFIG_I8257=y
|
||||
CONFIG_MC146818RTC=y
|
||||
CONFIG_R2D=y
|
||||
CONFIG_SHIX=y
|
||||
|
@@ -18,4 +18,6 @@ CONFIG_CS4231=y
|
||||
CONFIG_GRLIB=y
|
||||
CONFIG_STP2000=y
|
||||
CONFIG_ECCMEMCTL=y
|
||||
|
||||
CONFIG_SUN4M=y
|
||||
CONFIG_LEON3=y
|
||||
|
@@ -17,3 +17,5 @@ CONFIG_SUNHME=y
|
||||
CONFIG_MC146818RTC=y
|
||||
CONFIG_ISA_TESTDEV=y
|
||||
CONFIG_SUN4V_RTC=y
|
||||
CONFIG_SUN4U=y
|
||||
CONFIG_NIAGARA=y
|
||||
|
@@ -0,0 +1 @@
|
||||
CONFIG_TRICORE=y
|
||||
|
@@ -3,3 +3,6 @@
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_OPENCORES_ETH=y
|
||||
CONFIG_PFLASH_CFI01=y
|
||||
|
||||
CONFIG_XTENSA_SIM=y
|
||||
CONFIG_XTENSA_FPGA=y
|
||||
|
@@ -3,3 +3,6 @@
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_OPENCORES_ETH=y
|
||||
CONFIG_PFLASH_CFI01=y
|
||||
|
||||
CONFIG_XTENSA_SIM=y
|
||||
CONFIG_XTENSA_FPGA=y
|
||||
|
@@ -301,7 +301,7 @@ An alternative method to set up permissions is by adding the current user to
|
||||
.. code::
|
||||
|
||||
$ sudo groupadd docker
|
||||
$ sudo usermod $USER -G docker
|
||||
$ sudo usermod $USER -a -G docker
|
||||
$ sudo chown :docker /var/run/docker.sock
|
||||
|
||||
Note that any one of above configurations makes it possible for the user to
|
||||
|
@@ -190,10 +190,6 @@ The appropriate DEVNAME depends on the machine type. For type "pc":
|
||||
|
||||
-device usb-braille,chardev=braille -chardev braille,id=braille
|
||||
|
||||
* -virtioconsole becomes
|
||||
-device virtio-serial-pci,class=C,vectors=V,ioeventfd=IOEVENTFD,max_ports=N
|
||||
-device virtconsole,is_console=NUM,nr=NR,name=NAME
|
||||
|
||||
LEGACY-CHARDEV translates to -chardev HOST-OPTS... as follows:
|
||||
|
||||
* null becomes -chardev null
|
||||
|
5
dump.c
5
dump.c
@@ -192,7 +192,7 @@ static void write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
|
||||
phdr.p_paddr = cpu_to_dump64(s, memory_mapping->phys_addr);
|
||||
phdr.p_filesz = cpu_to_dump64(s, filesz);
|
||||
phdr.p_memsz = cpu_to_dump64(s, memory_mapping->length);
|
||||
phdr.p_vaddr = cpu_to_dump64(s, memory_mapping->virt_addr);
|
||||
phdr.p_vaddr = cpu_to_dump64(s, memory_mapping->virt_addr) ?: phdr.p_paddr;
|
||||
|
||||
assert(memory_mapping->length >= filesz);
|
||||
|
||||
@@ -216,7 +216,8 @@ static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
|
||||
phdr.p_paddr = cpu_to_dump32(s, memory_mapping->phys_addr);
|
||||
phdr.p_filesz = cpu_to_dump32(s, filesz);
|
||||
phdr.p_memsz = cpu_to_dump32(s, memory_mapping->length);
|
||||
phdr.p_vaddr = cpu_to_dump32(s, memory_mapping->virt_addr);
|
||||
phdr.p_vaddr =
|
||||
cpu_to_dump32(s, memory_mapping->virt_addr) ?: phdr.p_paddr;
|
||||
|
||||
assert(memory_mapping->length >= filesz);
|
||||
|
||||
|
47
exec.c
47
exec.c
@@ -2851,10 +2851,10 @@ static const MemoryRegionOps watch_mem_ops = {
|
||||
};
|
||||
|
||||
static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
|
||||
MemTxAttrs attrs, uint8_t *buf, int len);
|
||||
MemTxAttrs attrs, uint8_t *buf, hwaddr len);
|
||||
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
|
||||
const uint8_t *buf, int len);
|
||||
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
|
||||
const uint8_t *buf, hwaddr len);
|
||||
static bool flatview_access_valid(FlatView *fv, hwaddr addr, hwaddr len,
|
||||
bool is_write, MemTxAttrs attrs);
|
||||
|
||||
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
|
||||
@@ -3102,10 +3102,10 @@ MemoryRegion *get_system_io(void)
|
||||
/* physical memory access (slow version, mainly for debug) */
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
|
||||
uint8_t *buf, int len, int is_write)
|
||||
uint8_t *buf, target_ulong len, int is_write)
|
||||
{
|
||||
int l, flags;
|
||||
target_ulong page;
|
||||
int flags;
|
||||
target_ulong l, page;
|
||||
void * p;
|
||||
|
||||
while (len > 0) {
|
||||
@@ -3231,7 +3231,7 @@ static bool prepare_mmio_access(MemoryRegion *mr)
|
||||
static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
|
||||
MemTxAttrs attrs,
|
||||
const uint8_t *buf,
|
||||
int len, hwaddr addr1,
|
||||
hwaddr len, hwaddr addr1,
|
||||
hwaddr l, MemoryRegion *mr)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
@@ -3276,7 +3276,7 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
|
||||
|
||||
/* Called from RCU critical section. */
|
||||
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
|
||||
const uint8_t *buf, int len)
|
||||
const uint8_t *buf, hwaddr len)
|
||||
{
|
||||
hwaddr l;
|
||||
hwaddr addr1;
|
||||
@@ -3294,7 +3294,7 @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
|
||||
/* Called within RCU critical section. */
|
||||
MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
|
||||
MemTxAttrs attrs, uint8_t *buf,
|
||||
int len, hwaddr addr1, hwaddr l,
|
||||
hwaddr len, hwaddr addr1, hwaddr l,
|
||||
MemoryRegion *mr)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
@@ -3337,7 +3337,7 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
|
||||
|
||||
/* Called from RCU critical section. */
|
||||
static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
|
||||
MemTxAttrs attrs, uint8_t *buf, int len)
|
||||
MemTxAttrs attrs, uint8_t *buf, hwaddr len)
|
||||
{
|
||||
hwaddr l;
|
||||
hwaddr addr1;
|
||||
@@ -3350,7 +3350,7 @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
|
||||
}
|
||||
|
||||
MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,
|
||||
MemTxAttrs attrs, uint8_t *buf, int len)
|
||||
MemTxAttrs attrs, uint8_t *buf, hwaddr len)
|
||||
{
|
||||
MemTxResult result = MEMTX_OK;
|
||||
FlatView *fv;
|
||||
@@ -3367,7 +3367,7 @@ MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,
|
||||
|
||||
MemTxResult address_space_write(AddressSpace *as, hwaddr addr,
|
||||
MemTxAttrs attrs,
|
||||
const uint8_t *buf, int len)
|
||||
const uint8_t *buf, hwaddr len)
|
||||
{
|
||||
MemTxResult result = MEMTX_OK;
|
||||
FlatView *fv;
|
||||
@@ -3383,7 +3383,7 @@ MemTxResult address_space_write(AddressSpace *as, hwaddr addr,
|
||||
}
|
||||
|
||||
MemTxResult address_space_rw(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
|
||||
uint8_t *buf, int len, bool is_write)
|
||||
uint8_t *buf, hwaddr len, bool is_write)
|
||||
{
|
||||
if (is_write) {
|
||||
return address_space_write(as, addr, attrs, buf, len);
|
||||
@@ -3393,7 +3393,7 @@ MemTxResult address_space_rw(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
|
||||
}
|
||||
|
||||
void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
|
||||
int len, int is_write)
|
||||
hwaddr len, int is_write)
|
||||
{
|
||||
address_space_rw(&address_space_memory, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
buf, len, is_write);
|
||||
@@ -3408,7 +3408,7 @@ static inline MemTxResult address_space_write_rom_internal(AddressSpace *as,
|
||||
hwaddr addr,
|
||||
MemTxAttrs attrs,
|
||||
const uint8_t *buf,
|
||||
int len,
|
||||
hwaddr len,
|
||||
enum write_rom_type type)
|
||||
{
|
||||
hwaddr l;
|
||||
@@ -3448,13 +3448,13 @@ static inline MemTxResult address_space_write_rom_internal(AddressSpace *as,
|
||||
/* used for ROM loading : can write in RAM and ROM */
|
||||
MemTxResult address_space_write_rom(AddressSpace *as, hwaddr addr,
|
||||
MemTxAttrs attrs,
|
||||
const uint8_t *buf, int len)
|
||||
const uint8_t *buf, hwaddr len)
|
||||
{
|
||||
return address_space_write_rom_internal(as, addr, attrs,
|
||||
buf, len, WRITE_DATA);
|
||||
}
|
||||
|
||||
void cpu_flush_icache_range(hwaddr start, int len)
|
||||
void cpu_flush_icache_range(hwaddr start, hwaddr len)
|
||||
{
|
||||
/*
|
||||
* This function should do the same thing as an icache flush that was
|
||||
@@ -3557,7 +3557,7 @@ static void cpu_notify_map_clients(void)
|
||||
qemu_mutex_unlock(&map_client_list_lock);
|
||||
}
|
||||
|
||||
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
|
||||
static bool flatview_access_valid(FlatView *fv, hwaddr addr, hwaddr len,
|
||||
bool is_write, MemTxAttrs attrs)
|
||||
{
|
||||
MemoryRegion *mr;
|
||||
@@ -3580,7 +3580,7 @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
|
||||
}
|
||||
|
||||
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
|
||||
int len, bool is_write,
|
||||
hwaddr len, bool is_write,
|
||||
MemTxAttrs attrs)
|
||||
{
|
||||
FlatView *fv;
|
||||
@@ -3833,7 +3833,7 @@ static inline MemoryRegion *address_space_translate_cached(
|
||||
*/
|
||||
void
|
||||
address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
void *buf, int len)
|
||||
void *buf, hwaddr len)
|
||||
{
|
||||
hwaddr addr1, l;
|
||||
MemoryRegion *mr;
|
||||
@@ -3851,7 +3851,7 @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
*/
|
||||
void
|
||||
address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
const void *buf, int len)
|
||||
const void *buf, hwaddr len)
|
||||
{
|
||||
hwaddr addr1, l;
|
||||
MemoryRegion *mr;
|
||||
@@ -3874,11 +3874,10 @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
|
||||
|
||||
/* virtual memory access for debug (includes writing to ROM) */
|
||||
int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
|
||||
uint8_t *buf, int len, int is_write)
|
||||
uint8_t *buf, target_ulong len, int is_write)
|
||||
{
|
||||
int l;
|
||||
hwaddr phys_addr;
|
||||
target_ulong page;
|
||||
target_ulong l, page;
|
||||
|
||||
cpu_synchronize_state(cpu);
|
||||
while (len > 0) {
|
||||
|
@@ -1,65 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. -->
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
<flags id="i386_eflags" size="4">
|
||||
<field name="CF" start="0" end="0"/>
|
||||
<field name="" start="1" end="1"/>
|
||||
<field name="PF" start="2" end="2"/>
|
||||
<field name="AF" start="4" end="4"/>
|
||||
<field name="ZF" start="6" end="6"/>
|
||||
<field name="SF" start="7" end="7"/>
|
||||
<field name="TF" start="8" end="8"/>
|
||||
<field name="IF" start="9" end="9"/>
|
||||
<field name="DF" start="10" end="10"/>
|
||||
<field name="OF" start="11" end="11"/>
|
||||
<field name="NT" start="14" end="14"/>
|
||||
<field name="RF" start="16" end="16"/>
|
||||
<field name="VM" start="17" end="17"/>
|
||||
<field name="AC" start="18" end="18"/>
|
||||
<field name="VIF" start="19" end="19"/>
|
||||
<field name="VIP" start="20" end="20"/>
|
||||
<field name="ID" start="21" end="21"/>
|
||||
</flags>
|
||||
|
||||
<reg name="eax" bitsize="32" type="int32"/>
|
||||
<reg name="ecx" bitsize="32" type="int32"/>
|
||||
<reg name="edx" bitsize="32" type="int32"/>
|
||||
<reg name="ebx" bitsize="32" type="int32"/>
|
||||
<reg name="esp" bitsize="32" type="data_ptr"/>
|
||||
<reg name="ebp" bitsize="32" type="data_ptr"/>
|
||||
<reg name="esi" bitsize="32" type="int32"/>
|
||||
<reg name="edi" bitsize="32" type="int32"/>
|
||||
|
||||
<reg name="eip" bitsize="32" type="code_ptr"/>
|
||||
<reg name="eflags" bitsize="32" type="i386_eflags"/>
|
||||
<reg name="cs" bitsize="32" type="int32"/>
|
||||
<reg name="ss" bitsize="32" type="int32"/>
|
||||
<reg name="ds" bitsize="32" type="int32"/>
|
||||
<reg name="es" bitsize="32" type="int32"/>
|
||||
<reg name="fs" bitsize="32" type="int32"/>
|
||||
<reg name="gs" bitsize="32" type="int32"/>
|
||||
|
||||
<reg name="st0" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st1" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st2" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st3" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st4" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st5" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st6" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st7" bitsize="80" type="i387_ext"/>
|
||||
|
||||
<reg name="fctrl" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fstat" bitsize="32" type="int" group="float"/>
|
||||
<reg name="ftag" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fiseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fioff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="foseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fooff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fop" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
@@ -1,52 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. -->
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.32bit.sse">
|
||||
<vector id="v4f" type="ieee_single" count="4"/>
|
||||
<vector id="v2d" type="ieee_double" count="2"/>
|
||||
<vector id="v16i8" type="int8" count="16"/>
|
||||
<vector id="v8i16" type="int16" count="8"/>
|
||||
<vector id="v4i32" type="int32" count="4"/>
|
||||
<vector id="v2i64" type="int64" count="2"/>
|
||||
<union id="vec128">
|
||||
<field name="v4_float" type="v4f"/>
|
||||
<field name="v2_double" type="v2d"/>
|
||||
<field name="v16_int8" type="v16i8"/>
|
||||
<field name="v8_int16" type="v8i16"/>
|
||||
<field name="v4_int32" type="v4i32"/>
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
<flags id="i386_mxcsr" size="4">
|
||||
<field name="IE" start="0" end="0"/>
|
||||
<field name="DE" start="1" end="1"/>
|
||||
<field name="ZE" start="2" end="2"/>
|
||||
<field name="OE" start="3" end="3"/>
|
||||
<field name="UE" start="4" end="4"/>
|
||||
<field name="PE" start="5" end="5"/>
|
||||
<field name="DAZ" start="6" end="6"/>
|
||||
<field name="IM" start="7" end="7"/>
|
||||
<field name="DM" start="8" end="8"/>
|
||||
<field name="ZM" start="9" end="9"/>
|
||||
<field name="OM" start="10" end="10"/>
|
||||
<field name="UM" start="11" end="11"/>
|
||||
<field name="PM" start="12" end="12"/>
|
||||
<field name="FZ" start="15" end="15"/>
|
||||
</flags>
|
||||
|
||||
<reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm2" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm3" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm4" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm5" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm6" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm7" bitsize="128" type="vec128"/>
|
||||
|
||||
<reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/>
|
||||
</feature>
|
@@ -8,7 +8,185 @@
|
||||
<!-- I386 with SSE -->
|
||||
|
||||
<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.32bit">
|
||||
<xi:include href="i386-32bit-core.xml"/>
|
||||
<xi:include href="i386-32bit-sse.xml"/>
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
<flags id="i386_eflags" size="4">
|
||||
<field name="" start="22" end="31"/>
|
||||
<field name="ID" start="21" end="21"/>
|
||||
<field name="VIP" start="20" end="20"/>
|
||||
<field name="VIF" start="19" end="19"/>
|
||||
<field name="AC" start="18" end="18"/>
|
||||
<field name="VM" start="17" end="17"/>
|
||||
<field name="RF" start="16" end="16"/>
|
||||
<field name="" start="15" end="15"/>
|
||||
<field name="NT" start="14" end="14"/>
|
||||
<field name="IOPL" start="12" end="13"/>
|
||||
<field name="OF" start="11" end="11"/>
|
||||
<field name="DF" start="10" end="10"/>
|
||||
<field name="IF" start="9" end="9"/>
|
||||
<field name="TF" start="8" end="8"/>
|
||||
<field name="SF" start="7" end="7"/>
|
||||
<field name="ZF" start="6" end="6"/>
|
||||
<field name="" start="5" end="5"/>
|
||||
<field name="AF" start="4" end="4"/>
|
||||
<field name="" start="3" end="3"/>
|
||||
<field name="PF" start="2" end="2"/>
|
||||
<field name="" start="1" end="1"/>
|
||||
<field name="CF" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<reg name="eax" bitsize="32" type="int32" regnum="0"/>
|
||||
<reg name="ecx" bitsize="32" type="int32"/>
|
||||
<reg name="edx" bitsize="32" type="int32"/>
|
||||
<reg name="ebx" bitsize="32" type="int32"/>
|
||||
<reg name="esp" bitsize="32" type="data_ptr"/>
|
||||
<reg name="ebp" bitsize="32" type="data_ptr"/>
|
||||
<reg name="esi" bitsize="32" type="int32"/>
|
||||
<reg name="edi" bitsize="32" type="int32"/>
|
||||
|
||||
<reg name="eip" bitsize="32" type="code_ptr"/>
|
||||
<reg name="eflags" bitsize="32" type="i386_eflags"/>
|
||||
|
||||
<reg name="cs" bitsize="32" type="int32"/>
|
||||
<reg name="ss" bitsize="32" type="int32"/>
|
||||
<reg name="ds" bitsize="32" type="int32"/>
|
||||
<reg name="es" bitsize="32" type="int32"/>
|
||||
<reg name="fs" bitsize="32" type="int32"/>
|
||||
<reg name="gs" bitsize="32" type="int32"/>
|
||||
|
||||
<!-- Segment descriptor caches and TLS base MSRs -->
|
||||
|
||||
<!--reg name="cs_base" bitsize="32" type="int32"/>
|
||||
<reg name="ss_base" bitsize="32" type="int32"/>
|
||||
<reg name="ds_base" bitsize="32" type="int32"/>
|
||||
<reg name="es_base" bitsize="32" type="int32"/-->
|
||||
<reg name="fs_base" bitsize="32" type="int32"/>
|
||||
<reg name="gs_base" bitsize="32" type="int32"/>
|
||||
<reg name="k_gs_base" bitsize="32" type="int32"/>
|
||||
|
||||
<flags id="i386_cr0" size="4">
|
||||
<field name="PG" start="31" end="31"/>
|
||||
<field name="CD" start="30" end="30"/>
|
||||
<field name="NW" start="29" end="29"/>
|
||||
<field name="AM" start="18" end="18"/>
|
||||
<field name="WP" start="16" end="16"/>
|
||||
<field name="NE" start="5" end="5"/>
|
||||
<field name="ET" start="4" end="4"/>
|
||||
<field name="TS" start="3" end="3"/>
|
||||
<field name="EM" start="2" end="2"/>
|
||||
<field name="MP" start="1" end="1"/>
|
||||
<field name="PE" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<flags id="i386_cr3" size="4">
|
||||
<field name="PDBR" start="12" end="31"/>
|
||||
<!--field name="" start="3" end="11"/>
|
||||
<field name="WT" start="2" end="2"/>
|
||||
<field name="CD" start="1" end="1"/>
|
||||
<field name="" start="0" end="0"/-->
|
||||
<field name="PCID" start="0" end="11"/>
|
||||
</flags>
|
||||
|
||||
<flags id="i386_cr4" size="4">
|
||||
<field name="VME" start="0" end="0"/>
|
||||
<field name="PVI" start="1" end="1"/>
|
||||
<field name="TSD" start="2" end="2"/>
|
||||
<field name="DE" start="3" end="3"/>
|
||||
<field name="PSE" start="4" end="4"/>
|
||||
<field name="PAE" start="5" end="5"/>
|
||||
<field name="MCE" start="6" end="6"/>
|
||||
<field name="PGE" start="7" end="7"/>
|
||||
<field name="PCE" start="8" end="8"/>
|
||||
<field name="OSFXSR" start="9" end="9"/>
|
||||
<field name="OSXMMEXCPT" start="10" end="10"/>
|
||||
<field name="UMIP" start="11" end="11"/>
|
||||
<field name="LA57" start="12" end="12"/>
|
||||
<field name="VMXE" start="13" end="13"/>
|
||||
<field name="SMXE" start="14" end="14"/>
|
||||
<field name="FSGSBASE" start="16" end="16"/>
|
||||
<field name="PCIDE" start="17" end="17"/>
|
||||
<field name="OSXSAVE" start="18" end="18"/>
|
||||
<field name="SMEP" start="20" end="20"/>
|
||||
<field name="SMAP" start="21" end="21"/>
|
||||
<field name="PKE" start="22" end="22"/>
|
||||
</flags>
|
||||
|
||||
<flags id="i386_efer" size="8">
|
||||
<field name="TCE" start="15" end="15"/>
|
||||
<field name="FFXSR" start="14" end="14"/>
|
||||
<field name="LMSLE" start="13" end="13"/>
|
||||
<field name="SVME" start="12" end="12"/>
|
||||
<field name="NXE" start="11" end="11"/>
|
||||
<field name="LMA" start="10" end="10"/>
|
||||
<field name="LME" start="8" end="8"/>
|
||||
<field name="SCE" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<reg name="cr0" bitsize="32" type="i386_cr0"/>
|
||||
<reg name="cr2" bitsize="32" type="int32"/>
|
||||
<reg name="cr3" bitsize="32" type="i386_cr3"/>
|
||||
<reg name="cr4" bitsize="32" type="i386_cr4"/>
|
||||
<reg name="cr8" bitsize="32" type="int32"/>
|
||||
<reg name="efer" bitsize="32" type="i386_efer"/>
|
||||
|
||||
<reg name="st0" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st1" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st2" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st3" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st4" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st5" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st6" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st7" bitsize="80" type="i387_ext"/>
|
||||
|
||||
<reg name="fctrl" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fstat" bitsize="32" type="int" group="float"/>
|
||||
<reg name="ftag" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fiseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fioff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="foseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fooff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fop" bitsize="32" type="int" group="float"/>
|
||||
<!--/feature>
|
||||
<feature name="org.gnu.gdb.i386.32bit.sse"-->
|
||||
<vector id="v4f" type="ieee_single" count="4"/>
|
||||
<vector id="v2d" type="ieee_double" count="2"/>
|
||||
<vector id="v16i8" type="int8" count="16"/>
|
||||
<vector id="v8i16" type="int16" count="8"/>
|
||||
<vector id="v4i32" type="int32" count="4"/>
|
||||
<vector id="v2i64" type="int64" count="2"/>
|
||||
<union id="vec128">
|
||||
<field name="v4_float" type="v4f"/>
|
||||
<field name="v2_double" type="v2d"/>
|
||||
<field name="v16_int8" type="v16i8"/>
|
||||
<field name="v8_int16" type="v8i16"/>
|
||||
<field name="v4_int32" type="v4i32"/>
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
<flags id="i386_mxcsr" size="4">
|
||||
<field name="IE" start="0" end="0"/>
|
||||
<field name="DE" start="1" end="1"/>
|
||||
<field name="ZE" start="2" end="2"/>
|
||||
<field name="OE" start="3" end="3"/>
|
||||
<field name="UE" start="4" end="4"/>
|
||||
<field name="PE" start="5" end="5"/>
|
||||
<field name="DAZ" start="6" end="6"/>
|
||||
<field name="IM" start="7" end="7"/>
|
||||
<field name="DM" start="8" end="8"/>
|
||||
<field name="ZM" start="9" end="9"/>
|
||||
<field name="OM" start="10" end="10"/>
|
||||
<field name="UM" start="11" end="11"/>
|
||||
<field name="PM" start="12" end="12"/>
|
||||
<field name="FZ" start="15" end="15"/>
|
||||
</flags>
|
||||
|
||||
<reg name="xmm0" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm2" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm3" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm4" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm5" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm6" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm7" bitsize="128" type="vec128"/>
|
||||
|
||||
<reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/>
|
||||
</feature>
|
||||
|
@@ -1,73 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. -->
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
<flags id="i386_eflags" size="4">
|
||||
<field name="CF" start="0" end="0"/>
|
||||
<field name="" start="1" end="1"/>
|
||||
<field name="PF" start="2" end="2"/>
|
||||
<field name="AF" start="4" end="4"/>
|
||||
<field name="ZF" start="6" end="6"/>
|
||||
<field name="SF" start="7" end="7"/>
|
||||
<field name="TF" start="8" end="8"/>
|
||||
<field name="IF" start="9" end="9"/>
|
||||
<field name="DF" start="10" end="10"/>
|
||||
<field name="OF" start="11" end="11"/>
|
||||
<field name="NT" start="14" end="14"/>
|
||||
<field name="RF" start="16" end="16"/>
|
||||
<field name="VM" start="17" end="17"/>
|
||||
<field name="AC" start="18" end="18"/>
|
||||
<field name="VIF" start="19" end="19"/>
|
||||
<field name="VIP" start="20" end="20"/>
|
||||
<field name="ID" start="21" end="21"/>
|
||||
</flags>
|
||||
|
||||
<reg name="rax" bitsize="64" type="int64"/>
|
||||
<reg name="rbx" bitsize="64" type="int64"/>
|
||||
<reg name="rcx" bitsize="64" type="int64"/>
|
||||
<reg name="rdx" bitsize="64" type="int64"/>
|
||||
<reg name="rsi" bitsize="64" type="int64"/>
|
||||
<reg name="rdi" bitsize="64" type="int64"/>
|
||||
<reg name="rbp" bitsize="64" type="data_ptr"/>
|
||||
<reg name="rsp" bitsize="64" type="data_ptr"/>
|
||||
<reg name="r8" bitsize="64" type="int64"/>
|
||||
<reg name="r9" bitsize="64" type="int64"/>
|
||||
<reg name="r10" bitsize="64" type="int64"/>
|
||||
<reg name="r11" bitsize="64" type="int64"/>
|
||||
<reg name="r12" bitsize="64" type="int64"/>
|
||||
<reg name="r13" bitsize="64" type="int64"/>
|
||||
<reg name="r14" bitsize="64" type="int64"/>
|
||||
<reg name="r15" bitsize="64" type="int64"/>
|
||||
|
||||
<reg name="rip" bitsize="64" type="code_ptr"/>
|
||||
<reg name="eflags" bitsize="32" type="i386_eflags"/>
|
||||
<reg name="cs" bitsize="32" type="int32"/>
|
||||
<reg name="ss" bitsize="32" type="int32"/>
|
||||
<reg name="ds" bitsize="32" type="int32"/>
|
||||
<reg name="es" bitsize="32" type="int32"/>
|
||||
<reg name="fs" bitsize="32" type="int32"/>
|
||||
<reg name="gs" bitsize="32" type="int32"/>
|
||||
|
||||
<reg name="st0" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st1" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st2" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st3" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st4" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st5" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st6" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st7" bitsize="80" type="i387_ext"/>
|
||||
|
||||
<reg name="fctrl" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fstat" bitsize="32" type="int" group="float"/>
|
||||
<reg name="ftag" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fiseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fioff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="foseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fooff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fop" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
@@ -1,60 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2010-2017 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. -->
|
||||
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.64bit.sse">
|
||||
<vector id="v4f" type="ieee_single" count="4"/>
|
||||
<vector id="v2d" type="ieee_double" count="2"/>
|
||||
<vector id="v16i8" type="int8" count="16"/>
|
||||
<vector id="v8i16" type="int16" count="8"/>
|
||||
<vector id="v4i32" type="int32" count="4"/>
|
||||
<vector id="v2i64" type="int64" count="2"/>
|
||||
<union id="vec128">
|
||||
<field name="v4_float" type="v4f"/>
|
||||
<field name="v2_double" type="v2d"/>
|
||||
<field name="v16_int8" type="v16i8"/>
|
||||
<field name="v8_int16" type="v8i16"/>
|
||||
<field name="v4_int32" type="v4i32"/>
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
<flags id="i386_mxcsr" size="4">
|
||||
<field name="IE" start="0" end="0"/>
|
||||
<field name="DE" start="1" end="1"/>
|
||||
<field name="ZE" start="2" end="2"/>
|
||||
<field name="OE" start="3" end="3"/>
|
||||
<field name="UE" start="4" end="4"/>
|
||||
<field name="PE" start="5" end="5"/>
|
||||
<field name="DAZ" start="6" end="6"/>
|
||||
<field name="IM" start="7" end="7"/>
|
||||
<field name="DM" start="8" end="8"/>
|
||||
<field name="ZM" start="9" end="9"/>
|
||||
<field name="OM" start="10" end="10"/>
|
||||
<field name="UM" start="11" end="11"/>
|
||||
<field name="PM" start="12" end="12"/>
|
||||
<field name="FZ" start="15" end="15"/>
|
||||
</flags>
|
||||
|
||||
<reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm2" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm3" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm4" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm5" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm6" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm7" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm8" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm9" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm10" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm11" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm12" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm13" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm14" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm15" bitsize="128" type="vec128"/>
|
||||
|
||||
<reg name="mxcsr" bitsize="32" type="i386_mxcsr" group="vector"/>
|
||||
</feature>
|
@@ -5,10 +5,212 @@
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. -->
|
||||
|
||||
<!-- I386 64bit -->
|
||||
<!-- x86_64 64bit -->
|
||||
|
||||
<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.gnu.gdb.i386.64bit">
|
||||
<xi:include href="i386-64bit-core.xml"/>
|
||||
<xi:include href="i386-64bit-sse.xml"/>
|
||||
|
||||
<feature name="org.gnu.gdb.i386.core">
|
||||
<flags id="x64_eflags" size="4">
|
||||
<field name="" start="22" end="31"/>
|
||||
<field name="ID" start="21" end="21"/>
|
||||
<field name="VIP" start="20" end="20"/>
|
||||
<field name="VIF" start="19" end="19"/>
|
||||
<field name="AC" start="18" end="18"/>
|
||||
<field name="VM" start="17" end="17"/>
|
||||
<field name="RF" start="16" end="16"/>
|
||||
<field name="" start="15" end="15"/>
|
||||
<field name="NT" start="14" end="14"/>
|
||||
<field name="IOPL" start="12" end="13"/>
|
||||
<field name="OF" start="11" end="11"/>
|
||||
<field name="DF" start="10" end="10"/>
|
||||
<field name="IF" start="9" end="9"/>
|
||||
<field name="TF" start="8" end="8"/>
|
||||
<field name="SF" start="7" end="7"/>
|
||||
<field name="ZF" start="6" end="6"/>
|
||||
<field name="" start="5" end="5"/>
|
||||
<field name="AF" start="4" end="4"/>
|
||||
<field name="" start="3" end="3"/>
|
||||
<field name="PF" start="2" end="2"/>
|
||||
<field name="" start="1" end="1"/>
|
||||
<field name="CF" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<!-- General registers -->
|
||||
|
||||
<reg name="rax" bitsize="64" type="int64" regnum="0"/>
|
||||
<reg name="rbx" bitsize="64" type="int64"/>
|
||||
<reg name="rcx" bitsize="64" type="int64"/>
|
||||
<reg name="rdx" bitsize="64" type="int64"/>
|
||||
<reg name="rsi" bitsize="64" type="int64"/>
|
||||
<reg name="rdi" bitsize="64" type="int64"/>
|
||||
<reg name="rbp" bitsize="64" type="data_ptr"/>
|
||||
<reg name="rsp" bitsize="64" type="data_ptr"/>
|
||||
<reg name="r8" bitsize="64" type="int64"/>
|
||||
<reg name="r9" bitsize="64" type="int64"/>
|
||||
<reg name="r10" bitsize="64" type="int64"/>
|
||||
<reg name="r11" bitsize="64" type="int64"/>
|
||||
<reg name="r12" bitsize="64" type="int64"/>
|
||||
<reg name="r13" bitsize="64" type="int64"/>
|
||||
<reg name="r14" bitsize="64" type="int64"/>
|
||||
<reg name="r15" bitsize="64" type="int64"/>
|
||||
|
||||
<reg name="rip" bitsize="64" type="code_ptr"/>
|
||||
<reg name="eflags" bitsize="32" type="x64_eflags"/>
|
||||
|
||||
<!-- Segment registers -->
|
||||
|
||||
<reg name="cs" bitsize="32" type="int32"/>
|
||||
<reg name="ss" bitsize="32" type="int32"/>
|
||||
<reg name="ds" bitsize="32" type="int32"/>
|
||||
<reg name="es" bitsize="32" type="int32"/>
|
||||
<reg name="fs" bitsize="32" type="int32"/>
|
||||
<reg name="gs" bitsize="32" type="int32"/>
|
||||
|
||||
<!-- Segment descriptor caches and TLS base MSRs -->
|
||||
|
||||
<!--reg name="cs_base" bitsize="64" type="int64"/>
|
||||
<reg name="ss_base" bitsize="64" type="int64"/>
|
||||
<reg name="ds_base" bitsize="64" type="int64"/>
|
||||
<reg name="es_base" bitsize="64" type="int64"/-->
|
||||
<reg name="fs_base" bitsize="64" type="int64"/>
|
||||
<reg name="gs_base" bitsize="64" type="int64"/>
|
||||
<reg name="k_gs_base" bitsize="64" type="int64"/>
|
||||
|
||||
<!-- Control registers -->
|
||||
|
||||
<flags id="x64_cr0" size="8">
|
||||
<field name="PG" start="31" end="31"/>
|
||||
<field name="CD" start="30" end="30"/>
|
||||
<field name="NW" start="29" end="29"/>
|
||||
<field name="AM" start="18" end="18"/>
|
||||
<field name="WP" start="16" end="16"/>
|
||||
<field name="NE" start="5" end="5"/>
|
||||
<field name="ET" start="4" end="4"/>
|
||||
<field name="TS" start="3" end="3"/>
|
||||
<field name="EM" start="2" end="2"/>
|
||||
<field name="MP" start="1" end="1"/>
|
||||
<field name="PE" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<flags id="x64_cr3" size="8">
|
||||
<field name="PDBR" start="12" end="63"/>
|
||||
<!--field name="" start="3" end="11"/>
|
||||
<field name="WT" start="2" end="2"/>
|
||||
<field name="CD" start="1" end="1"/>
|
||||
<field name="" start="0" end="0"/-->
|
||||
<field name="PCID" start="0" end="11"/>
|
||||
</flags>
|
||||
|
||||
<flags id="x64_cr4" size="8">
|
||||
<field name="PKE" start="22" end="22"/>
|
||||
<field name="SMAP" start="21" end="21"/>
|
||||
<field name="SMEP" start="20" end="20"/>
|
||||
<field name="OSXSAVE" start="18" end="18"/>
|
||||
<field name="PCIDE" start="17" end="17"/>
|
||||
<field name="FSGSBASE" start="16" end="16"/>
|
||||
<field name="SMXE" start="14" end="14"/>
|
||||
<field name="VMXE" start="13" end="13"/>
|
||||
<field name="LA57" start="12" end="12"/>
|
||||
<field name="UMIP" start="11" end="11"/>
|
||||
<field name="OSXMMEXCPT" start="10" end="10"/>
|
||||
<field name="OSFXSR" start="9" end="9"/>
|
||||
<field name="PCE" start="8" end="8"/>
|
||||
<field name="PGE" start="7" end="7"/>
|
||||
<field name="MCE" start="6" end="6"/>
|
||||
<field name="PAE" start="5" end="5"/>
|
||||
<field name="PSE" start="4" end="4"/>
|
||||
<field name="DE" start="3" end="3"/>
|
||||
<field name="TSD" start="2" end="2"/>
|
||||
<field name="PVI" start="1" end="1"/>
|
||||
<field name="VME" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<flags id="x64_efer" size="8">
|
||||
<field name="TCE" start="15" end="15"/>
|
||||
<field name="FFXSR" start="14" end="14"/>
|
||||
<field name="LMSLE" start="13" end="13"/>
|
||||
<field name="SVME" start="12" end="12"/>
|
||||
<field name="NXE" start="11" end="11"/>
|
||||
<field name="LMA" start="10" end="10"/>
|
||||
<field name="LME" start="8" end="8"/>
|
||||
<field name="SCE" start="0" end="0"/>
|
||||
</flags>
|
||||
|
||||
<reg name="cr0" bitsize="64" type="x64_cr0"/>
|
||||
<reg name="cr2" bitsize="64" type="int64"/>
|
||||
<reg name="cr3" bitsize="64" type="x64_cr3"/>
|
||||
<reg name="cr4" bitsize="64" type="x64_cr4"/>
|
||||
<reg name="cr8" bitsize="64" type="int64"/>
|
||||
<reg name="efer" bitsize="64" type="x64_efer"/>
|
||||
|
||||
<!-- x87 FPU -->
|
||||
|
||||
<reg name="st0" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st1" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st2" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st3" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st4" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st5" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st6" bitsize="80" type="i387_ext"/>
|
||||
<reg name="st7" bitsize="80" type="i387_ext"/>
|
||||
|
||||
<reg name="fctrl" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fstat" bitsize="32" type="int" group="float"/>
|
||||
<reg name="ftag" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fiseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fioff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="foseg" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fooff" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fop" bitsize="32" type="int" group="float"/>
|
||||
|
||||
<vector id="v4f" type="ieee_single" count="4"/>
|
||||
<vector id="v2d" type="ieee_double" count="2"/>
|
||||
<vector id="v16i8" type="int8" count="16"/>
|
||||
<vector id="v8i16" type="int16" count="8"/>
|
||||
<vector id="v4i32" type="int32" count="4"/>
|
||||
<vector id="v2i64" type="int64" count="2"/>
|
||||
<union id="vec128">
|
||||
<field name="v4_float" type="v4f"/>
|
||||
<field name="v2_double" type="v2d"/>
|
||||
<field name="v16_int8" type="v16i8"/>
|
||||
<field name="v8_int16" type="v8i16"/>
|
||||
<field name="v4_int32" type="v4i32"/>
|
||||
<field name="v2_int64" type="v2i64"/>
|
||||
<field name="uint128" type="uint128"/>
|
||||
</union>
|
||||
<flags id="x64_mxcsr" size="4">
|
||||
<field name="IE" start="0" end="0"/>
|
||||
<field name="DE" start="1" end="1"/>
|
||||
<field name="ZE" start="2" end="2"/>
|
||||
<field name="OE" start="3" end="3"/>
|
||||
<field name="UE" start="4" end="4"/>
|
||||
<field name="PE" start="5" end="5"/>
|
||||
<field name="DAZ" start="6" end="6"/>
|
||||
<field name="IM" start="7" end="7"/>
|
||||
<field name="DM" start="8" end="8"/>
|
||||
<field name="ZM" start="9" end="9"/>
|
||||
<field name="OM" start="10" end="10"/>
|
||||
<field name="UM" start="11" end="11"/>
|
||||
<field name="PM" start="12" end="12"/>
|
||||
<field name="FZ" start="15" end="15"/>
|
||||
</flags>
|
||||
|
||||
<reg name="xmm0" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm1" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm2" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm3" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm4" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm5" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm6" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm7" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm8" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm9" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm10" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm11" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm12" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm13" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm14" bitsize="128" type="vec128"/>
|
||||
<reg name="xmm15" bitsize="128" type="vec128"/>
|
||||
|
||||
<reg name="mxcsr" bitsize="32" type="x64_mxcsr" group="vector"/>
|
||||
</feature>
|
||||
|
@@ -2531,7 +2531,7 @@ int gdbserver_start(const char *device)
|
||||
* FIXME: it's a bit weird to allow using a mux chardev here
|
||||
* and implicitly setup a monitor. We may want to break this.
|
||||
*/
|
||||
chr = qemu_chr_new_noreplay("gdb", device, true);
|
||||
chr = qemu_chr_new_noreplay("gdb", device, true, NULL);
|
||||
if (!chr)
|
||||
return -1;
|
||||
}
|
||||
@@ -2545,7 +2545,7 @@ int gdbserver_start(const char *device)
|
||||
|
||||
/* Initialize a monitor terminal for gdb */
|
||||
mon_chr = qemu_chardev_new(NULL, TYPE_CHARDEV_GDB,
|
||||
NULL, &error_abort);
|
||||
NULL, NULL, &error_abort);
|
||||
monitor_init(mon_chr, 0);
|
||||
} else {
|
||||
qemu_chr_fe_deinit(&s->chr, true);
|
||||
|
4
hmp.c
4
hmp.c
@@ -62,7 +62,7 @@ static void hmp_handle_error(Monitor *mon, Error **errp)
|
||||
{
|
||||
assert(errp);
|
||||
if (*errp) {
|
||||
error_report_err(*errp);
|
||||
error_reportf_err(*errp, "Error: ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2395,7 +2395,7 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict)
|
||||
if (opts == NULL) {
|
||||
error_setg(&err, "Parsing chardev args failed");
|
||||
} else {
|
||||
qemu_chr_new_from_opts(opts, &err);
|
||||
qemu_chr_new_from_opts(opts, NULL, &err);
|
||||
qemu_opts_del(opts);
|
||||
}
|
||||
hmp_handle_error(mon, &err);
|
||||
|
@@ -30,7 +30,7 @@ devices-dirs-$(CONFIG_SOFTMMU) += ssi/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += timer/
|
||||
devices-dirs-$(CONFIG_TPM) += tpm/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += usb/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += vfio/
|
||||
devices-dirs-$(CONFIG_VFIO) += vfio/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += virtio/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += watchdog/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += xen/
|
||||
|
@@ -1 +1 @@
|
||||
obj-y += dp264.o pci.o typhoon.o
|
||||
obj-$(CONFIG_DP264) += dp264.o pci.o typhoon.o
|
||||
|
@@ -114,7 +114,7 @@ static void clipper_init(MachineState *machine)
|
||||
error_report("no palcode provided");
|
||||
exit(1);
|
||||
}
|
||||
size = load_elf(palcode_filename, cpu_alpha_superpage_to_phys,
|
||||
size = load_elf(palcode_filename, NULL, cpu_alpha_superpage_to_phys,
|
||||
NULL, &palcode_entry, &palcode_low, &palcode_high,
|
||||
0, EM_ALPHA, 0, 0);
|
||||
if (size < 0) {
|
||||
@@ -133,7 +133,7 @@ static void clipper_init(MachineState *machine)
|
||||
if (kernel_filename) {
|
||||
uint64_t param_offset;
|
||||
|
||||
size = load_elf(kernel_filename, cpu_alpha_superpage_to_phys,
|
||||
size = load_elf(kernel_filename, NULL, cpu_alpha_superpage_to_phys,
|
||||
NULL, &kernel_entry, &kernel_low, &kernel_high,
|
||||
0, EM_ALPHA, 0, 0);
|
||||
if (size < 0) {
|
||||
|
@@ -1,4 +1,5 @@
|
||||
obj-y += boot.o virt.o sysbus-fdt.o
|
||||
obj-y += boot.o sysbus-fdt.o
|
||||
obj-$(CONFIG_ARM_VIRT) += virt.o
|
||||
obj-$(CONFIG_ACPI) += virt-acpi-build.o
|
||||
obj-$(CONFIG_DIGIC) += digic_boards.o
|
||||
obj-$(CONFIG_EXYNOS4) += exynos4_boards.o
|
||||
|
@@ -310,7 +310,8 @@ void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size)
|
||||
as = cpu_get_address_space(cs, asidx);
|
||||
|
||||
if (kernel_filename) {
|
||||
image_size = load_elf_as(kernel_filename, NULL, NULL, &entry, &lowaddr,
|
||||
image_size = load_elf_as(kernel_filename, NULL, NULL, NULL,
|
||||
&entry, &lowaddr,
|
||||
NULL, big_endian, EM_ARM, 1, 0, as);
|
||||
if (image_size < 0) {
|
||||
image_size = load_image_targphys_as(kernel_filename, 0,
|
||||
|
@@ -881,7 +881,7 @@ static int64_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
||||
}
|
||||
}
|
||||
|
||||
ret = load_elf_as(info->kernel_filename, NULL, NULL,
|
||||
ret = load_elf_as(info->kernel_filename, NULL, NULL, NULL,
|
||||
pentry, lowaddr, highaddr, big_endian, elf_machine,
|
||||
1, data_swab, as);
|
||||
if (ret <= 0) {
|
||||
|
@@ -799,7 +799,7 @@ static struct omap_sti_s *omap_sti_init(struct omap_target_agent_s *ta,
|
||||
s->irq = irq;
|
||||
omap_sti_reset(s);
|
||||
|
||||
qemu_chr_fe_init(&s->chr, chr ?: qemu_chr_new("null", "null"),
|
||||
qemu_chr_fe_init(&s->chr, chr ?: qemu_chr_new("null", "null", NULL),
|
||||
&error_abort);
|
||||
|
||||
memory_region_init_io(&s->iomem, NULL, &omap_sti_ops, s, "omap.sti",
|
||||
|
@@ -28,6 +28,10 @@
|
||||
#include "hw/virtio/virtio-bus.h"
|
||||
#include "hw/virtio/virtio-access.h"
|
||||
|
||||
/* We don't support discard yet, hide associated config fields. */
|
||||
#define VIRTIO_BLK_CFG_SIZE offsetof(struct virtio_blk_config, \
|
||||
max_discard_sectors)
|
||||
|
||||
static void virtio_blk_init_request(VirtIOBlock *s, VirtQueue *vq,
|
||||
VirtIOBlockReq *req)
|
||||
{
|
||||
@@ -63,9 +67,8 @@ static void virtio_blk_req_complete(VirtIOBlockReq *req, unsigned char status)
|
||||
static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,
|
||||
bool is_read)
|
||||
{
|
||||
BlockErrorAction action = blk_get_error_action(req->dev->blk,
|
||||
is_read, error);
|
||||
VirtIOBlock *s = req->dev;
|
||||
BlockErrorAction action = blk_get_error_action(s->blk, is_read, error);
|
||||
|
||||
if (action == BLOCK_ERROR_ACTION_STOP) {
|
||||
/* Break the link as the next request is going to be parsed from the
|
||||
@@ -138,7 +141,7 @@ static void virtio_blk_flush_complete(void *opaque, int ret)
|
||||
}
|
||||
|
||||
virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
|
||||
block_acct_done(blk_get_stats(req->dev->blk), &req->acct);
|
||||
block_acct_done(blk_get_stats(s->blk), &req->acct);
|
||||
virtio_blk_free_request(req);
|
||||
|
||||
out:
|
||||
@@ -513,7 +516,7 @@ static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
||||
- sizeof(struct virtio_blk_inhdr);
|
||||
iov_discard_back(in_iov, &in_num, sizeof(struct virtio_blk_inhdr));
|
||||
|
||||
type = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);
|
||||
type = virtio_ldl_p(vdev, &req->out.type);
|
||||
|
||||
/* VIRTIO_BLK_T_OUT defines the command direction. VIRTIO_BLK_T_BARRIER
|
||||
* is an optional flag. Although a guest should not send this flag if
|
||||
@@ -522,8 +525,7 @@ static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
||||
case VIRTIO_BLK_T_IN:
|
||||
{
|
||||
bool is_write = type & VIRTIO_BLK_T_OUT;
|
||||
req->sector_num = virtio_ldq_p(VIRTIO_DEVICE(req->dev),
|
||||
&req->out.sector);
|
||||
req->sector_num = virtio_ldq_p(vdev, &req->out.sector);
|
||||
|
||||
if (is_write) {
|
||||
qemu_iovec_init_external(&req->qiov, out_iov, out_num);
|
||||
@@ -535,25 +537,23 @@ static int virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb)
|
||||
req->qiov.size / BDRV_SECTOR_SIZE);
|
||||
}
|
||||
|
||||
if (!virtio_blk_sect_range_ok(req->dev, req->sector_num,
|
||||
req->qiov.size)) {
|
||||
if (!virtio_blk_sect_range_ok(s, req->sector_num, req->qiov.size)) {
|
||||
virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);
|
||||
block_acct_invalid(blk_get_stats(req->dev->blk),
|
||||
block_acct_invalid(blk_get_stats(s->blk),
|
||||
is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ);
|
||||
virtio_blk_free_request(req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
block_acct_start(blk_get_stats(req->dev->blk),
|
||||
&req->acct, req->qiov.size,
|
||||
block_acct_start(blk_get_stats(s->blk), &req->acct, req->qiov.size,
|
||||
is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ);
|
||||
|
||||
/* merge would exceed maximum number of requests or IO direction
|
||||
* changes */
|
||||
if (mrb->num_reqs > 0 && (mrb->num_reqs == VIRTIO_BLK_MAX_MERGE_REQS ||
|
||||
is_write != mrb->is_write ||
|
||||
!req->dev->conf.request_merging)) {
|
||||
virtio_blk_submit_multireq(req->dev->blk, mrb);
|
||||
!s->conf.request_merging)) {
|
||||
virtio_blk_submit_multireq(s->blk, mrb);
|
||||
}
|
||||
|
||||
assert(mrb->num_reqs < VIRTIO_BLK_MAX_MERGE_REQS);
|
||||
@@ -761,7 +761,8 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
||||
blkcfg.alignment_offset = 0;
|
||||
blkcfg.wce = blk_enable_write_cache(s->blk);
|
||||
virtio_stw_p(vdev, &blkcfg.num_queues, s->conf.num_queues);
|
||||
memcpy(config, &blkcfg, sizeof(struct virtio_blk_config));
|
||||
memcpy(config, &blkcfg, VIRTIO_BLK_CFG_SIZE);
|
||||
QEMU_BUILD_BUG_ON(VIRTIO_BLK_CFG_SIZE > sizeof(blkcfg));
|
||||
}
|
||||
|
||||
static void virtio_blk_set_config(VirtIODevice *vdev, const uint8_t *config)
|
||||
@@ -769,7 +770,8 @@ static void virtio_blk_set_config(VirtIODevice *vdev, const uint8_t *config)
|
||||
VirtIOBlock *s = VIRTIO_BLK(vdev);
|
||||
struct virtio_blk_config blkcfg;
|
||||
|
||||
memcpy(&blkcfg, config, sizeof(blkcfg));
|
||||
memcpy(&blkcfg, config, VIRTIO_BLK_CFG_SIZE);
|
||||
QEMU_BUILD_BUG_ON(VIRTIO_BLK_CFG_SIZE > sizeof(blkcfg));
|
||||
|
||||
aio_context_acquire(blk_get_aio_context(s->blk));
|
||||
blk_set_enable_write_cache(s->blk, blkcfg.wce != 0);
|
||||
@@ -952,8 +954,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
virtio_init(vdev, "virtio-blk", VIRTIO_ID_BLOCK,
|
||||
sizeof(struct virtio_blk_config));
|
||||
virtio_init(vdev, "virtio-blk", VIRTIO_ID_BLOCK, VIRTIO_BLK_CFG_SIZE);
|
||||
|
||||
s->blk = conf->conf.blk;
|
||||
s->rq = NULL;
|
||||
|
@@ -501,7 +501,7 @@ static const TypeInfo char_hci_type_info = {
|
||||
Chardev *uart_hci_init(void)
|
||||
{
|
||||
return qemu_chardev_new(NULL, TYPE_CHARDEV_HCI,
|
||||
NULL, &error_abort);
|
||||
NULL, NULL, &error_abort);
|
||||
}
|
||||
|
||||
static void register_types(void)
|
||||
|
@@ -63,7 +63,7 @@ struct omap_uart_s *omap_uart_init(hwaddr base,
|
||||
s->irq = irq;
|
||||
s->serial = serial_mm_init(get_system_memory(), base, 2, irq,
|
||||
omap_clk_getrate(fclk)/16,
|
||||
chr ?: qemu_chr_new(label, "null"),
|
||||
chr ?: qemu_chr_new(label, "null", NULL),
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
return s;
|
||||
}
|
||||
@@ -183,6 +183,6 @@ void omap_uart_attach(struct omap_uart_s *s, Chardev *chr)
|
||||
/* TODO: Should reuse or destroy current s->serial */
|
||||
s->serial = serial_mm_init(get_system_memory(), s->base, 2, s->irq,
|
||||
omap_clk_getrate(s->fclk) / 16,
|
||||
chr ?: qemu_chr_new("null", "null"),
|
||||
chr ?: qemu_chr_new("null", "null", NULL),
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
}
|
||||
|
@@ -31,7 +31,7 @@ typedef struct Terminal3270 {
|
||||
uint8_t outv[OUTPUT_BUFFER_SIZE];
|
||||
int in_len;
|
||||
bool handshake_done;
|
||||
GSource *timer_src;
|
||||
guint timer_tag;
|
||||
} Terminal3270;
|
||||
|
||||
#define TYPE_TERMINAL_3270 "x-terminal3270"
|
||||
@@ -47,10 +47,9 @@ static int terminal_can_read(void *opaque)
|
||||
|
||||
static void terminal_timer_cancel(Terminal3270 *t)
|
||||
{
|
||||
if (t->timer_src) {
|
||||
g_source_destroy(t->timer_src);
|
||||
g_source_unref(t->timer_src);
|
||||
t->timer_src = NULL;
|
||||
if (t->timer_tag) {
|
||||
g_source_remove(t->timer_tag);
|
||||
t->timer_tag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,8 +99,7 @@ static void terminal_read(void *opaque, const uint8_t *buf, int size)
|
||||
assert(size <= (INPUT_BUFFER_SIZE - t->in_len));
|
||||
|
||||
terminal_timer_cancel(t);
|
||||
t->timer_src = qemu_chr_timeout_add_ms(t->chr.chr, 600 * 1000,
|
||||
send_timing_mark_cb, t);
|
||||
t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t);
|
||||
memcpy(&t->inv[t->in_len], buf, size);
|
||||
t->in_len += size;
|
||||
if (t->in_len < 2) {
|
||||
@@ -160,8 +158,7 @@ static void chr_event(void *opaque, int event)
|
||||
* char-socket.c. Once qemu receives the terminal-type of the
|
||||
* client, mark handshake done and trigger everything rolling again.
|
||||
*/
|
||||
t->timer_src = qemu_chr_timeout_add_ms(t->chr.chr, 600 * 1000,
|
||||
send_timing_mark_cb, t);
|
||||
t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t);
|
||||
break;
|
||||
case CHR_EVENT_CLOSED:
|
||||
sch->curr_status.scsw.dstat = SCSW_DSTAT_DEVICE_END;
|
||||
|
@@ -211,7 +211,8 @@ static int con_init(struct XenLegacyDevice *xendev)
|
||||
* FIXME: sure we want to support implicit
|
||||
* muxed monitors here?
|
||||
*/
|
||||
qemu_chr_new_mux_mon(label, output), &error_abort);
|
||||
qemu_chr_new_mux_mon(label, output, NULL),
|
||||
&error_abort);
|
||||
}
|
||||
|
||||
xenstore_store_pv_console_info(con->xendev.dev,
|
||||
|
@@ -136,7 +136,7 @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
|
||||
AddressSpace *as = s->cpu ? s->cpu->as : NULL;
|
||||
|
||||
if (!s->force_raw) {
|
||||
size = load_elf_as(s->file, NULL, NULL, &entry, NULL, NULL,
|
||||
size = load_elf_as(s->file, NULL, NULL, NULL, &entry, NULL, NULL,
|
||||
big_endian, 0, 0, 0, as);
|
||||
|
||||
if (size < 0) {
|
||||
|
@@ -77,21 +77,20 @@ int64_t get_image_size(const char *filename)
|
||||
ssize_t load_image_size(const char *filename, void *addr, size_t size)
|
||||
{
|
||||
int fd;
|
||||
ssize_t actsize;
|
||||
ssize_t actsize, l = 0;
|
||||
|
||||
fd = open(filename, O_RDONLY | O_BINARY);
|
||||
if (fd < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
actsize = read(fd, addr, size);
|
||||
if (actsize < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
while ((actsize = read(fd, addr + l, size - l)) > 0) {
|
||||
l += actsize;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
return actsize;
|
||||
return actsize < 0 ? -1 : l;
|
||||
}
|
||||
|
||||
/* read()-like version */
|
||||
@@ -396,37 +395,42 @@ fail:
|
||||
}
|
||||
|
||||
/* return < 0 if error, otherwise the number of bytes loaded in memory */
|
||||
int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t),
|
||||
int load_elf(const char *filename,
|
||||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
||||
uint64_t *highaddr, int big_endian, int elf_machine,
|
||||
int clear_lsb, int data_swab)
|
||||
{
|
||||
return load_elf_as(filename, translate_fn, translate_opaque, pentry,
|
||||
lowaddr, highaddr, big_endian, elf_machine, clear_lsb,
|
||||
data_swab, NULL);
|
||||
return load_elf_as(filename, elf_note_fn, translate_fn, translate_opaque,
|
||||
pentry, lowaddr, highaddr, big_endian, elf_machine,
|
||||
clear_lsb, data_swab, NULL);
|
||||
}
|
||||
|
||||
/* return < 0 if error, otherwise the number of bytes loaded in memory */
|
||||
int load_elf_as(const char *filename,
|
||||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
||||
uint64_t *highaddr, int big_endian, int elf_machine,
|
||||
int clear_lsb, int data_swab, AddressSpace *as)
|
||||
{
|
||||
return load_elf_ram(filename, translate_fn, translate_opaque,
|
||||
return load_elf_ram(filename, elf_note_fn, translate_fn, translate_opaque,
|
||||
pentry, lowaddr, highaddr, big_endian, elf_machine,
|
||||
clear_lsb, data_swab, as, true);
|
||||
}
|
||||
|
||||
/* return < 0 if error, otherwise the number of bytes loaded in memory */
|
||||
int load_elf_ram(const char *filename,
|
||||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
||||
uint64_t *highaddr, int big_endian, int elf_machine,
|
||||
int clear_lsb, int data_swab, AddressSpace *as,
|
||||
bool load_rom)
|
||||
{
|
||||
return load_elf_ram_sym(filename, translate_fn, translate_opaque,
|
||||
return load_elf_ram_sym(filename, elf_note_fn,
|
||||
translate_fn, translate_opaque,
|
||||
pentry, lowaddr, highaddr, big_endian,
|
||||
elf_machine, clear_lsb, data_swab, as,
|
||||
load_rom, NULL);
|
||||
@@ -434,6 +438,7 @@ int load_elf_ram(const char *filename,
|
||||
|
||||
/* return < 0 if error, otherwise the number of bytes loaded in memory */
|
||||
int load_elf_ram_sym(const char *filename,
|
||||
uint64_t (*elf_note_fn)(void *, void *, bool),
|
||||
uint64_t (*translate_fn)(void *, uint64_t),
|
||||
void *translate_opaque, uint64_t *pentry,
|
||||
uint64_t *lowaddr, uint64_t *highaddr, int big_endian,
|
||||
@@ -476,11 +481,13 @@ int load_elf_ram_sym(const char *filename,
|
||||
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
if (e_ident[EI_CLASS] == ELFCLASS64) {
|
||||
ret = load_elf64(filename, fd, translate_fn, translate_opaque, must_swab,
|
||||
ret = load_elf64(filename, fd, elf_note_fn,
|
||||
translate_fn, translate_opaque, must_swab,
|
||||
pentry, lowaddr, highaddr, elf_machine, clear_lsb,
|
||||
data_swab, as, load_rom, sym_cb);
|
||||
} else {
|
||||
ret = load_elf32(filename, fd, translate_fn, translate_opaque, must_swab,
|
||||
ret = load_elf32(filename, fd, elf_note_fn,
|
||||
translate_fn, translate_opaque, must_swab,
|
||||
pentry, lowaddr, highaddr, elf_machine, clear_lsb,
|
||||
data_swab, as, load_rom, sym_cb);
|
||||
}
|
||||
|
@@ -79,6 +79,9 @@ static void cpu_cluster_class_init(ObjectClass *klass, void *data)
|
||||
|
||||
dc->props = cpu_cluster_properties;
|
||||
dc->realize = cpu_cluster_realize;
|
||||
|
||||
/* This is not directly for users, CPU children must be attached by code */
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
|
||||
static const TypeInfo cpu_cluster_type_info = {
|
||||
|
@@ -1,2 +1,2 @@
|
||||
obj-y += boot.o
|
||||
obj-y += axis_dev88.o
|
||||
obj-$(CONFIG_AXIS) += axis_dev88.o
|
||||
|
@@ -75,7 +75,8 @@ void cris_load_image(CRISCPU *cpu, struct cris_load_info *li)
|
||||
env->load_info = li;
|
||||
/* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis
|
||||
devboard SDK. */
|
||||
image_size = load_elf(li->image_filename, translate_kernel_address, NULL,
|
||||
image_size = load_elf(li->image_filename, NULL,
|
||||
translate_kernel_address, NULL,
|
||||
&entry, NULL, &high, 0, EM_CRIS, 0, 0);
|
||||
li->entry = entry;
|
||||
if (image_size < 0) {
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/dma/i8257.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/log.h"
|
||||
#include "trace.h"
|
||||
|
||||
#define I8257(obj) \
|
||||
@@ -185,7 +186,8 @@ static void i8257_write_cont(void *opaque, hwaddr nport, uint64_t data,
|
||||
switch (iport) {
|
||||
case 0x00: /* command */
|
||||
if ((data != 0) && (data & CMD_NOT_SUPPORTED)) {
|
||||
dolog("command %"PRIx64" not supported\n", data);
|
||||
qemu_log_mask(LOG_UNIMP, "%s: cmd 0x%02"PRIx64" not supported\n",
|
||||
__func__, data);
|
||||
return;
|
||||
}
|
||||
d->command = data;
|
||||
|
@@ -1 +1 @@
|
||||
obj-y += machine.o pci.o dino.o
|
||||
obj-$(CONFIG_DINO) += pci.o machine.o dino.o
|
||||
|
@@ -105,6 +105,7 @@ typedef struct DinoState {
|
||||
MemoryRegion bm;
|
||||
MemoryRegion bm_ram_alias;
|
||||
MemoryRegion bm_pci_alias;
|
||||
MemoryRegion bm_cpu_alias;
|
||||
|
||||
MemoryRegion cpu0_eir_mem;
|
||||
} DinoState;
|
||||
@@ -473,12 +474,17 @@ PCIBus *dino_init(MemoryRegion *addr_space,
|
||||
memory_region_init_alias(&s->bm_pci_alias, OBJECT(s),
|
||||
"bm-pci", &s->pci_mem,
|
||||
0xf0000000 + DINO_MEM_CHUNK_SIZE,
|
||||
31 * DINO_MEM_CHUNK_SIZE);
|
||||
30 * DINO_MEM_CHUNK_SIZE);
|
||||
memory_region_init_alias(&s->bm_cpu_alias, OBJECT(s),
|
||||
"bm-cpu", addr_space, 0xfff00000,
|
||||
0xfffff);
|
||||
memory_region_add_subregion(&s->bm, 0,
|
||||
&s->bm_ram_alias);
|
||||
memory_region_add_subregion(&s->bm,
|
||||
0xf0000000 + DINO_MEM_CHUNK_SIZE,
|
||||
&s->bm_pci_alias);
|
||||
memory_region_add_subregion(&s->bm, 0xfff00000,
|
||||
&s->bm_cpu_alias);
|
||||
address_space_init(&s->bm_as, &s->bm, "pci-bm");
|
||||
pci_setup_iommu(b, dino_pcihost_set_iommu, s);
|
||||
|
||||
|
@@ -135,8 +135,8 @@ static void machine_hppa_init(MachineState *machine)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
size = load_elf(firmware_filename, NULL,
|
||||
NULL, &firmware_entry, &firmware_low, &firmware_high,
|
||||
size = load_elf(firmware_filename, NULL, NULL, NULL,
|
||||
&firmware_entry, &firmware_low, &firmware_high,
|
||||
true, EM_PARISC, 0, 0);
|
||||
|
||||
/* Unfortunately, load_elf sign-extends reading elf32. */
|
||||
@@ -165,7 +165,7 @@ static void machine_hppa_init(MachineState *machine)
|
||||
|
||||
/* Load kernel */
|
||||
if (kernel_filename) {
|
||||
size = load_elf(kernel_filename, &cpu_hppa_to_phys,
|
||||
size = load_elf(kernel_filename, NULL, &cpu_hppa_to_phys,
|
||||
NULL, &kernel_entry, &kernel_low, &kernel_high,
|
||||
true, EM_PARISC, 0, 0);
|
||||
|
||||
|
@@ -1,8 +1,9 @@
|
||||
common-obj-$(CONFIG_I2C) += core.o smbus.o smbus_eeprom.o
|
||||
common-obj-$(CONFIG_I2C) += core.o smbus.o
|
||||
common-obj-$(CONFIG_SMBUS_EEPROM) += smbus_eeprom.o
|
||||
common-obj-$(CONFIG_DDC) += i2c-ddc.o
|
||||
common-obj-$(CONFIG_VERSATILE_I2C) += versatile_i2c.o
|
||||
common-obj-$(CONFIG_ACPI_X86) += smbus_ich9.o
|
||||
common-obj-$(CONFIG_APM) += pm_smbus.o
|
||||
common-obj-$(CONFIG_ACPI_SMBUS) += pm_smbus.o
|
||||
common-obj-$(CONFIG_BITBANG_I2C) += bitbang_i2c.o
|
||||
common-obj-$(CONFIG_EXYNOS4) += exynos4210_i2c.o
|
||||
common-obj-$(CONFIG_IMX_I2C) += imx_i2c.o
|
||||
|
@@ -1,6 +1,8 @@
|
||||
obj-$(CONFIG_KVM) += kvm/
|
||||
obj-y += multiboot.o
|
||||
obj-y += pc.o pc_piix.o pc_q35.o
|
||||
obj-y += pc.o
|
||||
obj-$(CONFIG_I440FX) += pc_piix.o
|
||||
obj-$(CONFIG_Q35) += pc_q35.o
|
||||
obj-y += pc_sysfw.o
|
||||
obj-$(CONFIG_VTD) += x86-iommu.o intel_iommu.o
|
||||
obj-$(CONFIG_AMD_IOMMU) += x86-iommu.o amd_iommu.o
|
||||
|
@@ -199,7 +199,7 @@ int load_multiboot(FWCfgState *fw_cfg,
|
||||
exit(1);
|
||||
}
|
||||
|
||||
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
||||
kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, &elf_entry,
|
||||
&elf_low, &elf_high, 0, I386_ELF_MACHINE,
|
||||
0, 0);
|
||||
if (kernel_size < 0) {
|
||||
|
221
hw/i386/pc.c
221
hw/i386/pc.c
@@ -54,6 +54,7 @@
|
||||
#include "sysemu/qtest.h"
|
||||
#include "kvm_i386.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "hw/xen/start_info.h"
|
||||
#include "ui/qemu-spice.h"
|
||||
#include "exec/memory.h"
|
||||
#include "exec/address-spaces.h"
|
||||
@@ -75,6 +76,7 @@
|
||||
#include "hw/usb.h"
|
||||
#include "hw/i386/intel_iommu.h"
|
||||
#include "hw/net/ne2000-isa.h"
|
||||
#include "standard-headers/asm-x86/bootparam.h"
|
||||
|
||||
/* debug PC/ISA interrupts */
|
||||
//#define DEBUG_IRQ
|
||||
@@ -110,6 +112,9 @@ static struct e820_entry *e820_table;
|
||||
static unsigned e820_entries;
|
||||
struct hpet_fw_config hpet_cfg = {.count = UINT8_MAX};
|
||||
|
||||
/* Physical Address of PVH entry point read from kernel ELF NOTE */
|
||||
static size_t pvh_start_addr;
|
||||
|
||||
GlobalProperty pc_compat_3_1[] = {
|
||||
{ "intel-iommu", "dma-drain", "off" },
|
||||
{ "Opteron_G3" "-" TYPE_X86_CPU, "rdtscp", "off" },
|
||||
@@ -1055,13 +1060,6 @@ static long get_file_size(FILE *f)
|
||||
return size;
|
||||
}
|
||||
|
||||
/* setup_data types */
|
||||
#define SETUP_NONE 0
|
||||
#define SETUP_E820_EXT 1
|
||||
#define SETUP_DTB 2
|
||||
#define SETUP_PCI 3
|
||||
#define SETUP_EFI 4
|
||||
|
||||
struct setup_data {
|
||||
uint64_t next;
|
||||
uint32_t type;
|
||||
@@ -1069,6 +1067,109 @@ struct setup_data {
|
||||
uint8_t data[0];
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
/*
|
||||
* The entry point into the kernel for PVH boot is different from
|
||||
* the native entry point. The PVH entry is defined by the x86/HVM
|
||||
* direct boot ABI and is available in an ELFNOTE in the kernel binary.
|
||||
*
|
||||
* This function is passed to load_elf() when it is called from
|
||||
* load_elfboot() which then additionally checks for an ELF Note of
|
||||
* type XEN_ELFNOTE_PHYS32_ENTRY and passes it to this function to
|
||||
* parse the PVH entry address from the ELF Note.
|
||||
*
|
||||
* Due to trickery in elf_opts.h, load_elf() is actually available as
|
||||
* load_elf32() or load_elf64() and this routine needs to be able
|
||||
* to deal with being called as 32 or 64 bit.
|
||||
*
|
||||
* The address of the PVH entry point is saved to the 'pvh_start_addr'
|
||||
* global variable. (although the entry point is 32-bit, the kernel
|
||||
* binary can be either 32-bit or 64-bit).
|
||||
*/
|
||||
static uint64_t read_pvh_start_addr(void *arg1, void *arg2, bool is64)
|
||||
{
|
||||
size_t *elf_note_data_addr;
|
||||
|
||||
/* Check if ELF Note header passed in is valid */
|
||||
if (arg1 == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (is64) {
|
||||
struct elf64_note *nhdr64 = (struct elf64_note *)arg1;
|
||||
uint64_t nhdr_size64 = sizeof(struct elf64_note);
|
||||
uint64_t phdr_align = *(uint64_t *)arg2;
|
||||
uint64_t nhdr_namesz = nhdr64->n_namesz;
|
||||
|
||||
elf_note_data_addr =
|
||||
((void *)nhdr64) + nhdr_size64 +
|
||||
QEMU_ALIGN_UP(nhdr_namesz, phdr_align);
|
||||
} else {
|
||||
struct elf32_note *nhdr32 = (struct elf32_note *)arg1;
|
||||
uint32_t nhdr_size32 = sizeof(struct elf32_note);
|
||||
uint32_t phdr_align = *(uint32_t *)arg2;
|
||||
uint32_t nhdr_namesz = nhdr32->n_namesz;
|
||||
|
||||
elf_note_data_addr =
|
||||
((void *)nhdr32) + nhdr_size32 +
|
||||
QEMU_ALIGN_UP(nhdr_namesz, phdr_align);
|
||||
}
|
||||
|
||||
pvh_start_addr = *elf_note_data_addr;
|
||||
|
||||
return pvh_start_addr;
|
||||
}
|
||||
|
||||
static bool load_elfboot(const char *kernel_filename,
|
||||
int kernel_file_size,
|
||||
uint8_t *header,
|
||||
size_t pvh_xen_start_addr,
|
||||
FWCfgState *fw_cfg)
|
||||
{
|
||||
uint32_t flags = 0;
|
||||
uint32_t mh_load_addr = 0;
|
||||
uint32_t elf_kernel_size = 0;
|
||||
uint64_t elf_entry;
|
||||
uint64_t elf_low, elf_high;
|
||||
int kernel_size;
|
||||
|
||||
if (ldl_p(header) != 0x464c457f) {
|
||||
return false; /* no elfboot */
|
||||
}
|
||||
|
||||
bool elf_is64 = header[EI_CLASS] == ELFCLASS64;
|
||||
flags = elf_is64 ?
|
||||
((Elf64_Ehdr *)header)->e_flags : ((Elf32_Ehdr *)header)->e_flags;
|
||||
|
||||
if (flags & 0x00010004) { /* LOAD_ELF_HEADER_HAS_ADDR */
|
||||
error_report("elfboot unsupported flags = %x", flags);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
uint64_t elf_note_type = XEN_ELFNOTE_PHYS32_ENTRY;
|
||||
kernel_size = load_elf(kernel_filename, read_pvh_start_addr,
|
||||
NULL, &elf_note_type, &elf_entry,
|
||||
&elf_low, &elf_high, 0, I386_ELF_MACHINE,
|
||||
0, 0);
|
||||
|
||||
if (kernel_size < 0) {
|
||||
error_report("Error while loading elf kernel");
|
||||
exit(1);
|
||||
}
|
||||
mh_load_addr = elf_low;
|
||||
elf_kernel_size = elf_high - elf_low;
|
||||
|
||||
if (pvh_start_addr == 0) {
|
||||
error_report("Error loading uncompressed kernel without PVH ELF Note");
|
||||
exit(1);
|
||||
}
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ENTRY, pvh_start_addr);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, mh_load_addr);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, elf_kernel_size);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void load_linux(PCMachineState *pcms,
|
||||
FWCfgState *fw_cfg)
|
||||
{
|
||||
@@ -1108,6 +1209,59 @@ static void load_linux(PCMachineState *pcms,
|
||||
if (ldl_p(header+0x202) == 0x53726448) {
|
||||
protocol = lduw_p(header+0x206);
|
||||
} else {
|
||||
/*
|
||||
* Check if the file is an uncompressed kernel file (ELF) and load it,
|
||||
* saving the PVH entry point used by the x86/HVM direct boot ABI.
|
||||
* If load_elfboot() is successful, populate the fw_cfg info.
|
||||
*/
|
||||
if (pcmc->pvh_enabled &&
|
||||
load_elfboot(kernel_filename, kernel_size,
|
||||
header, pvh_start_addr, fw_cfg)) {
|
||||
fclose(f);
|
||||
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE,
|
||||
strlen(kernel_cmdline) + 1);
|
||||
fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA, kernel_cmdline);
|
||||
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_SETUP_SIZE, sizeof(header));
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SETUP_DATA,
|
||||
header, sizeof(header));
|
||||
|
||||
/* load initrd */
|
||||
if (initrd_filename) {
|
||||
gsize initrd_size;
|
||||
gchar *initrd_data;
|
||||
GError *gerr = NULL;
|
||||
|
||||
if (!g_file_get_contents(initrd_filename, &initrd_data,
|
||||
&initrd_size, &gerr)) {
|
||||
fprintf(stderr, "qemu: error reading initrd %s: %s\n",
|
||||
initrd_filename, gerr->message);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
initrd_max = pcms->below_4g_mem_size - pcmc->acpi_data_size - 1;
|
||||
if (initrd_size >= initrd_max) {
|
||||
fprintf(stderr, "qemu: initrd is too large, cannot support."
|
||||
"(max: %"PRIu32", need %"PRId64")\n",
|
||||
initrd_max, (uint64_t)initrd_size);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
initrd_addr = (initrd_max - initrd_size) & ~4095;
|
||||
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data,
|
||||
initrd_size);
|
||||
}
|
||||
|
||||
option_rom[nb_option_roms].bootindex = 0;
|
||||
option_rom[nb_option_roms].name = "pvh.bin";
|
||||
nb_option_roms++;
|
||||
|
||||
return;
|
||||
}
|
||||
/* This looks like a multiboot kernel. If it is, let's stop
|
||||
treating it like a Linux kernel. */
|
||||
if (load_multiboot(fw_cfg, f, kernel_filename, initrd_filename,
|
||||
@@ -1145,7 +1299,26 @@ static void load_linux(PCMachineState *pcms,
|
||||
#endif
|
||||
|
||||
/* highest address for loading the initrd */
|
||||
if (protocol >= 0x203) {
|
||||
if (protocol >= 0x20c &&
|
||||
lduw_p(header+0x236) & XLF_CAN_BE_LOADED_ABOVE_4G) {
|
||||
/*
|
||||
* Linux has supported initrd up to 4 GB for a very long time (2007,
|
||||
* long before XLF_CAN_BE_LOADED_ABOVE_4G which was added in 2013),
|
||||
* though it only sets initrd_max to 2 GB to "work around bootloader
|
||||
* bugs". Luckily, QEMU firmware(which does something like bootloader)
|
||||
* has supported this.
|
||||
*
|
||||
* It's believed that if XLF_CAN_BE_LOADED_ABOVE_4G is set, initrd can
|
||||
* be loaded into any address.
|
||||
*
|
||||
* In addition, initrd_max is uint32_t simply because QEMU doesn't
|
||||
* support the 64-bit boot protocol (specifically the ext_ramdisk_image
|
||||
* field).
|
||||
*
|
||||
* Therefore here just limit initrd_max to UINT32_MAX simply as well.
|
||||
*/
|
||||
initrd_max = UINT32_MAX;
|
||||
} else if (protocol >= 0x203) {
|
||||
initrd_max = ldl_p(header+0x22c);
|
||||
} else {
|
||||
initrd_max = 0x37ffffff;
|
||||
@@ -1557,6 +1730,7 @@ void xen_load_linux(PCMachineState *pcms)
|
||||
for (i = 0; i < nb_option_roms; i++) {
|
||||
assert(!strcmp(option_rom[i].name, "linuxboot.bin") ||
|
||||
!strcmp(option_rom[i].name, "linuxboot_dma.bin") ||
|
||||
!strcmp(option_rom[i].name, "pvh.bin") ||
|
||||
!strcmp(option_rom[i].name, "multiboot.bin"));
|
||||
rom_add_option(option_rom[i].name, option_rom[i].bootindex);
|
||||
}
|
||||
@@ -1948,7 +2122,6 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
static void pc_memory_plug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
|
||||
@@ -1962,8 +2135,7 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev,
|
||||
nvdimm_plug(&pcms->acpi_nvdimm_state);
|
||||
}
|
||||
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &error_abort);
|
||||
hotplug_handler_plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &error_abort);
|
||||
out:
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
@@ -1971,7 +2143,6 @@ out:
|
||||
static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
|
||||
@@ -1992,9 +2163,8 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
|
||||
goto out;
|
||||
}
|
||||
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
|
||||
hotplug_handler_unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev,
|
||||
&local_err);
|
||||
out:
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
@@ -2003,12 +2173,9 @@ static void pc_memory_unplug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
|
||||
hotplug_handler_unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
@@ -2050,14 +2217,12 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
CPUArchId *found_cpu;
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
X86CPU *cpu = X86_CPU(dev);
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
|
||||
if (pcms->acpi_dev) {
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
hotplug_handler_plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
@@ -2081,7 +2246,6 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
int idx = -1;
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
X86CPU *cpu = X86_CPU(dev);
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
@@ -2098,9 +2262,8 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||
goto out;
|
||||
}
|
||||
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
|
||||
hotplug_handler_unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev,
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
@@ -2114,14 +2277,11 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp)
|
||||
{
|
||||
CPUArchId *found_cpu;
|
||||
HotplugHandlerClass *hhc;
|
||||
Error *local_err = NULL;
|
||||
X86CPU *cpu = X86_CPU(dev);
|
||||
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
|
||||
|
||||
hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
|
||||
hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
|
||||
hotplug_handler_unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);
|
||||
if (local_err) {
|
||||
goto out;
|
||||
}
|
||||
@@ -2623,6 +2783,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
pcmc->acpi_data_size = 0x20000 + 0x8000;
|
||||
pcmc->save_tsc_khz = true;
|
||||
pcmc->linuxboot_dma_enabled = true;
|
||||
pcmc->pvh_enabled = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
mc->get_hotplug_handler = pc_get_hotplug_handler;
|
||||
mc->cpu_index_to_instance_props = pc_cpu_index_to_props;
|
||||
|
@@ -440,9 +440,12 @@ DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL,
|
||||
|
||||
static void pc_i440fx_3_1_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
|
||||
pc_i440fx_4_0_machine_options(m);
|
||||
m->is_default = 0;
|
||||
m->alias = NULL;
|
||||
pcmc->pvh_enabled = false;
|
||||
compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
|
||||
compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
|
||||
}
|
||||
|
@@ -376,9 +376,12 @@ DEFINE_Q35_MACHINE(v4_0, "pc-q35-4.0", NULL,
|
||||
|
||||
static void pc_q35_3_1_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
|
||||
pc_q35_4_0_machine_options(m);
|
||||
m->default_kernel_irqchip_split = false;
|
||||
m->alias = NULL;
|
||||
pcmc->pvh_enabled = false;
|
||||
compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
|
||||
compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user