• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2007-2008 The Android Open Source Project
2 **
3 ** This software is licensed under the terms of the GNU General Public
4 ** License version 2, as published by the Free Software Foundation, and
5 ** may be copied, distributed, and modified under those terms.
6 **
7 ** This program is distributed in the hope that it will be useful,
8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 ** GNU General Public License for more details.
11 */
12 #include <unistd.h>
13 #include <fcntl.h>
14 #include <string.h>
15 
16 #include "qemu_file.h"
17 #include "goldfish_device.h"
18 #include "audio/audio.h"
19 
20 extern void  dprint(const char*  fmt, ...);
21 
22 int fd = -1;
23 
memlog_read(void * opaque,target_phys_addr_t offset)24 static uint32_t memlog_read(void *opaque, target_phys_addr_t offset)
25 {
26     (void)opaque;
27     (void)offset;
28     return 0;
29 }
30 
31 unsigned info[8];
32 
memlog_write(void * opaque,target_phys_addr_t offset,uint32_t val)33 static void memlog_write(void *opaque, target_phys_addr_t offset, uint32_t val)
34 {
35     char buf[128];
36     struct goldfish_device *dev = opaque;
37     int ret;
38 
39     (void)dev;
40 
41     if (offset < 8*4)
42         info[offset / 4] = val;
43 
44     if (offset == 0) {
45             /* write PID and VADDR to logfile */
46         snprintf(buf, sizeof buf, "%08x %08x\n", info[0], info[1]);
47         do {
48             ret = write(fd, buf, strlen(buf));
49         } while (ret < 0 && errno == EINTR);
50     }
51 }
52 
53 
54 static CPUReadMemoryFunc *memlog_readfn[] = {
55    memlog_read,
56    memlog_read,
57    memlog_read
58 };
59 
60 static CPUWriteMemoryFunc *memlog_writefn[] = {
61    memlog_write,
62    memlog_write,
63    memlog_write
64 };
65 
66 struct goldfish_device memlog_dev;
67 
goldfish_memlog_init(uint32_t base)68 void goldfish_memlog_init(uint32_t base)
69 {
70     struct goldfish_device *dev = &memlog_dev;
71 
72     dev->name = "goldfish_memlog";
73     dev->id = 0;
74     dev->base = base;
75     dev->size = 0x1000;
76     dev->irq_count = 0;
77 
78     do {
79         fd = open("mem.log", /* O_CREAT | */ O_TRUNC | O_WRONLY, 0644);
80     } while (fd < 0 && errno == EINTR);
81 
82     goldfish_device_add(dev, memlog_readfn, memlog_writefn, dev);
83 }
84 
85