/*  This file is part of the program psim.

    Copyright (C) 1994-1997, 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 _VM_H_
#define _VM_H_

typedef struct _vm vm;
typedef struct _vm_data_map vm_data_map;
typedef struct _vm_instruction_map vm_instruction_map;


/* each PowerPC requires two virtual memory maps */

INLINE_VM\
(vm *) vm_create
(core *memory);

INLINE_VM\
(vm_data_map *) vm_create_data_map
(vm *memory);

INLINE_VM\
(vm_instruction_map *) vm_create_instruction_map
(vm *memory);


/* address translation, if the translation is invalid
   these will not return */

INLINE_VM\
(unsigned_word) vm_real_data_addr
(vm_data_map *data_map,
 unsigned_word ea,
 int is_read,
 cpu *processor,
 unsigned_word cia);

INLINE_VM\
(unsigned_word) vm_real_instruction_addr
(vm_instruction_map *instruction_map,
 cpu *processor,
 unsigned_word cia);


/* generic block transfers.  Dependant on the presence of the
   PROCESSOR arg, either returns the number of bytes transfered or (if
   PROCESSOR is non NULL) aborts the simulation */

INLINE_VM\
(int) vm_data_map_read_buffer
(vm_data_map *map,
 void *target,
 unsigned_word addr,
 unsigned len,
 cpu *processor,
 unsigned_word cia);

INLINE_VM\
(int) vm_data_map_write_buffer
(vm_data_map *map,
 const void *source,
 unsigned_word addr,
 unsigned len,
 int violate_read_only_section,
 cpu *processor,
 unsigned_word cia);


/* fetch the next instruction from memory */

INLINE_VM\
(instruction_word) vm_instruction_map_read
(vm_instruction_map *instruction_map,
 cpu *processor,
 unsigned_word cia);


/* read data from memory */

#define DECLARE_VM_DATA_MAP_READ_N(N) \
INLINE_VM\
(unsigned_##N) vm_data_map_read_##N \
(vm_data_map *map, \
 unsigned_word ea, \
 cpu *processor, \
 unsigned_word cia);

DECLARE_VM_DATA_MAP_READ_N(1)
DECLARE_VM_DATA_MAP_READ_N(2)
DECLARE_VM_DATA_MAP_READ_N(4)
DECLARE_VM_DATA_MAP_READ_N(8)
DECLARE_VM_DATA_MAP_READ_N(word)


/* write data to memory */

#define DECLARE_VM_DATA_MAP_WRITE_N(N) \
INLINE_VM\
(void) vm_data_map_write_##N \
(vm_data_map *map, \
 unsigned_word addr, \
 unsigned_##N val, \
 cpu *processor, \
 unsigned_word cia);

DECLARE_VM_DATA_MAP_WRITE_N(1)
DECLARE_VM_DATA_MAP_WRITE_N(2)
DECLARE_VM_DATA_MAP_WRITE_N(4)
DECLARE_VM_DATA_MAP_WRITE_N(8)
DECLARE_VM_DATA_MAP_WRITE_N(word)


/* update vm data structures due to a synchronization point */

INLINE_VM\
(void) vm_synchronize_context
(vm *memory,
 spreg *sprs,
 sreg *srs,
 msreg msr,
 /**/
 cpu *processor,
 unsigned_word cia);


/* update vm data structures due to a TLB operation */

INLINE_VM\
(void) vm_page_tlb_invalidate_entry
(vm *memory,
 unsigned_word ea);

INLINE_VM\
(void) vm_page_tlb_invalidate_all
(vm *memory);

#endif
