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 3 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, see <http://www.gnu.org/licenses/>. 17 18 */ 19 20 21 #ifndef _EMUL_GENERIC_H_ 22 #define _EMUL_GENERIC_H_ 23 24 #include "cpu.h" 25 #include "idecode.h" 26 #include "os_emul.h" 27 28 #include "tree.h" 29 30 #include "bfd.h" 31 #include "libiberty.h" 32 33 #ifndef INLINE_EMUL_GENERIC 34 #define INLINE_EMUL_GENERIC 35 #endif 36 37 /* various PowerPC instructions for writing into memory */ 38 enum { 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 48 typedef struct _os_emul_data os_emul_data; 49 50 typedef os_emul_data *(os_emul_create_handler) 51 (device *tree, 52 bfd *image, 53 const char *emul_name); 54 typedef void (os_emul_init_handler) 55 (os_emul_data *emul_data, 56 int nr_cpus); 57 typedef void (os_emul_system_call_handler) 58 (cpu *processor, 59 unsigned_word cia, 60 os_emul_data *emul_data); 61 typedef int (os_emul_instruction_call_handler) 62 (cpu *processor, 63 unsigned_word cia, 64 unsigned_word ra, 65 os_emul_data *emul_data); 66 67 struct _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 80 typedef struct _emul_syscall emul_syscall; 81 typedef struct _emul_syscall_descriptor emul_syscall_descriptor; 82 83 typedef 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 90 struct _emul_syscall_descriptor { 91 emul_syscall_handler *handler; 92 const char *name; 93 }; 94 95 struct _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 105 INLINE_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 114 INLINE_EMUL_GENERIC uint64_t emul_read_gpr64 115 (cpu *processor, 116 int g); 117 118 INLINE_EMUL_GENERIC void emul_write_gpr64 119 (cpu *processor, 120 int g, 121 uint64_t val); 122 123 INLINE_EMUL_GENERIC void emul_write_status 124 (cpu *processor, 125 int status, 126 int err); 127 128 INLINE_EMUL_GENERIC void emul_write2_status 129 (cpu *processor, 130 int status1, 131 int status2, 132 int err); 133 134 INLINE_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 141 INLINE_EMUL_GENERIC unsigned_word emul_read_word 142 (unsigned_word addr, 143 cpu *processor, 144 unsigned_word cia); 145 146 INLINE_EMUL_GENERIC void emul_write_word 147 (unsigned_word addr, 148 unsigned_word buf, 149 cpu *processor, 150 unsigned_word cia); 151 152 INLINE_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 159 INLINE_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 168 INLINE_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 175 INLINE_EMUL_GENERIC void emul_add_tree_hardware 176 (device *tree); 177 178 #endif /* _EMUL_GENERIC_H_ */ 179