Revision d12d51d5 kqemu.c
b/kqemu.c | ||
---|---|---|
47 | 47 |
#define DEBUG |
48 | 48 |
//#define PROFILE |
49 | 49 |
|
50 |
|
|
51 |
#ifdef DEBUG |
|
52 |
# define LOG_INT(...) do { \ |
|
53 |
if (loglevel & CPU_LOG_INT) \ |
|
54 |
fprintf(logfile, ## __VA_ARGS__); \ |
|
55 |
} while (0) |
|
56 |
# define LOG_INT_STATE(env) \ |
|
57 |
do { \ |
|
58 |
if (loglevel & CPU_LOG_INT) \ |
|
59 |
cpu_dump_state(env, logfile, fprintf, 0); \ |
|
60 |
} while (0) |
|
61 |
#else |
|
62 |
# define LOG_INT(...) do { } while (0) |
|
63 |
# define LOG_INT_STATE(env) do { } while (0) |
|
64 |
#endif |
|
65 |
|
|
50 | 66 |
#include <unistd.h> |
51 | 67 |
#include <fcntl.h> |
52 | 68 |
#include "kqemu.h" |
... | ... | |
241 | 257 |
|
242 | 258 |
void kqemu_flush_page(CPUState *env, target_ulong addr) |
243 | 259 |
{ |
244 |
#if defined(DEBUG) |
|
245 |
if (loglevel & CPU_LOG_INT) { |
|
246 |
fprintf(logfile, "kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr); |
|
247 |
} |
|
248 |
#endif |
|
260 |
LOG_INT("kqemu_flush_page: addr=" TARGET_FMT_lx "\n", addr); |
|
249 | 261 |
if (nb_pages_to_flush >= KQEMU_MAX_PAGES_TO_FLUSH) |
250 | 262 |
nb_pages_to_flush = KQEMU_FLUSH_ALL; |
251 | 263 |
else |
... | ... | |
254 | 266 |
|
255 | 267 |
void kqemu_flush(CPUState *env, int global) |
256 | 268 |
{ |
257 |
#ifdef DEBUG |
|
258 |
if (loglevel & CPU_LOG_INT) { |
|
259 |
fprintf(logfile, "kqemu_flush:\n"); |
|
260 |
} |
|
261 |
#endif |
|
269 |
LOG_INT("kqemu_flush:\n"); |
|
262 | 270 |
nb_pages_to_flush = KQEMU_FLUSH_ALL; |
263 | 271 |
} |
264 | 272 |
|
265 | 273 |
void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr) |
266 | 274 |
{ |
267 |
#ifdef DEBUG |
|
268 |
if (loglevel & CPU_LOG_INT) { |
|
269 |
fprintf(logfile, "kqemu_set_notdirty: addr=%08lx\n", |
|
275 |
LOG_INT("kqemu_set_notdirty: addr=%08lx\n", |
|
270 | 276 |
(unsigned long)ram_addr); |
271 |
} |
|
272 |
#endif |
|
273 | 277 |
/* we only track transitions to dirty state */ |
274 | 278 |
if (phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] != 0xff) |
275 | 279 |
return; |
... | ... | |
703 | 707 |
#ifdef CONFIG_PROFILER |
704 | 708 |
ti = profile_getclock(); |
705 | 709 |
#endif |
706 |
#ifdef DEBUG |
|
707 |
if (loglevel & CPU_LOG_INT) { |
|
708 |
fprintf(logfile, "kqemu: cpu_exec: enter\n"); |
|
709 |
cpu_dump_state(env, logfile, fprintf, 0); |
|
710 |
} |
|
711 |
#endif |
|
710 |
LOG_INT("kqemu: cpu_exec: enter\n"); |
|
711 |
LOG_INT_STATE(env); |
|
712 | 712 |
for(i = 0; i < CPU_NB_REGS; i++) |
713 | 713 |
kenv->regs[i] = env->regs[i]; |
714 | 714 |
kenv->eip = env->eip; |
... | ... | |
867 | 867 |
else |
868 | 868 |
env->hflags &= ~HF_OSFXSR_MASK; |
869 | 869 |
|
870 |
#ifdef DEBUG |
|
871 |
if (loglevel & CPU_LOG_INT) { |
|
872 |
fprintf(logfile, "kqemu: kqemu_cpu_exec: ret=0x%x\n", ret); |
|
873 |
} |
|
874 |
#endif |
|
870 |
LOG_INT("kqemu: kqemu_cpu_exec: ret=0x%x\n", ret); |
|
875 | 871 |
if (ret == KQEMU_RET_SYSCALL) { |
876 | 872 |
/* syscall instruction */ |
877 | 873 |
return do_syscall(env, kenv); |
... | ... | |
884 | 880 |
#ifdef CONFIG_PROFILER |
885 | 881 |
kqemu_ret_int_count++; |
886 | 882 |
#endif |
887 |
#ifdef DEBUG |
|
888 |
if (loglevel & CPU_LOG_INT) { |
|
889 |
fprintf(logfile, "kqemu: interrupt v=%02x:\n", |
|
890 |
env->exception_index); |
|
891 |
cpu_dump_state(env, logfile, fprintf, 0); |
|
892 |
} |
|
893 |
#endif |
|
883 |
LOG_INT("kqemu: interrupt v=%02x:\n", env->exception_index); |
|
884 |
LOG_INT_STATE(env); |
|
894 | 885 |
return 1; |
895 | 886 |
} else if ((ret & 0xff00) == KQEMU_RET_EXCEPTION) { |
896 | 887 |
env->exception_index = ret & 0xff; |
... | ... | |
900 | 891 |
#ifdef CONFIG_PROFILER |
901 | 892 |
kqemu_ret_excp_count++; |
902 | 893 |
#endif |
903 |
#ifdef DEBUG |
|
904 |
if (loglevel & CPU_LOG_INT) { |
|
905 |
fprintf(logfile, "kqemu: exception v=%02x e=%04x:\n", |
|
894 |
LOG_INT("kqemu: exception v=%02x e=%04x:\n", |
|
906 | 895 |
env->exception_index, env->error_code); |
907 |
cpu_dump_state(env, logfile, fprintf, 0); |
|
908 |
} |
|
909 |
#endif |
|
896 |
LOG_INT_STATE(env); |
|
910 | 897 |
return 1; |
911 | 898 |
} else if (ret == KQEMU_RET_INTR) { |
912 | 899 |
#ifdef CONFIG_PROFILER |
913 | 900 |
kqemu_ret_intr_count++; |
914 | 901 |
#endif |
915 |
#ifdef DEBUG |
|
916 |
if (loglevel & CPU_LOG_INT) { |
|
917 |
cpu_dump_state(env, logfile, fprintf, 0); |
|
918 |
} |
|
919 |
#endif |
|
902 |
LOG_INT_STATE(env); |
|
920 | 903 |
return 0; |
921 | 904 |
} else if (ret == KQEMU_RET_SOFTMMU) { |
922 | 905 |
#ifdef CONFIG_PROFILER |
... | ... | |
925 | 908 |
kqemu_record_pc(pc); |
926 | 909 |
} |
927 | 910 |
#endif |
928 |
#ifdef DEBUG |
|
929 |
if (loglevel & CPU_LOG_INT) { |
|
930 |
cpu_dump_state(env, logfile, fprintf, 0); |
|
931 |
} |
|
932 |
#endif |
|
911 |
LOG_INT_STATE(env); |
|
933 | 912 |
return 2; |
934 | 913 |
} else { |
935 | 914 |
cpu_dump_state(env, stderr, fprintf, 0); |
Also available in: Unified diff