1/*  This file is part of the program psim.
2
3    Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19    */
20
21
22#ifndef _EMUL_GENERIC_H_
23#define _EMUL_GENERIC_H_
24
25#include "cpu.h"
26#include "idecode.h"
27#include "os_emul.h"
28
29#include "tree.h"
30
31#include "bfd.h"
32
33#ifndef INLINE_EMUL_GENERIC
34#define INLINE_EMUL_GENERIC
35#endif
36
37/* various PowerPC instructions for writing into memory */
38enum {
39  emul_call_instruction = 0x1,
40  emul_loop_instruction = 0x48000000, /* branch to . */
41  emul_rfi_instruction = 0x4c000064,
42  emul_blr_instruction = 0x4e800020,
43};
44
45
46/* emulation specific data */
47
48typedef struct _os_emul_data os_emul_data;
49
50typedef os_emul_data *(os_emul_create_handler)
51     (device *tree,
52      bfd *image,
53      const char *emul_name);
54typedef void (os_emul_init_handler)
55     (os_emul_data *emul_data,
56      int nr_cpus);
57typedef void (os_emul_system_call_handler)
58     (cpu *processor,
59      unsigned_word cia,
60      os_emul_data *emul_data);
61typedef int (os_emul_instruction_call_handler)
62     (cpu *processor,
63      unsigned_word cia,
64      unsigned_word ra,
65      os_emul_data *emul_data);
66
67struct _os_emul {
68  const char *name;
69  os_emul_create_handler *create;
70  os_emul_init_handler *init;
71  os_emul_system_call_handler *system_call;
72  os_emul_instruction_call_handler *instruction_call;
73  os_emul_data *data;
74};
75
76
77/* One class of emulation - system call is pretty general, provide a
78   common template for implementing this */
79
80typedef struct _emul_syscall emul_syscall;
81typedef struct _emul_syscall_descriptor emul_syscall_descriptor;
82
83typedef void (emul_syscall_handler)
84     (os_emul_data *emul_data,
85      unsigned call,
86      const int arg0,
87      cpu *processor,
88      unsigned_word cia);
89
90struct _emul_syscall_descriptor {
91  emul_syscall_handler *handler;
92  const char *name;
93};
94
95struct _emul_syscall {
96  emul_syscall_descriptor *syscall_descriptor;
97  int nr_system_calls;
98  char **error_names;
99  int nr_error_names;
100  char **signal_names;
101  int nr_signal_names;
102};
103
104
105INLINE_EMUL_GENERIC void emul_do_system_call
106(os_emul_data *emul_data,
107 emul_syscall *syscall,
108 unsigned call,
109 const int arg0,
110 cpu *processor,
111 unsigned_word cia);
112
113
114INLINE_EMUL_GENERIC unsigned64 emul_read_gpr64
115(cpu *processor,
116 int g);
117
118INLINE_EMUL_GENERIC void emul_write_gpr64
119(cpu *processor,
120 int g,
121 unsigned64 val);
122
123INLINE_EMUL_GENERIC void emul_write_status
124(cpu *processor,
125 int status,
126 int errno);
127
128INLINE_EMUL_GENERIC void emul_write2_status
129(cpu *processor,
130 int status1,
131 int status2,
132 int errno);
133
134INLINE_EMUL_GENERIC char *emul_read_string
135(char *dest,
136 unsigned_word addr,
137 unsigned nr_bytes,
138 cpu *processor,
139 unsigned_word cia);
140
141INLINE_EMUL_GENERIC unsigned_word emul_read_word
142(unsigned_word addr,
143 cpu *processor,
144 unsigned_word cia);
145
146INLINE_EMUL_GENERIC void emul_write_word
147(unsigned_word addr,
148 unsigned_word buf,
149 cpu *processor,
150 unsigned_word cia);
151
152INLINE_EMUL_GENERIC void emul_read_buffer
153(void *dest,
154 unsigned_word addr,
155 unsigned nr_bytes,
156 cpu *processor,
157 unsigned_word cia);
158
159INLINE_EMUL_GENERIC void emul_write_buffer
160(const void *source,
161 unsigned_word addr,
162 unsigned nr_bytes,
163 cpu *processor,
164 unsigned_word cia);
165
166/* Simplify the construction of device trees */
167
168INLINE_EMUL_GENERIC void emul_add_tree_options
169(device *tree,
170 bfd *image,
171 const char *emul,
172 const char *env,
173 int oea_interrupt_prefix);
174
175INLINE_EMUL_GENERIC void emul_add_tree_hardware
176(device *tree);
177
178#endif /* _EMUL_GENERIC_H_ */
179