summaryrefslogblamecommitdiffstats
path: root/private/mvdm/softpc.new/base/inc/cpu4.h
blob: 6633bccce071e0005205aeaeab60c54f4b6638bb (plain) (tree)





































































































































                                                                                                  

/*
 * SoftPC Revision 3.0
 *
 * Title	: Definitions for the 80386 CPU 
 *
 * Description	: Structures, macros and definitions for access to the 
 *		  CPU registers
 *
 * Author	: Wayne Plummer
 *
 * Derived From : cpu.h
 *
 * Notes	: This file should be portable - but includes a file
 *		  host_cpu.h which contains machine specific definitions
 *		  of CPU register mappings etc.
 *
 * SccsID	: @(#)cpu4.h	1.12 10/21/94
 *
 *	(c)Copyright Insignia Solutions Ltd., 1991-1994. All rights reserved.
 */

#include "host_cpu.h"

IMPORT VOID host_set_hw_int IPT0();
IMPORT VOID host_clear_hw_int IPT0();


/*
 *	Host functions to be provided for the base to use with respect to the CPU.
 *	These must be done in host_cpu.h because some hosts may want functions and
 *	others may want #defines.
 */

/*
 *	This macro specifies the maximum recursion depth the CPU is required to support.
 *	(Note that a particular host may not actually use this value if it is capable
 *	of supporting abirtarily deep recursion).
 */
#define CPU_MAX_RECURSION	32

/*
 *	Interrupt types...
 */

#include <CpuInt_c.h>
typedef enum CPU_INT_TYPE CPU_INT_TYPE;

#ifdef CPU_PRIVATE
/*
   Function returns for private i/f procedures handling segment loading.
 */

#define GP_ERROR    13
#define NP_ERROR    11
#define SF_ERROR    12
#endif /* CPU_PRIVATE */

/*
 * Include the main part of the cpu interface, which at present is generated
 */
#include	<cpu4gen.h>

IMPORT void		cpuEnableInterrupts IPT1(IBOOL, yes_or_no);

#ifdef IRET_HOOKS
#ifdef CCPU
IMPORT   VOID c_Cpu_set_hook_selector  IPT1(IU16, selector);
#define  Cpu_set_hook_selector         c_Cpu_set_hook_selector
#else
IMPORT   VOID a3_Cpu_set_hook_selector IPT1(IU16, selector);
#define  Cpu_set_hook_selector         a3_Cpu_set_hook_selector
#endif
#endif /* IRET_HOOKS */

/*
 * These functions get the (E)IP or (E)SP correctly whatever size stack
 * or code segment is in use.  For anything but GISP, we always hold
 * the IP as a 32 bit quantity, so we don't have to worry about the
 * distinction.
 */

#ifdef GISP_CPU
extern IU32 GetInstructionPointer IPT0();
#else
#define GetInstructionPointer getEIP
#endif
extern IU32 GetStackPointer IPT0();


#ifdef IRET_HOOKS
/*
 * The interfaces provided by the CPU so that the ICA can initiate and
 * terminate an iret hook.
 */

extern void Cpu_do_hook IPT2(IUM8, line, IBOOL, is_hooked);
extern void Cpu_inter_hook_processing IPT1(IUM8, line);
extern void Cpu_unhook IPT1(IUM8, line_number);
#ifdef GISP_CPU
extern void Cpu_set_hook_selector IPT1(IU16, selector);
extern void Cpu_hook_bop IPT0();
#endif

#endif /* IRET_HOOKS */

/*
 * This function lets ios.c determine whether it is OK for it to go
 * ahead and do an in or out instruction, or whether the CPU wants to take
 * it over instead.
 */

/* However, it is sometimes defined as a macro */

#if !defined(CCPU) && !defined(PROD)
extern IBOOL IOVirtualised IPT4(io_addr, io_address, IU32 *, value, LIN_ADDR, offset, IU8, width);
#endif

#ifndef CCPU
/*
 * Npx functions:
 */
#ifndef PROD
GLOBAL IU32 a_getNpxControlReg	IPT0();
GLOBAL IU32 a_getNpxStatusReg	IPT0();
GLOBAL IU32 a_getNpxTagwordReg	IPT0();
GLOBAL char *a_getNpxStackReg	IPT2(IU32, reg_num, char *, buffer);
#endif /* PROD */

#ifdef PIG
GLOBAL void a_setNpxControlReg	IPT1(IU32, newControl);
GLOBAL void a_setNpxStatusReg	IPT1(IU32, newStatus);
#endif /* PIG */
#endif /* !CCPU */