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 32 #ifndef INLINE_EMUL_GENERIC 33 #define INLINE_EMUL_GENERIC 34 #endif 35 36 /* various PowerPC instructions for writing into memory */ 37 enum { 38 emul_call_instruction = 0x1, 39 emul_loop_instruction = 0x48000000, /* branch to . */ 40 emul_rfi_instruction = 0x4c000064, 41 emul_blr_instruction = 0x4e800020, 42 }; 43 44 45 /* emulation specific data */ 46 47 typedef struct _os_emul_data os_emul_data; 48 49 typedef os_emul_data *(os_emul_create_handler) 50 (device *tree, 51 bfd *image, 52 const char *emul_name); 53 typedef void (os_emul_init_handler) 54 (os_emul_data *emul_data, 55 int nr_cpus); 56 typedef void (os_emul_system_call_handler) 57 (cpu *processor, 58 unsigned_word cia, 59 os_emul_data *emul_data); 60 typedef int (os_emul_instruction_call_handler) 61 (cpu *processor, 62 unsigned_word cia, 63 unsigned_word ra, 64 os_emul_data *emul_data); 65 66 struct _os_emul { 67 const char *name; 68 os_emul_create_handler *create; 69 os_emul_init_handler *init; 70 os_emul_system_call_handler *system_call; 71 os_emul_instruction_call_handler *instruction_call; 72 os_emul_data *data; 73 }; 74 75 76 /* One class of emulation - system call is pretty general, provide a 77 common template for implementing this */ 78 79 typedef struct _emul_syscall emul_syscall; 80 typedef struct _emul_syscall_descriptor emul_syscall_descriptor; 81 82 typedef void (emul_syscall_handler) 83 (os_emul_data *emul_data, 84 unsigned call, 85 const int arg0, 86 cpu *processor, 87 unsigned_word cia); 88 89 struct _emul_syscall_descriptor { 90 emul_syscall_handler *handler; 91 const char *name; 92 }; 93 94 struct _emul_syscall { 95 emul_syscall_descriptor *syscall_descriptor; 96 int nr_system_calls; 97 char **error_names; 98 int nr_error_names; 99 char **signal_names; 100 int nr_signal_names; 101 }; 102 103 104 INLINE_EMUL_GENERIC void emul_do_system_call 105 (os_emul_data *emul_data, 106 emul_syscall *syscall, 107 unsigned call, 108 const int arg0, 109 cpu *processor, 110 unsigned_word cia); 111 112 113 INLINE_EMUL_GENERIC unsigned64 emul_read_gpr64 114 (cpu *processor, 115 int g); 116 117 INLINE_EMUL_GENERIC void emul_write_gpr64 118 (cpu *processor, 119 int g, 120 unsigned64 val); 121 122 INLINE_EMUL_GENERIC void emul_write_status 123 (cpu *processor, 124 int status, 125 int errno); 126 127 INLINE_EMUL_GENERIC void emul_write2_status 128 (cpu *processor, 129 int status1, 130 int status2, 131 int errno); 132 133 INLINE_EMUL_GENERIC char *emul_read_string 134 (char *dest, 135 unsigned_word addr, 136 unsigned nr_bytes, 137 cpu *processor, 138 unsigned_word cia); 139 140 INLINE_EMUL_GENERIC unsigned_word emul_read_word 141 (unsigned_word addr, 142 cpu *processor, 143 unsigned_word cia); 144 145 INLINE_EMUL_GENERIC void emul_write_word 146 (unsigned_word addr, 147 unsigned_word buf, 148 cpu *processor, 149 unsigned_word cia); 150 151 INLINE_EMUL_GENERIC void emul_read_buffer 152 (void *dest, 153 unsigned_word addr, 154 unsigned nr_bytes, 155 cpu *processor, 156 unsigned_word cia); 157 158 INLINE_EMUL_GENERIC void emul_write_buffer 159 (const void *source, 160 unsigned_word addr, 161 unsigned nr_bytes, 162 cpu *processor, 163 unsigned_word cia); 164 165 /* Simplify the construction of device trees */ 166 167 INLINE_EMUL_GENERIC void emul_add_tree_options 168 (device *tree, 169 bfd *image, 170 const char *emul, 171 const char *env, 172 int oea_interrupt_prefix); 173 174 INLINE_EMUL_GENERIC void emul_add_tree_hardware 175 (device *tree); 176 177 #endif /* _EMUL_GENERIC_H_ */ 178