| /* Copyright (C) 2007-2008 The Android Open Source Project |
| ** |
| ** This software is licensed under the terms of the GNU General Public |
| ** License version 2, as published by the Free Software Foundation, and |
| ** may be copied, distributed, and modified under those terms. |
| ** |
| ** This program is distributed in the hope that it will be useful, |
| ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ** GNU General Public License for more details. |
| */ |
| #include <unistd.h> |
| #include <fcntl.h> |
| #include <string.h> |
| |
| #include "qemu_file.h" |
| #include "goldfish_device.h" |
| #include "audio/audio.h" |
| |
| extern void dprint(const char* fmt, ...); |
| |
| int fd = -1; |
| |
| static uint32_t memlog_read(void *opaque, target_phys_addr_t offset) |
| { |
| (void)opaque; |
| (void)offset; |
| return 0; |
| } |
| |
| unsigned info[8]; |
| |
| static void memlog_write(void *opaque, target_phys_addr_t offset, uint32_t val) |
| { |
| char buf[128]; |
| struct goldfish_device *dev = opaque; |
| int ret; |
| |
| (void)dev; |
| |
| if (offset < 8*4) |
| info[offset / 4] = val; |
| |
| if (offset == 0) { |
| /* write PID and VADDR to logfile */ |
| snprintf(buf, sizeof buf, "%08x %08x\n", info[0], info[1]); |
| do { |
| ret = write(fd, buf, strlen(buf)); |
| } while (ret < 0 && errno == EINTR); |
| } |
| } |
| |
| |
| static CPUReadMemoryFunc *memlog_readfn[] = { |
| memlog_read, |
| memlog_read, |
| memlog_read |
| }; |
| |
| static CPUWriteMemoryFunc *memlog_writefn[] = { |
| memlog_write, |
| memlog_write, |
| memlog_write |
| }; |
| |
| struct goldfish_device memlog_dev; |
| |
| void goldfish_memlog_init(uint32_t base) |
| { |
| struct goldfish_device *dev = &memlog_dev; |
| |
| dev->name = "goldfish_memlog"; |
| dev->id = 0; |
| dev->base = base; |
| dev->size = 0x1000; |
| dev->irq_count = 0; |
| |
| do { |
| fd = open("mem.log", /* O_CREAT | */ O_TRUNC | O_WRONLY, 0644); |
| } while (fd < 0 && errno == EINTR); |
| |
| goldfish_device_add(dev, memlog_readfn, memlog_writefn, dev); |
| } |
| |