diff options
Diffstat (limited to 'kqemu.c')
-rw-r--r-- | kqemu.c | 86 |
1 files changed, 30 insertions, 56 deletions
@@ -15,11 +15,10 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA */ #include "config.h" #ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winioctl.h> #else @@ -42,11 +41,20 @@ #include "exec-all.h" #include "qemu-common.h" -#ifdef USE_KQEMU +#ifdef CONFIG_KQEMU #define DEBUG //#define PROFILE + +#ifdef DEBUG +# define LOG_INT(...) qemu_log_mask(CPU_LOG_INT, ## __VA_ARGS__) +# define LOG_INT_STATE(env) log_cpu_state_mask(CPU_LOG_INT, (env), 0) +#else +# define LOG_INT(...) do { } while (0) +# define LOG_INT_STATE(env) do { } while (0) +#endif + #include <unistd.h> #include <fcntl.h> #include "kqemu.h" @@ -83,6 +91,8 @@ unsigned int nb_modified_ram_pages; uint8_t *modified_ram_pages_table; int qpi_io_memory; uint32_t kqemu_comm_base; /* physical address of the QPI communication page */ +ram_addr_t kqemu_phys_ram_size; +uint8_t *kqemu_phys_ram_base; #define cpuid(index, eax, ebx, ecx, edx) \ asm volatile ("cpuid" \ @@ -206,13 +216,14 @@ int kqemu_init(CPUState *env) sizeof(uint64_t)); if (!modified_ram_pages) goto fail; - modified_ram_pages_table = qemu_mallocz(phys_ram_size >> TARGET_PAGE_BITS); + modified_ram_pages_table = + qemu_mallocz(kqemu_phys_ram_size >> TARGET_PAGE_BITS); if (!modified_ram_pages_table) goto fail; memset(&kinit, 0, sizeof(kinit)); /* set the paddings to zero */ - kinit.ram_base = phys_ram_base; - kinit.ram_size = phys_ram_size; + kinit.ram_base = kqemu_phys_ram_base; + kinit.ram_size = kqemu_phys_ram_size; kinit.ram_dirty = phys_ram_dirty; kinit.pages_to_flush = pages_to_flush; kinit.ram_pages_to_update = ram_pages_to_update; @@ -241,11 +252,7 @@ int kqemu_init(CPUState *env) void kqemu_flush_page(CPUState *env, target_ulong addr) { -#if defined(DEBUG) - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr); - } -#endif + LOG_INT("kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr); if (nb_pages_to_flush >= KQEMU_MAX_PAGES_TO_FLUSH) nb_pages_to_flush = KQEMU_FLUSH_ALL; else @@ -254,22 +261,14 @@ void kqemu_flush_page(CPUState *env, target_ulong addr) void kqemu_flush(CPUState *env, int global) { -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu_flush:\n"); - } -#endif + LOG_INT("kqemu_flush:\n"); nb_pages_to_flush = KQEMU_FLUSH_ALL; } void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr) { -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu_set_notdirty: addr=%08lx\n", + LOG_INT("kqemu_set_notdirty: addr=%08lx\n", (unsigned long)ram_addr); - } -#endif /* we only track transitions to dirty state */ if (phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] != 0xff) return; @@ -703,12 +702,8 @@ int kqemu_cpu_exec(CPUState *env) #ifdef CONFIG_PROFILER ti = profile_getclock(); #endif -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu: cpu_exec: enter\n"); - cpu_dump_state(env, logfile, fprintf, 0); - } -#endif + LOG_INT("kqemu: cpu_exec: enter\n"); + LOG_INT_STATE(env); for(i = 0; i < CPU_NB_REGS; i++) kenv->regs[i] = env->regs[i]; kenv->eip = env->eip; @@ -867,11 +862,7 @@ int kqemu_cpu_exec(CPUState *env) else env->hflags &= ~HF_OSFXSR_MASK; -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu: kqemu_cpu_exec: ret=0x%x\n", ret); - } -#endif + LOG_INT("kqemu: kqemu_cpu_exec: ret=0x%x\n", ret); if (ret == KQEMU_RET_SYSCALL) { /* syscall instruction */ return do_syscall(env, kenv); @@ -884,13 +875,8 @@ int kqemu_cpu_exec(CPUState *env) #ifdef CONFIG_PROFILER kqemu_ret_int_count++; #endif -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu: interrupt v=%02x:\n", - env->exception_index); - cpu_dump_state(env, logfile, fprintf, 0); - } -#endif + LOG_INT("kqemu: interrupt v=%02x:\n", env->exception_index); + LOG_INT_STATE(env); return 1; } else if ((ret & 0xff00) == KQEMU_RET_EXCEPTION) { env->exception_index = ret & 0xff; @@ -900,23 +886,15 @@ int kqemu_cpu_exec(CPUState *env) #ifdef CONFIG_PROFILER kqemu_ret_excp_count++; #endif -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - fprintf(logfile, "kqemu: exception v=%02x e=%04x:\n", + LOG_INT("kqemu: exception v=%02x e=%04x:\n", env->exception_index, env->error_code); - cpu_dump_state(env, logfile, fprintf, 0); - } -#endif + LOG_INT_STATE(env); return 1; } else if (ret == KQEMU_RET_INTR) { #ifdef CONFIG_PROFILER kqemu_ret_intr_count++; #endif -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - cpu_dump_state(env, logfile, fprintf, 0); - } -#endif + LOG_INT_STATE(env); return 0; } else if (ret == KQEMU_RET_SOFTMMU) { #ifdef CONFIG_PROFILER @@ -925,11 +903,7 @@ int kqemu_cpu_exec(CPUState *env) kqemu_record_pc(pc); } #endif -#ifdef DEBUG - if (loglevel & CPU_LOG_INT) { - cpu_dump_state(env, logfile, fprintf, 0); - } -#endif + LOG_INT_STATE(env); return 2; } else { cpu_dump_state(env, stderr, fprintf, 0); @@ -1016,7 +990,7 @@ static CPUWriteMemoryFunc *qpi_mem_write[3] = { static void qpi_init(void) { kqemu_comm_base = 0xff000000 | 1; - qpi_io_memory = cpu_register_io_memory(0, + qpi_io_memory = cpu_register_io_memory( qpi_mem_read, qpi_mem_write, NULL); cpu_register_physical_memory(kqemu_comm_base & ~0xfff, |