blob: e697abddbb1d9cd913e755321935c9c5375d3105 [file] [log] [blame]
/* This file is part of the program psim.
Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _EMUL_GENERIC_H_
#define _EMUL_GENERIC_H_
#include "cpu.h"
#include "idecode.h"
#include "os_emul.h"
#include "tree.h"
#include "bfd.h"
#ifndef INLINE_EMUL_GENERIC
#define INLINE_EMUL_GENERIC
#endif
/* various PowerPC instructions for writing into memory */
enum {
emul_call_instruction = 0x1,
emul_loop_instruction = 0x48000000, /* branch to . */
emul_rfi_instruction = 0x4c000064,
emul_blr_instruction = 0x4e800020,
};
/* emulation specific data */
typedef struct _os_emul_data os_emul_data;
typedef os_emul_data *(os_emul_create_handler)
(device *tree,
bfd *image,
const char *emul_name);
typedef void (os_emul_init_handler)
(os_emul_data *emul_data,
int nr_cpus);
typedef void (os_emul_system_call_handler)
(cpu *processor,
unsigned_word cia,
os_emul_data *emul_data);
typedef int (os_emul_instruction_call_handler)
(cpu *processor,
unsigned_word cia,
unsigned_word ra,
os_emul_data *emul_data);
struct _os_emul {
const char *name;
os_emul_create_handler *create;
os_emul_init_handler *init;
os_emul_system_call_handler *system_call;
os_emul_instruction_call_handler *instruction_call;
os_emul_data *data;
};
/* One class of emulation - system call is pretty general, provide a
common template for implementing this */
typedef struct _emul_syscall emul_syscall;
typedef struct _emul_syscall_descriptor emul_syscall_descriptor;
typedef void (emul_syscall_handler)
(os_emul_data *emul_data,
unsigned call,
const int arg0,
cpu *processor,
unsigned_word cia);
struct _emul_syscall_descriptor {
emul_syscall_handler *handler;
const char *name;
};
struct _emul_syscall {
emul_syscall_descriptor *syscall_descriptor;
int nr_system_calls;
char **error_names;
int nr_error_names;
char **signal_names;
int nr_signal_names;
};
INLINE_EMUL_GENERIC void emul_do_system_call
(os_emul_data *emul_data,
emul_syscall *syscall,
unsigned call,
const int arg0,
cpu *processor,
unsigned_word cia);
INLINE_EMUL_GENERIC unsigned64 emul_read_gpr64
(cpu *processor,
int g);
INLINE_EMUL_GENERIC void emul_write_gpr64
(cpu *processor,
int g,
unsigned64 val);
INLINE_EMUL_GENERIC void emul_write_status
(cpu *processor,
int status,
int errno);
INLINE_EMUL_GENERIC void emul_write2_status
(cpu *processor,
int status1,
int status2,
int errno);
INLINE_EMUL_GENERIC char *emul_read_string
(char *dest,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
INLINE_EMUL_GENERIC unsigned_word emul_read_word
(unsigned_word addr,
cpu *processor,
unsigned_word cia);
INLINE_EMUL_GENERIC void emul_write_word
(unsigned_word addr,
unsigned_word buf,
cpu *processor,
unsigned_word cia);
INLINE_EMUL_GENERIC void emul_read_buffer
(void *dest,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
INLINE_EMUL_GENERIC void emul_write_buffer
(const void *source,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
/* Simplify the construction of device trees */
INLINE_EMUL_GENERIC void emul_add_tree_options
(device *tree,
bfd *image,
const char *emul,
const char *env,
int oea_interrupt_prefix);
INLINE_EMUL_GENERIC void emul_add_tree_hardware
(device *tree);
#endif /* _EMUL_GENERIC_H_ */