4
* Copyright (c) 2005 Fabrice Bellard
4
* Copyright (c) 2005-2008 Fabrice Bellard
6
6
* This library is free software; you can redistribute it and/or
7
7
* modify it under the terms of the GNU Lesser General Public
16
16
* You should have received a copy of the GNU Lesser General Public
17
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
20
20
#include "config.h"
42
42
#include "exec-all.h"
43
#include "qemu-common.h"
52
# define LOG_INT(...) qemu_log_mask(CPU_LOG_INT, ## __VA_ARGS__)
53
# define LOG_INT_STATE(env) log_cpu_state_mask(CPU_LOG_INT, (env), 0)
55
# define LOG_INT(...) do { } while (0)
56
# define LOG_INT_STATE(env) do { } while (0)
49
59
#include <unistd.h>
53
/* compatibility stuff */
54
#ifndef KQEMU_RET_SYSCALL
55
#define KQEMU_RET_SYSCALL 0x0300 /* syscall insn */
57
#ifndef KQEMU_MAX_RAM_PAGES_TO_UPDATE
58
#define KQEMU_MAX_RAM_PAGES_TO_UPDATE 512
59
#define KQEMU_RAM_PAGES_UPDATE_ALL (KQEMU_MAX_RAM_PAGES_TO_UPDATE + 1)
61
#ifndef KQEMU_MAX_MODIFIED_RAM_PAGES
62
#define KQEMU_MAX_MODIFIED_RAM_PAGES 512
66
64
#define KQEMU_DEVICE "\\\\.\\kqemu"
68
66
#define KQEMU_DEVICE "/dev/kqemu"
69
static void qpi_init(void);
72
72
#define KQEMU_INVALID_FD INVALID_HANDLE_VALUE
73
73
HANDLE kqemu_fd = KQEMU_INVALID_FD;
85
85
int kqemu_allowed = 1;
86
unsigned long *pages_to_flush;
86
uint64_t *pages_to_flush;
87
87
unsigned int nb_pages_to_flush;
88
unsigned long *ram_pages_to_update;
88
uint64_t *ram_pages_to_update;
89
89
unsigned int nb_ram_pages_to_update;
90
unsigned long *modified_ram_pages;
90
uint64_t *modified_ram_pages;
91
91
unsigned int nb_modified_ram_pages;
92
92
uint8_t *modified_ram_pages_table;
93
extern uint32_t **l1_phys_map;
94
uint32_t kqemu_comm_base; /* physical address of the QPI communication page */
95
96
#define cpuid(index, eax, ebx, ecx, edx) \
96
97
asm volatile ("cpuid" \
174
175
FILE_SHARE_READ | FILE_SHARE_WRITE,
175
176
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
178
if (kqemu_fd == KQEMU_INVALID_FD) {
179
fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated: %lu\n",
180
KQEMU_DEVICE, GetLastError());
178
184
kqemu_fd = open(KQEMU_DEVICE, O_RDWR);
180
185
if (kqemu_fd == KQEMU_INVALID_FD) {
181
186
fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated: %s\n",
182
187
KQEMU_DEVICE, strerror(errno));
187
193
DeviceIoControl(kqemu_fd, KQEMU_GET_VERSION, NULL, 0,
198
204
pages_to_flush = qemu_vmalloc(KQEMU_MAX_PAGES_TO_FLUSH *
199
sizeof(unsigned long));
200
206
if (!pages_to_flush)
203
209
ram_pages_to_update = qemu_vmalloc(KQEMU_MAX_RAM_PAGES_TO_UPDATE *
204
sizeof(unsigned long));
205
211
if (!ram_pages_to_update)
208
214
modified_ram_pages = qemu_vmalloc(KQEMU_MAX_MODIFIED_RAM_PAGES *
209
sizeof(unsigned long));
210
216
if (!modified_ram_pages)
212
218
modified_ram_pages_table = qemu_mallocz(phys_ram_size >> TARGET_PAGE_BITS);
213
219
if (!modified_ram_pages_table)
216
init.ram_base = phys_ram_base;
217
init.ram_size = phys_ram_size;
218
init.ram_dirty = phys_ram_dirty;
219
init.phys_to_ram_map = l1_phys_map;
220
init.pages_to_flush = pages_to_flush;
221
#if KQEMU_VERSION >= 0x010200
222
init.ram_pages_to_update = ram_pages_to_update;
224
#if KQEMU_VERSION >= 0x010300
225
init.modified_ram_pages = modified_ram_pages;
222
memset(&kinit, 0, sizeof(kinit)); /* set the paddings to zero */
223
kinit.ram_base = phys_ram_base;
224
kinit.ram_size = phys_ram_size;
225
kinit.ram_dirty = phys_ram_dirty;
226
kinit.pages_to_flush = pages_to_flush;
227
kinit.ram_pages_to_update = ram_pages_to_update;
228
kinit.modified_ram_pages = modified_ram_pages;
228
ret = DeviceIoControl(kqemu_fd, KQEMU_INIT, &init, sizeof(init),
230
ret = DeviceIoControl(kqemu_fd, KQEMU_INIT, &kinit, sizeof(kinit),
229
231
NULL, 0, &temp, NULL) == TRUE ? 0 : -1;
231
ret = ioctl(kqemu_fd, KQEMU_INIT, &init);
233
ret = ioctl(kqemu_fd, KQEMU_INIT, &kinit);
234
236
fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret);
241
243
env->kqemu_enabled = kqemu_allowed;
242
244
nb_pages_to_flush = 0;
243
245
nb_ram_pages_to_update = 0;
247
251
void kqemu_flush_page(CPUState *env, target_ulong addr)
250
if (loglevel & CPU_LOG_INT) {
251
fprintf(logfile, "kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr);
253
LOG_INT("kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr);
254
254
if (nb_pages_to_flush >= KQEMU_MAX_PAGES_TO_FLUSH)
255
255
nb_pages_to_flush = KQEMU_FLUSH_ALL;
260
260
void kqemu_flush(CPUState *env, int global)
263
if (loglevel & CPU_LOG_INT) {
264
fprintf(logfile, "kqemu_flush:\n");
262
LOG_INT("kqemu_flush:\n");
267
263
nb_pages_to_flush = KQEMU_FLUSH_ALL;
270
266
void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr)
273
if (loglevel & CPU_LOG_INT) {
274
fprintf(logfile, "kqemu_set_notdirty: addr=%08lx\n", ram_addr);
268
LOG_INT("kqemu_set_notdirty: addr=%08lx\n",
269
(unsigned long)ram_addr);
277
270
/* we only track transitions to dirty state */
278
271
if (phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] != 0xff)
322
void kqemu_set_phys_mem(uint64_t start_addr, ram_addr_t size,
323
ram_addr_t phys_offset)
325
struct kqemu_phys_mem kphys_mem1, *kphys_mem = &kphys_mem1;
329
end = (start_addr + size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
330
start_addr &= TARGET_PAGE_MASK;
331
kphys_mem->phys_addr = start_addr;
332
kphys_mem->size = end - start_addr;
333
kphys_mem->ram_addr = phys_offset & TARGET_PAGE_MASK;
334
io_index = phys_offset & ~TARGET_PAGE_MASK;
337
kphys_mem->io_index = KQEMU_IO_MEM_RAM;
340
kphys_mem->io_index = KQEMU_IO_MEM_ROM;
343
if (qpi_io_memory == io_index) {
344
kphys_mem->io_index = KQEMU_IO_MEM_COMM;
346
kphys_mem->io_index = KQEMU_IO_MEM_UNASSIGNED;
353
ret = DeviceIoControl(kqemu_fd, KQEMU_SET_PHYS_MEM,
354
kphys_mem, sizeof(*kphys_mem),
355
NULL, 0, &temp, NULL) == TRUE ? 0 : -1;
358
ret = ioctl(kqemu_fd, KQEMU_SET_PHYS_MEM, kphys_mem);
361
fprintf(stderr, "kqemu: KQEMU_SET_PHYS_PAGE error=%d: start_addr=0x%016" PRIx64 " size=0x%08lx phys_offset=0x%08lx\n",
363
(unsigned long)size, (unsigned long)phys_offset);
671
static inline void kqemu_load_seg(struct kqemu_segment_cache *ksc,
672
const SegmentCache *sc)
674
ksc->selector = sc->selector;
675
ksc->flags = sc->flags;
676
ksc->limit = sc->limit;
677
ksc->base = sc->base;
680
static inline void kqemu_save_seg(SegmentCache *sc,
681
const struct kqemu_segment_cache *ksc)
683
sc->selector = ksc->selector;
684
sc->flags = ksc->flags;
685
sc->limit = ksc->limit;
686
sc->base = ksc->base;
633
689
int kqemu_cpu_exec(CPUState *env)
635
691
struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state;
645
700
#ifdef CONFIG_PROFILER
646
701
ti = profile_getclock();
649
if (loglevel & CPU_LOG_INT) {
650
fprintf(logfile, "kqemu: cpu_exec: enter\n");
651
cpu_dump_state(env, logfile, fprintf, 0);
654
memcpy(kenv->regs, env->regs, sizeof(kenv->regs));
703
LOG_INT("kqemu: cpu_exec: enter\n");
705
for(i = 0; i < CPU_NB_REGS; i++)
706
kenv->regs[i] = env->regs[i];
655
707
kenv->eip = env->eip;
656
708
kenv->eflags = env->eflags;
657
memcpy(&kenv->segs, &env->segs, sizeof(env->segs));
658
memcpy(&kenv->ldt, &env->ldt, sizeof(env->ldt));
659
memcpy(&kenv->tr, &env->tr, sizeof(env->tr));
660
memcpy(&kenv->gdt, &env->gdt, sizeof(env->gdt));
661
memcpy(&kenv->idt, &env->idt, sizeof(env->idt));
709
for(i = 0; i < 6; i++)
710
kqemu_load_seg(&kenv->segs[i], &env->segs[i]);
711
kqemu_load_seg(&kenv->ldt, &env->ldt);
712
kqemu_load_seg(&kenv->tr, &env->tr);
713
kqemu_load_seg(&kenv->gdt, &env->gdt);
714
kqemu_load_seg(&kenv->idt, &env->idt);
662
715
kenv->cr0 = env->cr[0];
663
716
kenv->cr2 = env->cr[2];
664
717
kenv->cr3 = env->cr[3];
665
718
kenv->cr4 = env->cr[4];
666
719
kenv->a20_mask = env->a20_mask;
667
#if KQEMU_VERSION >= 0x010100
668
720
kenv->efer = env->efer;
670
#if KQEMU_VERSION >= 0x010300
671
721
kenv->tsc_offset = 0;
672
722
kenv->star = env->star;
673
723
kenv->sysenter_cs = env->sysenter_cs;
674
724
kenv->sysenter_esp = env->sysenter_esp;
675
725
kenv->sysenter_eip = env->sysenter_eip;
677
727
kenv->lstar = env->lstar;
678
728
kenv->cstar = env->cstar;
679
729
kenv->fmask = env->fmask;
680
730
kenv->kernelgsbase = env->kernelgsbase;
683
732
if (env->dr[7] & 0xff) {
684
733
kenv->dr7 = env->dr[7];
685
734
kenv->dr0 = env->dr[0];
693
742
cpl = (env->hflags & HF_CPL_MASK);
695
744
kenv->nb_pages_to_flush = nb_pages_to_flush;
696
#if KQEMU_VERSION >= 0x010200
697
745
kenv->user_only = (env->kqemu_enabled == 1);
698
746
kenv->nb_ram_pages_to_update = nb_ram_pages_to_update;
700
747
nb_ram_pages_to_update = 0;
702
#if KQEMU_VERSION >= 0x010300
703
748
kenv->nb_modified_ram_pages = nb_modified_ram_pages;
705
750
kqemu_reset_modified_ram_pages();
707
752
if (env->cpuid_features & CPUID_FXSR)
722
#if KQEMU_VERSION >= 0x010100
723
767
ioctl(kqemu_fd, KQEMU_EXEC, kenv);
724
768
ret = kenv->retval;
726
ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv);
729
770
if (env->cpuid_features & CPUID_FXSR)
730
771
save_native_fp_fxsave(env);
732
773
save_native_fp_fsave(env);
734
memcpy(env->regs, kenv->regs, sizeof(env->regs));
775
for(i = 0; i < CPU_NB_REGS; i++)
776
env->regs[i] = kenv->regs[i];
735
777
env->eip = kenv->eip;
736
778
env->eflags = kenv->eflags;
737
memcpy(env->segs, kenv->segs, sizeof(env->segs));
779
for(i = 0; i < 6; i++)
780
kqemu_save_seg(&env->segs[i], &kenv->segs[i]);
738
781
cpu_x86_set_cpl(env, kenv->cpl);
739
memcpy(&env->ldt, &kenv->ldt, sizeof(env->ldt));
741
/* no need to restore that */
742
memcpy(env->tr, kenv->tr, sizeof(env->tr));
743
memcpy(env->gdt, kenv->gdt, sizeof(env->gdt));
744
memcpy(env->idt, kenv->idt, sizeof(env->idt));
745
env->a20_mask = kenv->a20_mask;
782
kqemu_save_seg(&env->ldt, &kenv->ldt);
747
783
env->cr[0] = kenv->cr0;
748
784
env->cr[4] = kenv->cr4;
749
785
env->cr[3] = kenv->cr3;
750
786
env->cr[2] = kenv->cr2;
751
787
env->dr[6] = kenv->dr6;
752
#if KQEMU_VERSION >= 0x010300
754
789
env->kernelgsbase = kenv->kernelgsbase;
758
792
/* flush pages as indicated by kqemu */
759
793
if (kenv->nb_pages_to_flush >= KQEMU_FLUSH_ALL) {
770
804
kqemu_exec_count++;
773
#if KQEMU_VERSION >= 0x010200
774
807
if (kenv->nb_ram_pages_to_update > 0) {
775
808
cpu_tlb_update_dirty(env);
779
#if KQEMU_VERSION >= 0x010300
780
811
if (kenv->nb_modified_ram_pages > 0) {
781
812
for(i = 0; i < kenv->nb_modified_ram_pages; i++) {
782
813
unsigned long addr;
831
861
env->hflags &= ~HF_OSFXSR_MASK;
834
if (loglevel & CPU_LOG_INT) {
835
fprintf(logfile, "kqemu: kqemu_cpu_exec: ret=0x%x\n", ret);
863
LOG_INT("kqemu: kqemu_cpu_exec: ret=0x%x\n", ret);
838
864
if (ret == KQEMU_RET_SYSCALL) {
839
865
/* syscall instruction */
840
866
return do_syscall(env, kenv);
847
873
#ifdef CONFIG_PROFILER
848
874
kqemu_ret_int_count++;
851
if (loglevel & CPU_LOG_INT) {
852
fprintf(logfile, "kqemu: interrupt v=%02x:\n",
853
env->exception_index);
854
cpu_dump_state(env, logfile, fprintf, 0);
876
LOG_INT("kqemu: interrupt v=%02x:\n", env->exception_index);
858
879
} else if ((ret & 0xff00) == KQEMU_RET_EXCEPTION) {
859
880
env->exception_index = ret & 0xff;
863
884
#ifdef CONFIG_PROFILER
864
885
kqemu_ret_excp_count++;
867
if (loglevel & CPU_LOG_INT) {
868
fprintf(logfile, "kqemu: exception v=%02x e=%04x:\n",
887
LOG_INT("kqemu: exception v=%02x e=%04x:\n",
869
888
env->exception_index, env->error_code);
870
cpu_dump_state(env, logfile, fprintf, 0);
874
891
} else if (ret == KQEMU_RET_INTR) {
875
892
#ifdef CONFIG_PROFILER
876
893
kqemu_ret_intr_count++;
879
if (loglevel & CPU_LOG_INT) {
880
cpu_dump_state(env, logfile, fprintf, 0);
884
897
} else if (ret == KQEMU_RET_SOFTMMU) {
885
898
#ifdef CONFIG_PROFILER
888
901
kqemu_record_pc(pc);
892
if (loglevel & CPU_LOG_INT) {
893
cpu_dump_state(env, logfile, fprintf, 0);
898
907
cpu_dump_state(env, stderr, fprintf, 0);
905
914
void kqemu_cpu_interrupt(CPUState *env)
907
#if defined(_WIN32) && KQEMU_VERSION >= 0x010101
908
917
/* cancelling the I/O request causes KQEMU to finish executing the
909
918
current block and successfully returning. */
910
919
CancelIo(kqemu_fd);
924
QEMU paravirtualization interface. The current interface only
925
allows to modify the IF and IOPL flags when running in
928
At this point it is not very satisfactory. I leave it for reference
929
as it adds little complexity.
932
#define QPI_COMM_PAGE_PHYS_ADDR 0xff000000
934
static uint32_t qpi_mem_readb(void *opaque, target_phys_addr_t addr)
939
static uint32_t qpi_mem_readw(void *opaque, target_phys_addr_t addr)
944
static void qpi_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
948
static void qpi_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
952
static uint32_t qpi_mem_readl(void *opaque, target_phys_addr_t addr)
956
env = cpu_single_env;
959
return env->eflags & (IF_MASK | IOPL_MASK);
962
/* Note: after writing to this address, the guest code must make sure
963
it is exiting the current TB. pushf/popf can be used for that
965
static void qpi_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
969
env = cpu_single_env;
972
env->eflags = (env->eflags & ~(IF_MASK | IOPL_MASK)) |
973
(val & (IF_MASK | IOPL_MASK));
976
static CPUReadMemoryFunc *qpi_mem_read[3] = {
982
static CPUWriteMemoryFunc *qpi_mem_write[3] = {
988
static void qpi_init(void)
990
kqemu_comm_base = 0xff000000 | 1;
991
qpi_io_memory = cpu_register_io_memory(0,
993
qpi_mem_write, NULL);
994
cpu_register_physical_memory(kqemu_comm_base & ~0xfff,
995
0x1000, qpi_io_memory);