/*  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 _CPU_H_
#define _CPU_H_

#include "basics.h"
#include "registers.h"
#include "device.h"
#include "corefile.h"
#include "vm.h"
#include "events.h"
#include "interrupts.h"
#include "psim.h"
#include "idecode.h"
#include "itable.h"
#include "os_emul.h"
#include "mon.h"
#include "model.h"
#include "libiberty.h"

#ifndef CONST_ATTRIBUTE
#define CONST_ATTRIBUTE __attribute__((__const__))
#endif

/* typedef struct _cpu cpu;

   Declared in basics.h because it is used opaquely throughout the
   code */


/* Create a cpu object */

INLINE_CPU\
(cpu *) cpu_create
(psim *system,
 core *memory,
 cpu_mon *monitor,
 os_emul *cpu_emulation,
 int cpu_nr);

INLINE_CPU\
(void) cpu_init
(cpu *processor);

/* Find our way home */

INLINE_CPU\
(psim *) cpu_system
(cpu *processor) CONST_ATTRIBUTE;

INLINE_CPU\
(cpu_mon *) cpu_monitor
(cpu *processor) CONST_ATTRIBUTE;

INLINE_CPU\
(os_emul *) cpu_os_emulation
(cpu *processor);

INLINE_CPU\
(int) cpu_nr
(cpu *processor) CONST_ATTRIBUTE;


/* manipulate the processors program counter and execution state.

   The program counter is not included in the register file.  Instead
   it is extracted and then later restored (set, reset, halt).  This
   is to give the user of the cpu (and the compiler) the chance to
   minimize the need to load/store the cpu's PC value.  (Especially in
   the case of a single processor) */

INLINE_CPU\
(void) cpu_set_program_counter
(cpu *processor,
 unsigned_word new_program_counter);

INLINE_CPU\
(unsigned_word) cpu_get_program_counter
(cpu *processor);

INLINE_CPU\
(void) cpu_restart
(cpu *processor,
 unsigned_word nia);

INLINE_CPU\
(void) cpu_halt
(cpu *processor,
 unsigned_word nia,
 stop_reason reason,
 int signal);

EXTERN_CPU\
(void) cpu_error
(cpu *processor,
 unsigned_word cia,
 const char *fmt,
 ...) __attribute__ ((format (printf, 3, 4)));


/* The processors local concept of time */

INLINE_CPU\
(signed64) cpu_get_time_base
(cpu *processor);

INLINE_CPU\
(void) cpu_set_time_base
(cpu *processor,
 signed64 time_base);

INLINE_CPU\
(signed32) cpu_get_decrementer
(cpu *processor);

INLINE_CPU\
(void) cpu_set_decrementer
(cpu *processor,
 signed32 decrementer);


#if WITH_IDECODE_CACHE_SIZE
/* Return the cache entry that matches the given CIA.  No guarentee
   that the cache entry actually contains the instruction for that
   address */

INLINE_CPU\
(idecode_cache) *cpu_icache_entry
(cpu *processor,
 unsigned_word cia);

INLINE_CPU\
(void) cpu_flush_icache
(cpu *processor);
#endif


/* reveal the processors VM:

   At first sight it may seem better to, instead of exposing the cpu's
   inner vm maps, to have the cpu its self provide memory manipulation
   functions. (eg cpu_instruction_fetch() cpu_data_read_4())

   Unfortunatly in addition to these functions is the need (for the
   debugger) to be able to read/write to memory in ways that violate
   the vm protection (eg store breakpoint instruction in the
   instruction map). */

INLINE_CPU\
(vm_data_map *) cpu_data_map
(cpu *processor);

INLINE_CPU\
(vm_instruction_map *) cpu_instruction_map
(cpu *processor);

INLINE_CPU\
(void) cpu_page_tlb_invalidate_entry
(cpu *processor,
 unsigned_word ea);

INLINE_CPU\
(void) cpu_page_tlb_invalidate_all
(cpu *processor);


/* reveal the processors interrupt state */

INLINE_CPU\
(interrupts *) cpu_interrupts
(cpu *processor);


/* grant access to the reservation information */

typedef struct _memory_reservation {
  int valid;
  unsigned_word addr;
  unsigned_word data;
} memory_reservation;

INLINE_CPU\
(memory_reservation *) cpu_reservation
(cpu *processor);


/* Registers:

   This model exploits the PowerPC's requirement for a synchronization
   to occure after (or before) the update of any context controlling
   register.  All context sync points must call the sync function
   below to when ever a synchronization point is reached */

INLINE_CPU\
(registers *) cpu_registers
(cpu *processor) CONST_ATTRIBUTE;

INLINE_CPU\
(void) cpu_synchronize_context
(cpu *processor,
 unsigned_word cia);

#define IS_PROBLEM_STATE(PROCESSOR) \
(CURRENT_ENVIRONMENT == OPERATING_ENVIRONMENT \
 ? (cpu_registers(PROCESSOR)->msr & msr_problem_state) \
 : 1)

#define IS_64BIT_MODE(PROCESSOR) \
(WITH_TARGET_WORD_BITSIZE == 64 \
 ? (CURRENT_ENVIRONMENT == OPERATING_ENVIRONMENT \
    ? (cpu_registers(PROCESSOR)->msr & msr_64bit_mode) \
    : 1) \
 : 0)

#define IS_FP_AVAILABLE(PROCESSOR) \
(CURRENT_ENVIRONMENT == OPERATING_ENVIRONMENT \
 ? (cpu_registers(PROCESSOR)->msr & msr_floating_point_available) \
 : 1)



INLINE_CPU\
(void) cpu_print_info
(cpu *processor,
 int verbose);

INLINE_CPU\
(model_data *) cpu_model
(cpu *processor) CONST_ATTRIBUTE;


#if (CPU_INLINE & INCLUDE_MODULE)
# include "cpu.c"
#endif

#endif
