Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion accel/tcg/cpu-exec-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@
#include "system/tcg.h"
#include "qemu/plugin.h"
#include "internal-common.h"
#include <stdio.h>

bool tcg_allowed;
bool mmu_log_enabled = false;
bool mmu_fast_log_enabled = false;
bool mmu_slow_log_enabled = false;
bool mmu_log_to_file = false;
FILE *mmu_log_file = NULL;

bool tcg_cflags_has(CPUState *cpu, uint32_t flags)
{
Expand Down
137 changes: 99 additions & 38 deletions accel/tcg/cputlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -2673,19 +2673,31 @@ static void do_st_1(CPUState *cpu, MMULookupPageData *p, uint8_t val,
hwaddr paddr = 0;

if (unlikely(p->flags & TLB_MMIO)) {
if (mmu_log_enabled){
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, val);
}
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, val);
fflush(mmu_log_file);
}
}
do_st_mmio_leN(cpu, p->full, val, p->addr, 1, mmu_idx, ra);
} else if (unlikely(p->flags & TLB_DISCARD_WRITE)) {
/* nothing */
} else {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x \n",
(unsigned long)p->addr, (unsigned long)paddr, val);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x\n",
(unsigned long)p->addr, (unsigned long)paddr, val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=1 data=0x%02x\n",
(unsigned long)p->addr, (unsigned long)paddr, val);
fflush(mmu_log_file);
}
}
*(uint8_t *)p->haddr = val;
}
Expand All @@ -2698,10 +2710,16 @@ static void do_st_2(CPUState *cpu, MMULookupPageData *p, uint16_t val,
uint16_t orig_val = val;

if (unlikely(p->flags & TLB_MMIO)) {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
if ((memop & MO_BSWAP) != MO_LE) {
val = bswap16(val);
Expand All @@ -2710,10 +2728,16 @@ static void do_st_2(CPUState *cpu, MMULookupPageData *p, uint16_t val,
} else if (unlikely(p->flags & TLB_DISCARD_WRITE)) {
/* nothing */
} else {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x \n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=2 data=0x%04x\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
/* Swap to host endian if necessary, then store. */
if (memop & MO_BSWAP) {
Expand All @@ -2730,10 +2754,16 @@ static void do_st_4(CPUState *cpu, MMULookupPageData *p, uint32_t val,
uint32_t orig_val = val;

if (unlikely(p->flags & TLB_MMIO)) {
if (mmu_log_enabled){
paddr = p->full->phys_addr+ (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
if ((memop & MO_BSWAP) != MO_LE) {
val = bswap32(val);
Expand All @@ -2742,10 +2772,16 @@ static void do_st_4(CPUState *cpu, MMULookupPageData *p, uint32_t val,
} else if (unlikely(p->flags & TLB_DISCARD_WRITE)) {
/* nothing */
} else {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x \n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=4 data=0x%08x\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
/* Swap to host endian if necessary, then store. */
if (memop & MO_BSWAP) {
Expand All @@ -2762,10 +2798,16 @@ static void do_st_8(CPUState *cpu, MMULookupPageData *p, uint64_t val,
uint64_t orig_val = val;

if (unlikely(p->flags & TLB_MMIO)) {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx (MMIO)\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
if ((memop & MO_BSWAP) != MO_LE) {
val = bswap64(val);
Expand All @@ -2774,10 +2816,16 @@ static void do_st_8(CPUState *cpu, MMULookupPageData *p, uint64_t val,
} else if (unlikely(p->flags & TLB_DISCARD_WRITE)) {
/* nothing */
} else {
if (mmu_log_enabled){
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx \n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
paddr = p->full->phys_addr + (p->addr & ~TARGET_PAGE_MASK);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=8 data=0x%016lx\n",
(unsigned long)p->addr, (unsigned long)paddr, orig_val);
fflush(mmu_log_file);
}
}
/* Swap to host endian if necessary, then store. */
if (memop & MO_BSWAP) {
Expand Down Expand Up @@ -2878,13 +2926,19 @@ static void do_st16_mmu(CPUState *cpu, vaddr addr, Int128 val,
cpu_req_mo(cpu, TCG_MO_LD_ST | TCG_MO_ST_ST);
crosspage = mmu_lookup(cpu, addr, oi, ra, MMU_DATA_STORE, &l);
if (likely(!crosspage)) {
hwaddr paddr = 0;
if (unlikely(l.page[0].flags & TLB_MMIO)) {
if (mmu_log_enabled){
paddr = l.page[0].full->xlat_section + (addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx (MMIO)\n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
hwaddr paddr = l.page[0].full->xlat_section + (addr & ~TARGET_PAGE_MASK);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx (MMIO)\n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx (MMIO)\n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
fflush(mmu_log_file);
}
}
if ((l.memop & MO_BSWAP) != MO_LE) {
val = bswap128(val);
Expand All @@ -2893,11 +2947,18 @@ static void do_st16_mmu(CPUState *cpu, vaddr addr, Int128 val,
} else if (unlikely(l.page[0].flags & TLB_DISCARD_WRITE)) {
/* nothing */
} else {
if (mmu_log_enabled){
paddr = l.page[0].full->xlat_section + (addr & ~TARGET_PAGE_MASK);
printf("[MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx \n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
hwaddr paddr = l.page[0].full->xlat_section + (addr & ~TARGET_PAGE_MASK);
if (mmu_slow_log_enabled) {
printf("[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx\n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
if (mmu_log_to_file && mmu_log_file) {
fprintf(mmu_log_file,
"[SLOW_MEMORY_WRITE] vaddr=0x%lx paddr=0x%lx size=16 data=0x%016lx%016lx\n",
(unsigned long)addr, (unsigned long)paddr,
(unsigned long)int128_gethi(val), (unsigned long)int128_getlo(val));
fflush(mmu_log_file);
}
}
/* Swap to host endian if necessary, then store. */
if (l.memop & MO_BSWAP) {
Expand Down
8 changes: 6 additions & 2 deletions accel/tcg/internal-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "exec/translation-block.h"
#include "exec/mmap-lock.h"
#include "accel/tcg/tb-cpu-state.h"
#include <stdio.h>

extern int64_t max_delay;
extern int64_t max_advance;
Expand Down Expand Up @@ -141,6 +142,9 @@ void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr);

void tcg_get_stats(AccelState *accel, GString *buf);

extern bool mmu_log_enabled;
extern bool mmu_fast_log_enabled;
extern bool mmu_slow_log_enabled;
extern bool mmu_log_to_file;
extern FILE *mmu_log_file;

#endif /* ACCEL_TCG_INTERNAL_COMMON_H */
#endif /* ACCEL_TCG_INTERNAL_COMMON_H */
78 changes: 75 additions & 3 deletions accel/tcg/monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,89 @@
#include "tcg/tcg.h"
#include "internal-common.h"
#include "exec/log.h"
#include "qapi/qapi-commands-misc.h"
#include "qapi/qapi-commands-misc.h"
#include <errno.h>

#define MMU_LOG_FILE_PATH "../vm/mmu.log"

static bool mmu_open_log_file(Error **errp)
{
if (mmu_log_to_file && mmu_log_file) {
return true;
}

mmu_log_file = fopen(MMU_LOG_FILE_PATH, "a");
if (!mmu_log_file) {
error_setg_errno(errp, errno,
"Could not open MMU log file '%s'", MMU_LOG_FILE_PATH);
return false;
}
mmu_log_to_file = true;
return true;
}

static void mmu_close_log_file(void)
{
if (mmu_log_file) {
fclose(mmu_log_file);
mmu_log_file = NULL;
}
mmu_log_to_file = false;
}

void qmp_sfmmu(Error **errp)
{
mmu_fast_log_enabled = true;
qemu_log("Fast path MMU write logging enabled.\n");
}

void qmp_qfmmu(Error **errp)
{
mmu_fast_log_enabled = false;
qemu_log("Fast path MMU write logging disabled.\n");
if (!mmu_slow_log_enabled) {
mmu_close_log_file();
}
}

void qmp_ssmmu(Error **errp)
{
mmu_slow_log_enabled = true;
qemu_log("Slow path MMU write logging enabled.\n");
}

void qmp_qsmmu(Error **errp)
{
mmu_slow_log_enabled = false;
qemu_log("Slow path MMU write logging disabled.\n");
if (!mmu_fast_log_enabled) {
mmu_close_log_file();
}
}

void qmp_wmmu(Error **errp)
{
if (!mmu_open_log_file(errp)) {
return;
}

mmu_fast_log_enabled = true;
mmu_slow_log_enabled = true;
qemu_log("MMU write logging enabled (file and console).\n");
}

void qmp_smmu(Error **errp)
{
mmu_log_enabled = true;
mmu_fast_log_enabled = true;
mmu_slow_log_enabled = true;
qemu_log("MMU write logging enabled.\n");
}

void qmp_qmmu(Error **errp)
{
mmu_log_enabled = false;
mmu_fast_log_enabled = false;
mmu_slow_log_enabled = false;
mmu_close_log_file();
qemu_log("MMU write logging disabled.\n");
}

Expand Down
Loading
Loading