]> Git Repo - qemu.git/blobdiff - exec.c
Re-add clearing of the APP_CMD flag that somehow got lost.
[qemu.git] / exec.c
diff --git a/exec.c b/exec.c
index 321d8a566f8ab52dd5fbcb5fdff581a037bb6864..4ccee2246f73ae9c77e1ed5096fb3aaf13a3c988 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -152,6 +152,7 @@ static int io_mem_watch;
 char *logfilename = "/tmp/qemu.log";
 FILE *logfile;
 int loglevel;
+static int log_append = 0;
 
 /* statistics */
 static int tlb_flush_count;
@@ -1160,7 +1161,7 @@ void cpu_set_log(int log_flags)
 {
     loglevel = log_flags;
     if (loglevel && !logfile) {
-        logfile = fopen(logfilename, "w");
+        logfile = fopen(logfilename, log_append ? "a" : "w");
         if (!logfile) {
             perror(logfilename);
             _exit(1);
@@ -1174,12 +1175,22 @@ void cpu_set_log(int log_flags)
 #else
         setvbuf(logfile, NULL, _IOLBF, 0);
 #endif
+        log_append = 1;
+    }
+    if (!loglevel && logfile) {
+        fclose(logfile);
+        logfile = NULL;
     }
 }
 
 void cpu_set_log_filename(const char *filename)
 {
     logfilename = strdup(filename);
+    if (logfile) {
+        fclose(logfile);
+        logfile = NULL;
+    }
+    cpu_set_log(loglevel);
 }
 
 /* mask must never be zero, except for A20 change call */
@@ -1220,7 +1231,7 @@ CPULogItem cpu_log_items[] = {
     { CPU_LOG_EXEC, "exec",
       "show trace before each executed TB (lots of logs)" },
     { CPU_LOG_TB_CPU, "cpu",
-      "show CPU state before bloc translation" },
+      "show CPU state before block translation" },
 #ifdef TARGET_I386
     { CPU_LOG_PCALL, "pcall",
       "show protected mode far calls/returns/exceptions" },
@@ -1286,6 +1297,10 @@ void cpu_abort(CPUState *env, const char *fmt, ...)
     cpu_dump_state(env, stderr, fprintf, 0);
 #endif
     va_end(ap);
+    if (logfile) {
+        fflush(logfile);
+        fclose(logfile);
+    }
     abort();
 }
 
@@ -1622,17 +1637,18 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
         for (i = 0; i < env->nb_watchpoints; i++) {
             if (vaddr == (env->watchpoint[i].vaddr & TARGET_PAGE_MASK)) {
                 if (address & ~TARGET_PAGE_MASK) {
-                    env->watchpoint[i].is_ram = 0;
+                    env->watchpoint[i].addend = 0;
                     address = vaddr | io_mem_watch;
                 } else {
-                    env->watchpoint[i].is_ram = 1;
+                    env->watchpoint[i].addend = pd - paddr +
+                        (unsigned long) phys_ram_base;
                     /* TODO: Figure out how to make read watchpoints coexist
                        with code.  */
                     pd = (pd & TARGET_PAGE_MASK) | io_mem_watch | IO_MEM_ROMD;
                 }
             }
         }
-        
+
         index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
         addend -= vaddr;
         te = &env->tlb_table[is_user][index];
@@ -1922,7 +1938,7 @@ static void *subpage_init (target_phys_addr_t base, uint32_t *phys,
                 need_subpage = 1;                                       \
         }                                                               \
                                                                         \
-        if (end_addr - addr > TARGET_PAGE_SIZE)                         \
+        if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE)        \
             end_addr2 = TARGET_PAGE_SIZE - 1;                           \
         else {                                                          \
             end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
@@ -1944,9 +1960,9 @@ void cpu_register_physical_memory(target_phys_addr_t start_addr,
     unsigned long orig_size = size;
     void *subpage;
 
-    end_addr = start_addr + (target_phys_addr_t)size;
     size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
-    for(addr = start_addr; addr < end_addr; addr += TARGET_PAGE_SIZE) {
+    end_addr = start_addr + (target_phys_addr_t)size;
+    for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) {
         p = phys_page_find(addr >> TARGET_PAGE_BITS);
         if (p && p->phys_offset != IO_MEM_UNASSIGNED) {
             unsigned long orig_memory = p->phys_offset;
@@ -2174,7 +2190,7 @@ static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
 
 /* Generate a debug exception if a watchpoint has been hit.
    Returns the real physical address of the access.  addr will be a host
-   address in the is_ram case.  */
+   address in case of a RAM location.  */
 static target_ulong check_watchpoint(target_phys_addr_t addr)
 {
     CPUState *env = cpu_single_env;
@@ -2186,8 +2202,7 @@ static target_ulong check_watchpoint(target_phys_addr_t addr)
     for (i = 0; i < env->nb_watchpoints; i++) {
         watch = env->watchpoint[i].vaddr;
         if (((env->mem_write_vaddr ^ watch) & TARGET_PAGE_MASK) == 0) {
-            if (env->watchpoint[i].is_ram)
-                retaddr = addr - (unsigned long)phys_ram_base;
+            retaddr = addr - env->watchpoint[i].addend;
             if (((addr ^ watch) & ~TARGET_PAGE_MASK) == 0) {
                 cpu_single_env->watchpoint_hit = i + 1;
                 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_DEBUG);
This page took 0.028212 seconds and 4 git commands to generate.