dev_hammerhead.cc Source File
Back to the index.
src
devices
dev_hammerhead.cc
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2005-2009 Anders Gavare. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
*
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
12
* 3. The name of the author may not be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*
27
*
28
* COMMENT: Hammerhead controller, for the secondary CPU on MacPPC machines
29
*/
30
31
#include <stdio.h>
32
#include <stdlib.h>
33
#include <string.h>
34
35
#include "
cpu.h
"
36
#include "
device.h
"
37
#include "
machine.h
"
38
#include "
memory.h
"
39
#include "
misc.h
"
40
41
42
/* #define debug fatal */
43
44
void
ppc_pc_to_pointers
(
struct
cpu
*);
45
void
ppc32_pc_to_pointers
(
struct
cpu
*);
46
47
#define DEV_HAMMERHEAD_LENGTH 4
48
49
struct
hammerhead_data
{
50
int
dummy
;
51
};
52
53
54
DEVICE_ACCESS
(hammerhead)
55
{
56
/* struct hammerhead_data *d = extra; */
57
uint64_t idata = 0, odata=0;
58
59
if
(writeflag ==
MEM_WRITE
)
60
idata =
memory_readmax64
(
cpu
,
data
, len);
61
62
if
(writeflag ==
MEM_WRITE
) {
63
int
my_id =
cpu
->
cpu_id
;
64
struct
cpu
*other_cpu =
cpu
->
machine
->
cpus
[!my_id];
65
66
debug
(
"[ HAMMERHEAD: from cpu%i to cpu%i: new pc = 0x%llx ]\n"
,
67
my_id, !my_id, (
long
long
)idata);
68
69
if
(idata <= 0x100)
70
return
1;
71
72
other_cpu->
running
= 1;
73
other_cpu->
pc
= idata;
74
75
if
(other_cpu->
is_32bit
)
76
ppc32_pc_to_pointers
(other_cpu);
77
else
78
ppc_pc_to_pointers
(other_cpu);
79
}
else
{
80
fatal
(
"[ HAMMERHEAD read: TODO ]\n"
);
81
}
82
83
if
(writeflag ==
MEM_READ
)
84
memory_writemax64
(
cpu
,
data
, len, odata);
85
86
return
1;
87
}
88
89
90
DEVINIT
(hammerhead)
91
{
92
struct
hammerhead_data
*d;
93
94
CHECK_ALLOCATION
(d = (
struct
hammerhead_data
*) malloc(
sizeof
(
struct
hammerhead_data
)));
95
memset(d, 0,
sizeof
(
struct
hammerhead_data
));
96
97
memory_device_register
(
devinit
->
machine
->
memory
,
devinit
->
name
,
98
devinit
->
addr
,
DEV_HAMMERHEAD_LENGTH
, dev_hammerhead_access, d,
99
DM_DEFAULT
, NULL);
100
101
return
1;
102
}
103
data
u_short data
Definition:
siireg.h:79
cpu::cpu_id
int cpu_id
Definition:
cpu.h:359
cpu::running
uint8_t running
Definition:
cpu.h:353
debug
#define debug
Definition:
dev_adb.cc:57
machine::cpus
struct cpu ** cpus
Definition:
machine.h:140
devinit::addr
uint64_t addr
Definition:
device.h:46
memory_device_register
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
Definition:
memory.cc:339
MEM_READ
#define MEM_READ
Definition:
memory.h:116
DM_DEFAULT
#define DM_DEFAULT
Definition:
memory.h:130
devinit::machine
struct machine * machine
Definition:
device.h:41
DEV_HAMMERHEAD_LENGTH
#define DEV_HAMMERHEAD_LENGTH
Definition:
dev_hammerhead.cc:47
device.h
MEM_WRITE
#define MEM_WRITE
Definition:
memory.h:117
ppc_pc_to_pointers
void ppc_pc_to_pointers(struct cpu *)
fatal
void fatal(const char *fmt,...)
Definition:
main.cc:152
DEVICE_ACCESS
DEVICE_ACCESS(hammerhead)
Definition:
dev_hammerhead.cc:54
misc.h
memory_readmax64
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
Definition:
memory.cc:55
machine.h
devinit::name
char * name
Definition:
device.h:43
hammerhead_data
Definition:
dev_hammerhead.cc:49
devinit
Definition:
device.h:40
cpu::is_32bit
uint8_t is_32bit
Definition:
cpu.h:350
cpu.h
machine::memory
struct memory * memory
Definition:
machine.h:126
cpu::machine
struct machine * machine
Definition:
cpu.h:328
ppc32_pc_to_pointers
void ppc32_pc_to_pointers(struct cpu *)
memory_writemax64
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
Definition:
memory.cc:89
cpu
Definition:
cpu.h:326
cpu::pc
uint64_t pc
Definition:
cpu.h:383
memory.h
DEVINIT
DEVINIT(hammerhead)
Definition:
dev_hammerhead.cc:90
hammerhead_data::dummy
int dummy
Definition:
dev_hammerhead.cc:50
CHECK_ALLOCATION
#define CHECK_ALLOCATION(ptr)
Definition:
misc.h:239
Generated on Tue Mar 24 2020 14:04:48 for GXemul by
1.8.17