/* Return the physical page corresponding to a virtual one. Use it
only for debugging because no protection checks are done. Return -1
if no page found. */
-a_target_phys_addr cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
+target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
#define CPU_LOG_TB_OUT_ASM (1 << 0)
#define CPU_LOG_TB_IN_ASM (1 << 1)
void cpu_set_log_filename(const char *filename);
int cpu_str_to_log_mask(const char *str);
-/* IO ports API */
-#include "ioport.h"
-
/* memory API */
extern int phys_ram_fd;
extern uint8_t *phys_ram_dirty;
-extern a_ram_addr ram_size;
-extern a_ram_addr last_ram_offset;
+extern ram_addr_t ram_size;
+extern ram_addr_t last_ram_offset;
+
+extern const char *mem_path;
+extern int mem_prealloc;
/* physical memory access */
#define MIGRATION_DIRTY_FLAG 0x08
/* read dirty bit (return 0 or 1) */
-static inline int cpu_physical_memory_is_dirty(a_ram_addr addr)
+static inline int cpu_physical_memory_is_dirty(ram_addr_t addr)
{
return phys_ram_dirty[addr >> TARGET_PAGE_BITS] == 0xff;
}
-static inline int cpu_physical_memory_get_dirty(a_ram_addr addr,
+static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
int dirty_flags)
{
return phys_ram_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags;
}
-static inline void cpu_physical_memory_set_dirty(a_ram_addr addr)
+static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
{
phys_ram_dirty[addr >> TARGET_PAGE_BITS] = 0xff;
}
-void cpu_physical_memory_reset_dirty(a_ram_addr start, a_ram_addr end,
+void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
int dirty_flags);
void cpu_tlb_update_dirty(CPUState *env);
int cpu_physical_memory_get_dirty_tracking(void);
-int cpu_physical_sync_dirty_bitmap(a_target_phys_addr start_addr,
- a_target_phys_addr end_addr);
+int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
+ target_phys_addr_t end_addr);
void dump_exec_info(FILE *f,
int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
* batching which can make a major impact on performance when using
* virtualization.
*/
-void qemu_register_coalesced_mmio(a_target_phys_addr addr, a_ram_addr size);
+void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
+
+void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
-void qemu_unregister_coalesced_mmio(a_target_phys_addr addr, a_ram_addr size);
+void qemu_flush_coalesced_mmio_buffer(void);
/*******************************************/
/* host CPU ticks (if available) */
#endif
}
-#elif defined(__mips__)
+#elif defined(__mips__) && \
+ ((defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__))
+/*
+ * binutils wants to use rdhwr only on mips32r2
+ * but as linux kernel emulate it, it's fine
+ * to use it.
+ *
+ */
+#define MIPS_RDHWR(rd, value) { \
+ __asm__ __volatile__ ( \
+ ".set push\n\t" \
+ ".set mips32r2\n\t" \
+ "rdhwr %0, "rd"\n\t" \
+ ".set pop" \
+ : "=r" (value)); \
+}
static inline int64_t cpu_get_real_ticks(void)
{
-#if defined(__mips_isa_rev) && __mips_isa_rev >= 2
+/* On kernels >= 2.6.25 rdhwr <reg>, $2 and $3 are emulated */
uint32_t count;
static uint32_t cyc_per_count = 0;
if (!cyc_per_count)
- __asm__ __volatile__("rdhwr %0, $3" : "=r" (cyc_per_count));
+ MIPS_RDHWR("$3", cyc_per_count);
- __asm__ __volatile__("rdhwr %1, $2" : "=r" (count));
+ MIPS_RDHWR("$2", count);
return (int64_t)(count * cyc_per_count);
-#else
- /* FIXME */
- static int64_t ticks = 0;
- return ticks++;
-#endif
}
#else