18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h> 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h> 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h> 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu_file.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "goldfish_device.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "audio/audio.h" 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void dprint(const char* fmt, ...); 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint fd = -1; 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t memlog_read(void *opaque, target_phys_addr_t offset) 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 264e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner (void)opaque; 274e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner (void)offset; 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned info[8]; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void memlog_write(void *opaque, target_phys_addr_t offset, uint32_t val) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buf[128]; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct goldfish_device *dev = opaque; 374e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner int ret; 384e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner 394e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner (void)dev; 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 414e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner if (offset < 8*4) 424e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner info[offset / 4] = val; 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (offset == 0) { 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* write PID and VADDR to logfile */ 464e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner snprintf(buf, sizeof buf, "%08x %08x\n", info[0], info[1]); 474e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner do { 484e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner ret = write(fd, buf, strlen(buf)); 494e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner } while (ret < 0 && errno == EINTR); 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUReadMemoryFunc *memlog_readfn[] = { 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_read, 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_read, 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_read 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic CPUWriteMemoryFunc *memlog_writefn[] = { 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_write, 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_write, 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memlog_write 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct goldfish_device memlog_dev; 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid goldfish_memlog_init(uint32_t base) 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct goldfish_device *dev = &memlog_dev; 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->name = "goldfish_memlog"; 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->id = 0; 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->base = base; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->size = 0x1000; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dev->irq_count = 0; 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 784e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner do { 794e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner fd = open("mem.log", /* O_CREAT | */ O_TRUNC | O_WRONLY, 0644); 804e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner } while (fd < 0 && errno == EINTR); 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goldfish_device_add(dev, memlog_readfn, memlog_writefn, dev); 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 85