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