NLMCONV_FOR_TARGET. (SUBDIRS): Add nlm target.
* configure.in (powerpc-*-netware*): Automatically configure nlm
subdir.
* nlm/Makefile.in: Add {CC NLMCONV LD}_FOR_TARGET. Remove alpha
specific stuff. Make things more configurable.
* nlm/configure.in: Add powerpc-*-netware* target. Use
gdbserve.mt/cpu.c/cpu.h for target stuff. Get rid of tm/xm/nm.h
files.
* nlm/gdbserve.c: Move Alpha specific stuff into other files.
Remove lots of architecture-specific stuff.
* nlm/gdbserve.def: Add new imports.
* nlm/ppc.c, nlm/ppc.h: New files that contain PowerPC specific code.
* nlm/prelude.c: Don't include libhooks.h, get rid of call to
register library.
* nlm/prelude.o: What was this doing here?
+Wed Aug 17 23:08:53 1994 Stu Grossman (grossman@cygnus.com)
+
+ * Makefile.in (TARGET_FLAGS_TO_PASS): Pass down LD_FOR_TARGET and
+ NLMCONV_FOR_TARGET. (SUBDIRS): Add nlm target.
+ * configure.in (powerpc-*-netware*): Automatically configure nlm
+ subdir.
+ * nlm/Makefile.in: Add {CC NLMCONV LD}_FOR_TARGET. Remove alpha
+ specific stuff. Make things more configurable.
+ * nlm/configure.in: Add powerpc-*-netware* target. Use
+ gdbserve.mt/cpu.c/cpu.h for target stuff. Get rid of tm/xm/nm.h
+ files.
+ * nlm/gdbserve.c: Move Alpha specific stuff into other files.
+ Remove lots of architecture-specific stuff.
+ * nlm/gdbserve.def: Add new imports.
+ * nlm/ppc.c, nlm/ppc.h: New files that contain PowerPC specific code.
+ * nlm/prelude.c: Don't include libhooks.h, get rid of call to
+ register library.
+ * nlm/prelude.o: What was this doing here?
+
Wed Aug 17 23:17:33 1994 Rob Savoye (rob@darkstar.cygnus.com)
* remote-pa.c: New file for HPPA embedded support. Currently it's
"prefix=$(prefix)" \
"exec_prefix=$(exec_prefix)" \
"against=$(against)" \
+ "BISON=$(BISON)" \
'CC=$$(CC_FOR_TARGET)' \
"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
"CFLAGS=$(CFLAGS)" \
'CXX=$$(CXX_FOR_TARGET)' \
"CXX_FOR_TARGET=$(CXX_FOR_TARGET)" \
"CXXFLAGS=$(CXXFLAGS)" \
- "MAKEINFO=$(MAKEINFO)" \
"INSTALL=$(INSTALL)" \
"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
"INSTALL_DATA=$(INSTALL_DATA)" \
+ "LD_FOR_TARGET=$(LD_FOR_TARGET)" \
+ "MAKEINFO=$(MAKEINFO)" \
+ "NLMCONV_FOR_TARGET=$(NLMCONV_FOR_TARGET)" \
"RUNTEST=$(RUNTEST)" \
- "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
- "BISON=$(BISON)"
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)"
# All source files that go into linking GDB.
# Links made at configuration time should not be specified here, since
NTSSTART = kdb-start.o
-SUBDIRS = doc testsuite
+SUBDIRS = doc testsuite nlm
# For now, shortcut the "configure GDB for fewer languages" stuff.
YYFILES = c-exp.tab.c m2-exp.tab.c ch-exp.tab.c
nlmstub: nlmstub.nlm
+nlm: force
+ rootme=`pwd`; export rootme; $(MAKE) $(TARGET_FLAGS_TO_PASS) DO=all DODIRS=nlm subdir_do
+
# libproc is not listed here because all-libproc is a dependency of all-gui,
# not all-gdb, and thus might be built after us.
LIBGDBDEPS=$(COMMON_OBS) $(LIBGDB_OBS) $(TSOBS) $(ADD_DEPS) $(CDEPS) init.o
ns32k-utek-*) gdb_target=umax ;;
pn-*-*) gdb_target=pn ;;
-powerpc-*-netware*) gdb_target=ppc-nw ;;
+powerpc-*-netware*) gdb_target=ppc-nw
+ configdirs="${configdirs} nlm" ;;
pyramid-*-*) gdb_target=pyramid ;;
INSTALL_XFORM = $(INSTALL) -t='$(program_transform_name)'
INSTALL_XFORM1 = $(INSTALL_XFORM) -b=.1
+CC_FOR_TARGET = ` \
+ if [ -f ../../gcc/xgcc ] ; then \
+ if [ -f ../../newlib/Makefile ] ; then \
+ echo ../../gcc/xgcc -B../../gcc/ -idirafter ../newlib/targ-include -idirafter $${rootsrc}/../newlib/libc/include -nostdinc -L../../../newlib -B../../../newlib/; \
+ else \
+ echo ../../gcc/xgcc -B../../gcc/; \
+ fi; \
+ else \
+ if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
+ echo $(CC); \
+ else \
+ t='$(program_transform_name)'; echo gcc | sed -e '' $$t; \
+ fi; \
+ fi`
+
+NLMCONV_FOR_TARGET = ` \
+ if [ -f ../../binutils/nlmconv ] ; then \
+ echo ../../binutils/nlmconv; \
+ else \
+ if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
+ echo $(NLMCONV); \
+ else \
+ t='$(program_transform_name)'; echo nlmconv | sed -e '' $$t; \
+ fi; \
+ fi`
+
+NWSOURCE = /gaunt/grossman/unsupported/Novell
+NWINCLUDES = -I/gaunt/grossman/PPC-NETWARE/ndk/include
+
+LD_FOR_TARGET = ` \
+ if [ -f ../../ld/ld.new ] ; then \
+ echo ../../ld/ld.new; \
+ else \
+ if [ "$(host_canonical)" = "$(target_canonical)" ] ; then \
+ echo $(LD); \
+ else \
+ t='$(program_transform_name)'; echo ld | sed -e '' $$t; \
+ fi; \
+ fi`
+
AR = ar
AR_FLAGS = qv
RANLIB = ranlib
# when running make. I.E. "make CFLAGS=-Wmissing-prototypes".
CFLAGS = -g
# INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros.
-INTERNAL_CFLAGS = ${CFLAGS} ${GLOBAL_CFLAGS} ${PROFILE_CFLAGS} ${MMALLOC_CFLAGS} ${INCLUDE_CFLAGS} ${USER_CFLAGS}
+INTERNAL_CFLAGS = ${CFLAGS} ${GLOBAL_CFLAGS} ${PROFILE_CFLAGS} ${MMALLOC_CFLAGS} ${INCLUDE_CFLAGS} ${USER_CFLAGS} ${NWINCLUDES}
LDFLAGS = $(CFLAGS)
# Perhaps should come from parent Makefile
# All source files that go into linking GDB remote server.
-SFILES = $(srcdir)/alpha-patch.c $(srcdir)/alpha-uart.c $(srcdir)/gdbserve.c \
- $(srcdir)/alpha-io.S
-
DEPFILES = $(GDBSERVE_DEPFILES)
-SOURCES = $(SFILES) $(ALLDEPFILES)
+SOURCES = $(ALLDEPFILES)
TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
-OBS = gdbserve.o alpha-patch.o alpha-uart.o alpha-io.o $(srcdir)/prelude.o
-
# Prevent Sun make from putting in the machine type. Setting
# TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1.
.c.o:
- ${CC} -c ${INTERNAL_CFLAGS} $<
+ ${CC_FOR_TARGET} -c ${INTERNAL_CFLAGS} $<
-all: GDBSERVE.NLM
+all: gdbserve.nlm
# Traditionally "install" depends on "all". But it may be useful
# not to; for example, if the user has made some trivial change to a
install-info:
clean-info:
-NWAXPDEV=/gaunt/grossman/ALPHA-NLM/cygnus_940215/nwaxpdev
-
-.EXPORT: NWAXPDEV
-
-CC=${NWAXPDEV}/bin/cc -32addr -non_shared -no_excpt -g -DALPHA=1 -std -I -I${NWAXPDEV}/usr/include -I${NWAXPDEV}/clib/include
-LD=${NWAXPDEV}/bin/ld -32addr -no_excpt -non_shared -d -r -L -T 0 -g -b
-AS=${NWAXPDEV}/bin/as -I. -32addr
-NLMCONV=${NWAXPDEV}/bin/alphanlm
-
-GDBSERVE.NLM: gdbserve $(srcdir)/gdbserve.def
- ${NLMCONV} $(srcdir)/gdbserve.def
-
-gdbserve: $(OBS)
- ${LD} $(LDFLAGS) -o gdbserve ${OBS} ${LIBS} ${NWAXPDEV}/usr/lib/nwlibc.a
-
-gdbserve.o: $(srcdir)/gdbserve.c $(srcdir)/alpha-patch.h
-
-alpha-patches.o: $(srcdir)/alpha-patches.c $(srcdir)/alpha-patches.h
-
-alpha-io.o: $(srcdir)/alpha-io.S
- ${AS} -o alpha-io.o $(srcdir)/alpha-io.S
+gdbserve.nlm: gdbserve.O $(srcdir)/gdbserve.def
+ ${NLMCONV_FOR_TARGET} -T $(srcdir)/gdbserve.def
-alpha-uart.o: $(srcdir)/alpha-uart.c
+gdbserve.O: prelude.o gdbserve.o $(TDEPFILES)
+ ${LD_FOR_TARGET} $(LDFLAGS) -r -o gdbserve.O prelude.o gdbserve.o ${TDEPFILES}
config.status:
@echo "You must configure gdbserver. Look at the README file for details."
clean:
rm -f *.o ${ADD_FILES} *~
rm -f init.c version.c
- rm -f gdbserver core make.log
+ rm -f gdbserve.O gdbserve.nlm core make.log
distclean: clean c-exp.tab.c m2-exp.tab.c ch-exp.tab.c TAGS
rm -f tm.h xm.h config.status
--- /dev/null
+
+/*----------------------------------------------------------------------------*
+ * *
+ * NetWare 386 Developer's Asynchronous I/O (AIO) Runtime library *
+ * *
+ * This include file defines the constants and prototypes required *
+ * to use the AIO application interface. *
+ * *
+ * (c) Copyright. 1991 Novell, Inc. All rights reserved. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef unsigned long DWORD;
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Predefined hardware types for use with the AIOAcquirePort function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_COMX_TYPE (1)
+#define AIO_ARTIC_TYPE (2)
+#define AIO_WNIM_TYPE (3)
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Function completion code status values. *
+ * *
+ * Note that all error statuses are negative values. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_SUCCESS (0)
+#define AIO_BAD_HANDLE (-1)
+#define AIO_FAILURE (-2)
+#define AIO_FUNC_NOT_SUPPORTED (-3)
+#define AIO_INVALID_PARAMETER (-5)
+#define AIO_PORT_NOT_AVAILABLE (-6)
+#define AIO_QUALIFIED_SUCCESS (-7)
+#define AIO_NO_MORE_PORTS (-8)
+#define AIO_TYPE_NUMBER_INVALID (-10)
+#define AIO_BOARD_NUMBER_INVALID (-11)
+#define AIO_PORT_NUMBER_INVALID (-12)
+#define AIO_RESOURCE_TAG_INVALID (-13)
+#define AIO_DATA_PRESENT (-14)
+#define AIO_BAD_REQUEST_TYPE (-15)
+#define AIO_PORT_GONE (-20)
+#define AIO_RTAG_INVALID (-21)
+
+
+/* This is only for non-CLIB application */
+
+#define ASYNCIOSignature 0x4E595341 /* 'NYSA' */
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOSetExternalControl function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_EXTERNAL_CONTROL (1)
+#define AIO_EXTCTRL_DTR (1)
+#define AIO_EXTCTRL_RTS (2)
+
+
+#define AIO_BREAK_CONTROL (2)
+#define AIO_SET_BREAK_OFF (0)
+#define AIO_SET_BREAK_ON (1)
+
+
+#define AIO_FLOW_CONTROL (3)
+#define AIO_SOFTWARE_FLOW_CONTROL_OFF (0)
+#define AIO_SOFTWARE_FLOW_CONTROL_ON (1)
+#define AIO_HARDWARE_FLOW_CONTROL_OFF (0)
+#define AIO_HARDWARE_FLOW_CONTROL_ON (2)
+
+
+#define AIO_FLOW_CONTROL_CHARACTERS (4)
+
+#define AIO_SET_DEADMAN_TIMER (5)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOGetExternalStatus function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_EXTSTA_RI (0x00000001)
+#define AIO_EXTSTA_DCD (0x00000008)
+#define AIO_EXTSTA_DSR (0x00000010)
+#define AIO_EXTSTA_CTS (0x00000020)
+#define AIO_EXTSTA_BREAK (0x00000080)
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOFlushBuffers function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_FLUSH_WRITE_BUFFER (0x0001)
+#define AIO_FLUSH_READ_BUFFER (0x0002)
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOReadStatus function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_RECEIVE_ACTIVE (0)
+#define AIO_RECEIVE_FULL (1)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOWriteStatus function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_TRANSMIT_IDLE (0)
+#define AIO_TRANSMIT_ACTIVE (1)
+#define AIO_TRANSMIT_XOFFED (2)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOAcquirePort function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+#define AIO_HARDWARE_TYPE_WILDCARD (-1)
+#define AIO_BOARD_NUMBER_WILDCARD (-1)
+#define AIO_PORT_NUMBER_WILDCARD (-1)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOConfigurePort function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+/* BitRate */
+
+#define AIO_BAUD_50 (0)
+#define AIO_BAUD_75 (1)
+#define AIO_BAUD_110 (2)
+#define AIO_BAUD_134p5 (3)
+#define AIO_BAUD_150 (4)
+#define AIO_BAUD_300 (5)
+#define AIO_BAUD_600 (6)
+#define AIO_BAUD_1200 (7)
+#define AIO_BAUD_1800 (8)
+#define AIO_BAUD_2000 (9)
+#define AIO_BAUD_2400 (10)
+#define AIO_BAUD_3600 (11)
+#define AIO_BAUD_4800 (12)
+#define AIO_BAUD_7200 (13)
+#define AIO_BAUD_9600 (14)
+#define AIO_BAUD_19200 (15)
+#define AIO_BAUD_38400 (16)
+#define AIO_BAUD_57600 (17)
+#define AIO_BAUD_115200 (18)
+
+/* DataBits */
+
+#define AIO_DATA_BITS_5 (0)
+#define AIO_DATA_BITS_6 (1)
+#define AIO_DATA_BITS_7 (2)
+#define AIO_DATA_BITS_8 (3)
+
+/* StopBits */
+
+#define AIO_STOP_BITS_1 (0)
+#define AIO_STOP_BITS_1p5 (1)
+#define AIO_STOP_BITS_2 (2)
+
+/* Parity */
+
+#define AIO_PARITY_NONE (0)
+#define AIO_PARITY_ODD (1)
+#define AIO_PARITY_EVEN (2)
+#define AIO_PARITY_MARK (3)
+#define AIO_PARITY_SPACE (4)
+
+/* FlowControl */
+
+#define AIO_SOFTWARE_FLOWCONTROL_OFF (0)
+#define AIO_SOFTWARE_FLOWCONTROL_ON (1)
+#define AIO_HARDWARE_FLOWCONTROL_OFF (0)
+#define AIO_HARDWARE_FLOWCONTROL_ON (2)
+
+#define AIO_DROPOUT_VALUE (0xFF)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with AIOPORTCAPABILITIES structure. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of capabilities data */
+ BYTE majorVersion;
+ BYTE minorVersion;
+ LONG notSupportedMask;
+ BYTE minBitRate; /* minimum bit rate index supported */
+ BYTE maxBitRate; /* maximum bit rate index supported */
+ BYTE minDataBits; /* minimum data bits per char index supported */
+ BYTE maxDataBits; /* maximum data bits per char index supported */
+ BYTE minStopBits; /* minimum stop bits per char index supported */
+ BYTE maxStopBits; /* maximum stop bits per char index supported */
+ BYTE minParityMode; /* minimum parity mode index supported */
+ BYTE maxParityMode; /* maximum parity mode index supported */
+ BYTE minFlowCtrlMode; /* minimum flow control mode index supported */
+ BYTE maxFlowCtrlMode; /* maximum flow control mode index supported */
+ LONG miscCapabilities; /* miscellaneous capability flags */
+ LONG minReadBufferSize; /* minimum length of receive buffer */
+ LONG maxReadBufferSize; /* maximum length of receive buffer */
+ LONG minWriteBufferSize; /* minimum length of transmit buffer */
+ LONG maxWriteBufferSize; /* maximum length of transmit buffer */
+ WORD minDeadmanTime; /* minimum deadman time (seconds) */
+ WORD maxDeadmanTime; /* maximum deadman time (seconds) */
+ } AIOPORTCAPABILITIES;
+
+#define AIO_PORT_NS_MINBITRATE (0x80000000)
+#define AIO_PORT_NS_MAXBITRATE (0x40000000)
+#define AIO_PORT_NS_MINDATABITS (0x20000000)
+#define AIO_PORT_NS_MAXDATABITS (0x10000000)
+#define AIO_PORT_NS_MINSTOPBITS (0x08000000)
+#define AIO_PORT_NS_MAXSTOPBITS (0x04000000)
+#define AIO_PORT_NS_MINPARITYMODE (0x02000000)
+#define AIO_PORT_NS_MAXPARITYMODE (0x01000000)
+#define AIO_PORT_NS_MINFLOWCTRLMODE (0x00800000)
+#define AIO_PORT_NS_MAXFLOWCTRLMODE (0x00400000)
+#define AIO_PORT_NS_MISCCAPABILITIES (0x00200000)
+#define AIO_PORT_NS_MINREADBUFFERSIZE (0x00100000)
+#define AIO_PORT_NS_MAXREADBUFFERSIZE (0x00080000)
+#define AIO_PORT_NS_MINWRITEBUFFERSIZE (0x00040000)
+#define AIO_PORT_NS_MAXWRITEBUFFERSIZE (0x00020000)
+#define AIO_PORT_NS_MINDEADMANTIME (0x00010000)
+#define AIO_PORT_NS_MAXDEADMANTIME (0x00008000)
+
+#define AIO_PORT_CAPS_NOT_SUPPORTED (0x00007FFF)
+#define AIO_PORT_CAPS_MAJOR_VERSION (1)
+#define AIO_PORT_CAPS_MINOR_VERSION (0)
+
+#define AIO_CAP_OUTPUT_BREAK (0x00000002)
+#define AIO_CAP_FLOWCTRLCHARS (0x00000004)
+#define AIO_CAP_PROGRAMMABLE (0x00000008)
+#define AIO_CAP_INPUT (0x00000010)
+#define AIO_CAP_OUTPUT (0x00000020)
+
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of driver capabilities structure */
+ BYTE byteData[2];
+ } AIODVRCAPABILITIES;
+
+#define AIO_NO_STRUCT_DATA_RETURNED (2)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOGetPortsRollCall function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of port info data */
+ BYTE majorVersion;
+ BYTE minorVersion;
+ LONG notSupportedMask;
+ int hardwareType; /* value used with AIOAcquirePort */
+ int boardNumber; /* " */
+ int portNumber; /* " */
+ WORD availability; /* availability of port for acquire */
+ LONG externalStatus; /* current external status value for port */
+ LONG chgdExternalStatus; /* changed external status value for port */
+ } AIOPORTINFO;
+
+#define AIO_INFO_NS_HARDWARETYPE (0x80000000)
+#define AIO_INFO_NS_BOARDNUMBER (0x40000000)
+#define AIO_INFO_NS_PORTNUMBER (0x20000000)
+#define AIO_INFO_NS_AVAILABILITY (0x10000000)
+#define AIO_INFO_NS_EXTERNALSTATUS (0x08000000)
+#define AIO_INFO_NS_CHGDEXTERNALSTATUS (0x04000000)
+
+#define AIO_PORT_INFO_NOT_SUPPORTED (0x03FFFFFF)
+#define AIO_PORT_INFO_MAJOR_VERSION (1)
+#define AIO_PORT_INFO_MINOR_VERSION (0)
+
+#define AIO_AVAILABLE_FOR_ACQUIRE (0)
+#define AIO_ALREADY_ACQUIRED (1)
+#define AIO_UNAVAILABLE (0xFF)
+
+#define AIO_INITIAL (0)
+#define AIO_SUCCESSOR (1)
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOGetPortConfiguration function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of port configuration data */
+ BYTE majorVersion;
+ BYTE minorVersion;
+ LONG notSupportedMask;
+ int hardwareType; /* value used with AIOAcquirePort */
+ int boardNumber; /* " */
+ int portNumber; /* " */
+ BYTE bitRate; /* Bits per second index */
+ BYTE dataBits; /* Bits per character index */
+ BYTE stopBits; /* Stop bits per char index */
+ BYTE parityMode; /* Generated parity index */
+ BYTE flowCtrlMode; /* Flow control mode */
+ BYTE breakMode; /* Break control mode */
+ LONG readSize; /* Receive buffer size */
+ LONG writeSize; /* Transmit buffer size */
+ BYTE transmitXon;
+ BYTE transmitXoff;
+ BYTE receiveXon;
+ BYTE receiveXoff;
+ WORD externalControl; /* set with AIO_EXTERNAL_CONTROL */
+
+ } AIOPORTCONFIG;
+
+#define AIO_CONFIG_NS_HARDWARETYPE (0x80000000)
+#define AIO_CONFIG_NS_BOARDNUMBER (0x40000000)
+#define AIO_CONFIG_NS_PORTNUMBER (0x20000000)
+#define AIO_CONFIG_NS_BITRATE (0x10000000)
+#define AIO_CONFIG_NS_DATABITS (0x08000000)
+#define AIO_CONFIG_NS_STOPBITS (0x04000000)
+#define AIO_CONFIG_NS_PARITYMODE (0x02000000)
+#define AIO_CONFIG_NS_FLOWCTRLMODE (0x01000000)
+#define AIO_CONFIG_NS_BREAKMODE (0x00800000)
+#define AIO_CONFIG_NS_READSIZE (0x00400000)
+#define AIO_CONFIG_NS_WRITESIZE (0x00200000)
+#define AIO_CONFIG_NS_TRANSMITXON (0x00100000)
+#define AIO_CONFIG_NS_TRANSMITXOFF (0x00080000)
+#define AIO_CONFIG_NS_RECEIVEXON (0x00040000)
+#define AIO_CONFIG_NS_RECEIVEXOFF (0x00020000)
+#define AIO_CONFIG_NS_EXTERNALCONTROL (0x00010000)
+
+#define AIO_PORT_CONFIG_NOT_SUPPORTED (0x0007FFFF)
+#define AIO_PORT_CONFIG_MAJOR_VERSION (1)
+#define AIO_PORT_CONFIG_MINOR_VERSION (0)
+
+#define AIO_EXTCTRL_DTR_ENABLE (1)
+#define AIO_EXTCTRL_DTR_DISABLE (0)
+#define AIO_EXTCTRL_RTS_ENABLE (2)
+#define AIO_EXTCTRL_RTS_DISABLE (0)
+
+#define AIO_BREAK_MODE_OFF (0)
+#define AIO_BREAK_MODE_ON (1)
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of driver config structure */
+ BYTE byteData[2];
+ } AIODVRCONFIG;
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with the AIOGetStatistics function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of port statistics structure */
+ BYTE majorVersion;
+ BYTE minorVersion;
+ LONG notSupportedMask;
+ LONG receiveBytes; /* total number of bytes received on port */
+ LONG transmitBytes; /* total number of bytes transmitted from port */
+ LONG parityErrors; /* number of receive parity errors */
+ LONG framingErrors; /* number of receive framing errors */
+ LONG overrunSoftware; /* number of software overruns (occurrences) */
+ LONG overrunHardware; /* number of hardware overruns (occurrences) */
+ } AIOPORTSTATISTICS;
+
+#define AIO_STATS_NS_RECEIVEBYTES (0x80000000)
+#define AIO_STATS_NS_TRANSMITBYTES (0x40000000)
+#define AIO_STATS_NS_PARITYERRORS (0x20000000)
+#define AIO_STATS_NS_FRAMINGERRORS (0x10000000)
+#define AIO_STATS_NS_OVERRUNSOFTWARE (0x08000000)
+#define AIO_STATS_NS_OVERRUNHARDWARE (0x04000000)
+
+#define AIO_PORT_STATS_NOT_SUPPORTED (0x03FFFFFF)
+#define AIO_PORT_STATS_MAJOR_VERSION (1)
+#define AIO_PORT_STATS_MINOR_VERSION (0)
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of driver statistics structure */
+ BYTE byteData[2];
+ } AIODVRSTATISTICS;
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with AIOGetDriverList function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ int hardwareType;
+ int ports;
+ char name[128];
+ } AIODRIVERLISTENTRY;
+
+typedef struct
+ {
+ WORD returnLength;
+ AIODRIVERLISTENTRY driver[1];
+ } AIODRIVERLIST;
+
+#define AIO_DRIVER_LIST_GET_FIRST (-1)
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with AIOGetBoardList function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ int boardNumber;
+ int ports;
+ char name[128];
+ } AIOBOARDLISTENTRY;
+
+typedef struct
+ {
+ WORD returnLength;
+ AIOBOARDLISTENTRY board[1];
+ } AIOBOARDLIST;
+
+#define AIO_BOARD_LIST_GET_FIRST (-1)
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with AIOSetControlData function. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ WORD returnLength; /* byte length of control data structure */
+ BYTE byteData[2];
+ } AIOCONTROLDATA;
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definitions for use with AIOGetFirstPortInfo and AIOGetNextPortInfo *
+ * *
+ *----------------------------------------------------------------------------*/
+
+typedef struct
+ {
+ int typeMask;
+ int boardMask;
+ int portMask;
+ int reserved[6];
+ } AIOPORTSEARCH;
+
+ /* reserved index values */
+
+#define SEARCH_TYPE_INDEX 0
+#define SEARCH_BOARD_INDEX 1
+#define SEARCH_PORT_INDEX 2
+
+
+/*----------------------------------------------------------------------------*
+ * *
+ * Definition of AIO functions. *
+ * *
+ *----------------------------------------------------------------------------*/
+
+extern int AIOAcquirePort ( int *hardwareType,
+ int *boardNumber,
+ int *portNumber,
+ int *portHandle
+ );
+
+extern int AIOAcquirePortWithRTag ( int *hardwareType,
+ int *boardNumber,
+ int *portNumber,
+ int *portHandle,
+ LONG RTag
+ );
+
+extern int AIOConfigurePort ( int portHandle,
+ BYTE bitRate,
+ BYTE dataBits,
+ BYTE stopBits,
+ BYTE parityMode,
+ BYTE flowCtrlMode
+ );
+
+extern int AIOFlushBuffers ( int portHandle,
+ WORD flushFlag
+ );
+
+extern int AIOGetBoardList( int hardwareType,
+ int boardIndex,
+ AIOBOARDLIST *pBoardList );
+
+extern int AIOGetDriverList ( int lastHardwareType,
+ AIODRIVERLIST *pDriverList
+ );
+
+extern int AIOGetExternalStatus ( int portHandle,
+ LONG *extStatus,
+ LONG *chgdExtStatus
+ );
+
+extern int AIOGetFirstPortInfo ( int hardwareType,
+ int boardNumber,
+ int portNumber,
+ AIOPORTSEARCH *portSearchP,
+ AIOPORTINFO *portInfoP,
+ AIOPORTCAPABILITIES *capabilitiesP,
+ AIODVRCAPABILITIES *dvrCapabilitiesP,
+ char *NLMModuleNameP );
+
+extern int AIOGetNextPortInfo ( AIOPORTSEARCH *portSearchP,
+ AIOPORTINFO *portInfoP,
+ AIOPORTCAPABILITIES *capabilitiesP,
+ AIODVRCAPABILITIES *dvrCapabilitiesP,
+ char *NLMModuleNameP );
+
+extern int AIOGetPortCapability ( int portHandle,
+ AIOPORTCAPABILITIES *pCapabilities,
+ AIODVRCAPABILITIES *pDvrCapabilities
+ );
+
+extern int AIOGetPortConfiguration ( int portHandle,
+ AIOPORTCONFIG *pPortConfig,
+ AIODVRCONFIG *pDvrConfig
+ );
+
+extern int AIOGetPortStatus ( int portHandle,
+ LONG *writeCount,
+ WORD *writeState,
+ LONG *readCount,
+ WORD *readState,
+ LONG *extStatus,
+ LONG *chgdExtStatus
+ );
+
+extern int AIOGetReadBufferSize ( int portHandle,
+ LONG *readSize
+ );
+
+extern int AIOGetPortStatistics ( int portHandle,
+ AIOPORTSTATISTICS *pPortStatistics,
+ AIODVRSTATISTICS *pDvrStatistics
+ );
+
+extern int AIOGetFirstPortStatistics( int hardwareType,
+ int boardNumber,
+ int portNumber,
+ AIOPORTSEARCH *portSearchP,
+ AIOPORTSTATISTICS *pPortStatistics,
+ AIODVRSTATISTICS *pDvrStatistics
+ );
+
+extern int AIOGetNextPortStatistics ( AIOPORTSEARCH *portSearchP,
+ AIOPORTSTATISTICS *pPortStatistics,
+ AIODVRSTATISTICS *pDvrStatistics
+ );
+
+extern int AIOGetWriteBufferSize ( int portHandle,
+ LONG *writeSize
+ );
+
+extern int AIOReadData ( int portHandle,
+ char *buffer,
+ LONG length,
+ LONG *numberBytesRead
+ );
+
+extern int AIOReadStatus ( int portHandle,
+ LONG *count,
+ WORD *state
+ );
+
+extern int AIOReleasePort ( int portHandle );
+
+extern int AIOSetControlData ( int portHandle,
+ int requestType,
+ AIOCONTROLDATA *requestStructValue
+ );
+
+extern int AIOSetExternalControl ( int portHandle,
+ int requestType,
+ int requestValue
+ );
+
+extern int AIOSetFlowControl ( int portHandle,
+ int flowCtrlMode
+ );
+
+extern int AIOSetFlowControlCharacters( int portHandle,
+ BYTE transmitXon,
+ BYTE transmitXoff,
+ BYTE receiveXon,
+ BYTE receiveXoff
+ );
+
+extern int AIOSetReadBufferSize ( int portHandle,
+ LONG bufferSize
+ );
+
+extern int AIOSetWriteBufferSize ( int portHandle,
+ LONG bufferSize
+ );
+
+extern int AIOWriteData ( int portHandle,
+ char *buffer,
+ LONG length,
+ LONG *numberBytesWritten
+ );
+
+extern int AIOWriteStatus ( int portHandle,
+ LONG *count,
+ WORD *state
+ );
+
--- /dev/null
+#include "alpha.h"
+
+/* Get the registers out of the frame information. */
+
+void
+frame_to_registers (frame, regs)
+ struct StackFrame *frame;
+ char *regs;
+{
+ mem2hex (&frame->ExceptionPC, ®s[PC_REGNUM * 8 * 2], 8 * 1, 0);
+
+ mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET], ®s[V0_REGNUM * 8 * 2], 8 * 64, 0);
+}
+
+/* Put the registers back into the frame information. */
+
+void
+registers_to_frame (regs, frame)
+ char *regs;
+ struct StackFrame *frame;
+{
+ hex2mem (®s[PC_REGNUM * 8 * 2], &frame->ExceptionPC, 8 * 1, 0);
+
+ hex2mem (®s[V0_REGNUM * 8 * 2], &frame->ExceptionRegs[SF_IREG_OFFSET], 8 * 64, 0);
+}
+
+union inst
+{
+ LONG l;
+
+ struct
+ {
+ union
+ {
+ struct
+ {
+ unsigned hint : 16;
+ unsigned rb : 5;
+ unsigned ra : 5;
+ unsigned opcode : 6;
+ } jump;
+ struct
+ {
+ signed disp : 21;
+ unsigned ra : 5;
+ unsigned opcode : 6;
+ } branch;
+ } variant;
+ } inst;
+};
+
+static LONG saved_inst;
+static LONG *saved_inst_pc = 0;
+static LONG saved_target_inst;
+static LONG *saved_target_inst_pc = 0;
+
+void
+set_step_traps (frame)
+ struct StackFrame *frame;
+{
+ union inst inst;
+ LONG *target;
+ int opcode;
+ int ra, rb;
+ LONG *pc = (LONG *)frame->ExceptionPC;
+
+ inst.l = *pc++;
+
+ opcode = inst.inst.variant.branch.opcode;
+
+ if ((opcode & 0x30) == 0x30) /* A branch of some sort */
+ target = inst.inst.variant.branch.disp + pc;
+ else if (opcode == 0x1a) /* jmp, ret, etc... */
+ target = (LONG *)(frame->ExceptionRegs[SF_IREG_OFFSET
+ + inst.inst.variant.jump.rb].lo
+ & ~3);
+ else
+ target = pc;
+
+ saved_inst = *pc;
+ *pc = 0x80; /* call_pal bpt */
+ saved_inst_pc = pc;
+
+ if (target != pc)
+ {
+ saved_target_inst = *target;
+ *target = 0x80; /* call_pal bpt */
+ saved_target_inst_pc = target;
+ }
+}
+
+/* Remove step breakpoints. Returns non-zero if pc was at a step breakpoint,
+ zero otherwise. This routine works even if there were no step breakpoints
+ set. */
+
+int
+clear_step_traps (frame)
+ struct StackFrame *frame;
+{
+ int retcode;
+ LONG *pc = (LONG *)frame->ExceptionPC;
+
+ if (saved_inst_pc == pc || saved_target_inst_pc == pc)
+ retcode = 1;
+ else
+ retcode = 0;
+
+ if (saved_inst_pc)
+ {
+ *saved_inst_pc = saved_inst;
+ saved_inst_pc = 0;
+ }
+
+ if (saved_target_inst_pc)
+ {
+ *saved_target_inst_pc = saved_target_inst;
+ saved_target_inst_pc = 0;
+ }
+
+ return retcode;
+}
+
+void
+do_status (ptr, frame)
+ char *ptr;
+ struct StackFrame *frame;
+{
+ int sigval;
+
+ sigval = computeSignal (frame->ExceptionNumber);
+
+ sprintf (ptr, "T%02x", sigval);
+ ptr += 3;
+
+ sprintf (ptr, "%02x:", PC_REGNUM);
+ ptr = mem2hex (&frame->ExceptionPC, ptr + 3, 8, 0);
+ *ptr++ = ';';
+
+ sprintf (ptr, "%02x:", SP_REGNUM);
+ ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + SP_REGNUM], ptr + 3, 8, 0);
+ *ptr++ = ';';
+
+ sprintf (ptr, "%02x:", RA_REGNUM);
+ ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + RA_REGNUM], ptr + 3, 8, 0);
+ *ptr++ = ';';
+
+ sprintf (ptr, "%02x:", FP_REGNUM);
+ ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + FP_REGNUM], ptr + 3, 8, 0);
+ *ptr++ = ';';
+
+ *ptr = '\000';
+}
--- /dev/null
+#include "alpha-patch.h"
+
+/* Register values. All of these values *MUST* agree with tm.h */
+#define RA_REGNUM 26 /* Contains return address value */
+#define SP_REGNUM 30 /* Contains address of top of stack */
+#define PC_REGNUM 64 /* Contains program counter */
+#define FP_REGNUM 65 /* Virtual frame pointer */
+#define V0_REGNUM 0 /* Function integer return value */
+#define NUM_REGS 66 /* Number of machine registers */
+#define REGISTER_BYTES (NUM_REGS * 8) /* Total size of registers array */
+
+#define ExceptionPC ExceptionRegs[SF_REG_PC].lo
+#define DECR_PC_AFTER_BREAK 0 /* NT's Palcode gets this right! */
+#define BREAKPOINT {0x80, 0, 0, 0} /* call_pal bpt */
+unsigned char breakpoint_insn;
+#define BREAKPOINT_SIZE 4
+
+/*#define flush_i_cache() asm("call_pal 0x86")*/
+
esac
-if [ ! -f ${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh ]; then
- echo '***' "GDB remote does not support host ${host}" 1>&2
- exit 1
-fi
-
-# We really shouldn't depend on there being a space after XM_FILE= ...
-hostfile=`awk '$1 == "XM_FILE=" { print $2 }' <${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh`
-
# per-target:
# Map target cpu into the config cpu subdirectory name.
ns32k-utek-*) gdb_target=umax ;;
pn-*-*) gdb_target=pn ;;
+powerpc-*-netware*) gdb_target=ppc-nw ;;
pyramid-*-*) gdb_target=pyramid ;;
z8k-*-sim) gdb_target=z8ksim ;;
esac
-if [ ! -f ${srcdir}/../config/${gdb_target_cpu}/${gdb_target}.mt ]; then
- echo '***' "GDB remote does not support target ${target}" 1>&2
+if [ ! -f ${srcdir}/../config/${gdb_target_cpu}/gdbserve.mt ]; then
+ echo '***' "GDBSERVE does not support target ${target}" 1>&2
exit 1
fi
if [ -z "${removing}" ] ; then
- cat ${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh ${srcdir}/../config/${gdb_target_cpu}/${gdb_target}.mt | awk '$1 == "#msg" {
+ cat ${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh ${srcdir}/../config/${gdb_target_cpu}/gdbserve.mt | awk '$1 == "#msg" {
print substr($0,6)}'
fi
-# We really shouldn't depend on there being a space after TM_FILE= ...
-targetfile=`awk '$1 == "TM_FILE=" { print $2 }' <${srcdir}/../config/${gdb_target_cpu}/${gdb_target}.mt`
+# We really shouldn't depend on there being a space after CPU_FILE= ...
+cpufile=`awk '$1 == "CPU_FILE=" { print $2 }' <${srcdir}/../config/${gdb_target_cpu}/gdbserve.mt`
-if [ "${target}" = "${host}" ] ; then
- nativefile=`awk '$1 == "NAT_FILE=" { print $2 }' <${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh`
-fi
-
-host_makefile_frag=../config/${gdb_host_cpu}/${gdb_host}.mh
-target_makefile_frag=../config/${gdb_target_cpu}/${gdb_target}.mt
+target_makefile_frag=../config/${gdb_target_cpu}/gdbserve.mt
# If hostfile (XM_FILE) and/or targetfile (TM_FILE) and/or nativefile
# (NAT_FILE) is not set in the ?config/* file, we don't make the
files=
links=
-rm -f xm.h
-if [ "${hostfile}" != "" ]; then
- if [ -f ${srcdir}/../config/${hostfile} ]; then
- files="${files} ../config/${hostfile}"
- else
- files="${files} ../config/${gdb_host_cpu}/${hostfile}"
- fi
- links="${links} xm.h"
-fi
-rm -f tm.h
-if [ "${targetfile}" != "" ]; then
- if [ -f ${srcdir}/../config/${targetfile} ]; then
- files="${files} ../config/${targetfile}"
- else
- files="${files} ../config/${gdb_target_cpu}/${targetfile}"
- fi
- links="${links} tm.h"
-fi
-rm -f nm.h
-if [ "${nativefile}" != "" ]; then
- if [ -f ${srcdir}/../config/${nativefile} ]; then
- files="${files} ../config/${nativefile}"
- else
- files="${files} ../config/${gdb_host_cpu}/${nativefile}"
- fi
- links="${links} nm.h"
-# temporary scaffolding until all hosts have the host/target/native
-# split in place.
-else
- files="${files} ../config/nm-trash.h"
- links="${links} nm.h"
-fi
-
-if [ ${target_cpu} = "sparclite" ]; then
- configdirs="${configdirs} sparclite"
-fi
-
-# post-target:
-
-if [ "${nativefile}" = "" ] ; then
- sed -e '/^NATDEPFILES= /s//# NATDEPFILES= /' \
- < Makefile > Makefile.tem
- mv -f Makefile.tem Makefile
+rm -f cpu.c
+if [ "${cpufile}" != "" ]; then
+ files="${files} ${cpufile}.c ${cpufile}.h"
+ links="${links} cpu.c cpu.h"
fi
--- /dev/null
+#include <nwtypes.h>
+#include <errno.h>
+#include <stdio.h>
+#include <aio.h>
+
+#define CONST const
+
+/* This file provides stubs and equivalent interfaces for all functions that
+ the debugger stub needs, but aren't yet implemented. */
+
+int
+AIOReadData (int portHandle, char *buffer, LONG length, LONG *numberBytesRead)
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOWriteData (int portHandle, char *buffer, LONG length,
+ LONG *numberBytesWritten)
+
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOAcquirePort (int *hardwareType, int *boardNumber, int *portNumber,
+ int *portHandle)
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOConfigurePort (int portHandle, BYTE bitRate, BYTE dataBits, BYTE stopBits,
+ BYTE parityMode, BYTE flowCtrlMode)
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOGetPortConfiguration (int portHandle, AIOPORTCONFIG *pPortConfig,
+ AIODVRCONFIG *pDvrConfig)
+{
+ fprintf (stderr, "AIOGetPortConfiguration stubbed out\n");
+ exit (1);
+}
+
+int
+AIOReleasePort (int portHandle)
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOSetExternalControl (int portHandle, int requestType, int requestValue)
+{
+ return AIO_SUCCESS;
+}
+
+int
+AIOGetExternalStatus (int portHandle, LONG *extStatus, LONG *chgdExtStatus)
+{
+ fprintf (stderr, "AIOGetExternalStatus stubbed out\n");
+ exit (1);
+}
+
+void
+StopBell ()
+{
+}
+
+int
+Breakpoint (int __arg)
+{
+ fprintf (stderr, "Breakpoint() stubbed out\n");
+ exit (1);
+}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-/*#include <ctype.h>*/
#include <time.h>
-/*#include <aio.h>*/
#include <nwconio.h>
#include <nwadv.h>
#include <nwdbgapi.h>
-/*#include <process.h>*/
#include <errno.h>
#include <nwthread.h>
-#include "alpha-patch.h"
+#include <aio.h>
+#include "cpu.h"
/****************************************************/
/* This information is from Novell. It is not in any of the standard
static const char hexchars[] = "0123456789abcdef";
-/* Register values. All of these values *MUST* agree with tm.h */
-#define RA_REGNUM 26 /* Contains return address value */
-#define SP_REGNUM 30 /* Contains address of top of stack */
-#define PC_REGNUM 64 /* Contains program counter */
-#define FP_REGNUM 65 /* Virtual frame pointer */
-#define V0_REGNUM 0 /* Function integer return value */
-#define NUM_REGS 66 /* Number of machine registers */
-#define REGISTER_BYTES (NUM_REGS * 8) /* Total size of registers array */
-
-#define ExceptionPC ExceptionRegs[SF_REG_PC].lo
-#define DECR_PC_AFTER_BREAK 0 /* NT's Palcode gets this right! */
-#define BREAKPOINT {0x80, 0, 0, 0} /* call_pal bpt */
-
unsigned char breakpoint_insn[] = BREAKPOINT;
-#define BREAKPOINT_SIZE (sizeof breakpoint_insn)
-
-/*#define flush_i_cache() asm("call_pal 0x86")*/
-static char *mem2hex (void *mem, char *buf, int count, int may_fault);
-static char *hex2mem (char *buf, void *mem, int count, int may_fault);
-static void set_step_traps (struct StackFrame *);
-static void clear_step_traps (struct StackFrame *);
+char *mem2hex (void *mem, char *buf, int count, int may_fault);
+char *hex2mem (char *buf, void *mem, int count, int may_fault);
+extern void set_step_traps (struct StackFrame *);
+extern void clear_step_traps (struct StackFrame *);
#if 0
__main() {};
return 1;
}
-/* Get the registers out of the frame information. */
-
-static void
-frame_to_registers (frame, regs)
- struct StackFrame *frame;
- char *regs;
-{
- mem2hex (&frame->ExceptionPC, ®s[PC_REGNUM * 8 * 2], 8 * 1, 0);
-
- mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET], ®s[V0_REGNUM * 8 * 2], 8 * 64, 0);
-}
-
-/* Put the registers back into the frame information. */
-
-static void
-registers_to_frame (regs, frame)
- char *regs;
- struct StackFrame *frame;
-{
- hex2mem (®s[PC_REGNUM * 8 * 2], &frame->ExceptionPC, 8 * 1, 0);
-
- hex2mem (®s[V0_REGNUM * 8 * 2], &frame->ExceptionRegs[SF_IREG_OFFSET], 8 * 64, 0);
-}
-
/* Turn a hex character into a number. */
static int
/* Indicate to caller of mem2hex or hex2mem that there has been an
error. */
-static volatile int mem_err = 0;
+volatile int mem_err = 0;
+#ifndef ALTERNATE_MEM_FUNCS
/* These are separate functions so that they are so short and sweet
that the compiler won't save any registers (if there is a fault
to mem_fault, they won't get restored, so there better not be any
{
*addr = val;
}
-
-/* This bit of assembly language just returns from a function. If a
- memory error occurs within get_char or set_char, the debugger
- handler points EIP at these instructions to get out. */
-
-extern void just_return ();
-#if 0
-asm (".globl just_return");
-asm (".globl _just_return");
-asm ("just_return:");
-asm ("_just_return:");
-asm ("leave");
-asm ("ret");
-#endif
+#endif /* ALTERNATE_MEM_FUNCS */
/* convert the memory pointed to by mem into hex, placing result in buf */
/* return a pointer to the last char put in buf (null) */
/* If MAY_FAULT is non-zero, then we should set mem_err in response to
a fault; if zero treat a fault like any other fault in the stub. */
-static char *
+char *
mem2hex (mem, buf, count, may_fault)
void *mem;
char *buf;
/* convert the hex array pointed to by buf into binary to be placed in mem */
/* return a pointer to the character AFTER the last byte written */
-static char *
+char *
hex2mem (buf, mem, count, may_fault)
char *buf;
void *mem;
/* This function takes the 386 exception vector and attempts to
translate this number into a unix compatible signal value. */
-static int
+int
computeSignal (exceptionVector)
int exceptionVector;
{
return (numChars);
}
-union inst
-{
- LONG l;
-
- struct
- {
- union
- {
- struct
- {
- unsigned hint : 16;
- unsigned rb : 5;
- unsigned ra : 5;
- unsigned opcode : 6;
- } jump;
- struct
- {
- signed disp : 21;
- unsigned ra : 5;
- unsigned opcode : 6;
- } branch;
- } variant;
- } inst;
-};
-
-static LONG saved_inst;
-static LONG *saved_inst_pc = 0;
-static LONG saved_target_inst;
-static LONG *saved_target_inst_pc = 0;
-
-static void
-set_step_traps (frame)
- struct StackFrame *frame;
-{
- union inst inst;
- LONG *target;
- int opcode;
- int ra, rb;
- LONG *pc = (LONG *)frame->ExceptionPC;
-
- inst.l = *pc++;
-
- opcode = inst.inst.variant.branch.opcode;
-
- if ((opcode & 0x30) == 0x30) /* A branch of some sort */
- target = inst.inst.variant.branch.disp + pc;
- else if (opcode == 0x1a) /* jmp, ret, etc... */
- target = (LONG *)(frame->ExceptionRegs[SF_IREG_OFFSET
- + inst.inst.variant.jump.rb].lo
- & ~3);
- else
- target = pc;
-
- saved_inst = *pc;
- *pc = 0x80; /* call_pal bpt */
- saved_inst_pc = pc;
-
- if (target != pc)
- {
- saved_target_inst = *target;
- *target = 0x80; /* call_pal bpt */
- saved_target_inst_pc = target;
- }
-}
-
-/* Remove step breakpoints. Returns non-zero if pc was at a step breakpoint,
- zero otherwise. This routine works even if there were no step breakpoints
- set. */
-
-static int
-clear_step_traps (frame)
- struct StackFrame *frame;
-{
- int retcode;
- LONG *pc = (LONG *)frame->ExceptionPC;
-
- if (saved_inst_pc == pc || saved_target_inst_pc == pc)
- retcode = 1;
- else
- retcode = 0;
-
- if (saved_inst_pc)
- {
- *saved_inst_pc = saved_inst;
- saved_inst_pc = 0;
- }
-
- if (saved_target_inst_pc)
- {
- *saved_target_inst_pc = saved_target_inst;
- saved_target_inst_pc = 0;
- }
-
- return retcode;
-}
-
-static void
-do_status (ptr, frame)
- char *ptr;
- struct StackFrame *frame;
-{
- int sigval;
-
- sigval = computeSignal (frame->ExceptionNumber);
-
- sprintf (ptr, "T%02x", sigval);
- ptr += 3;
-
- sprintf (ptr, "%02x:", PC_REGNUM);
- ptr = mem2hex (&frame->ExceptionPC, ptr + 3, 8, 0);
- *ptr++ = ';';
-
- sprintf (ptr, "%02x:", SP_REGNUM);
- ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + SP_REGNUM], ptr + 3, 8, 0);
- *ptr++ = ';';
-
- sprintf (ptr, "%02x:", RA_REGNUM);
- ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + RA_REGNUM], ptr + 3, 8, 0);
- *ptr++ = ';';
-
- sprintf (ptr, "%02x:", FP_REGNUM);
- ptr = mem2hex (&frame->ExceptionRegs[SF_IREG_OFFSET + FP_REGNUM], ptr + 3, 8, 0);
- *ptr++ = ';';
-
- *ptr = '\000';
-}
-
/* This function does all command processing for interfacing to gdb.
It is called whenever an exception occurs in the module being
debugged. */
version 1,2,0
#debug
screenname "System Console"
-input gdbserve
-output GDBSERVE.NLM
+input gdbserve.O
+output gdbserve.nlm
start _Prelude
exit _Stop
import
GetThreadID
KillMe
LoadModule
+ ReadByteAltDebugger
RegisterDebuggerRTag
ResumeThread
SuspendThread
UnRegisterDebugger
+ WriteByteAltDebugger
_GetCLibNLMLibHandle
_NWRegisterNLMLibraryUser
_SetupArgv
exit
fprintf
getcmd
+ memcmp
memcpy
memset
sprintf
strcmp
strcpy
strlen
+ strnicmp
--- /dev/null
+#include <nwdfs.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <nwconio.h>
+#include <nwadv.h>
+#include <nwdbgapi.h>
+#include <errno.h>
+#include <nwthread.h>
+#include "ppc.h"
+
+extern char *mem2hex (void *mem, char *buf, int count, int may_fault);
+extern char *hex2mem (char *buf, void *mem, int count, int may_fault);
+extern int computeSignal (int exceptionVector);
+
+void
+flush_i_cache (void)
+{
+}
+
+/* Get the registers out of the frame information. */
+
+void
+frame_to_registers (frame, regs)
+ struct StackFrame *frame;
+ char *regs;
+{
+ mem2hex (&frame->ExceptionState.CsavedRegs, ®s[GP0_REGNUM * 4 * 2], 4 * 32, 0);
+
+ mem2hex (&frame->ExceptionState.CSavedFPRegs, ®s[FP0_REGNUM * 4 * 2], 4 * 32, 0);
+
+ mem2hex (&frame->ExceptionPC, ®s[PC_REGNUM * 4 * 2], 4 * 1, 0);
+
+ mem2hex (&frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedSRR1, ®s[CR_REGNUM * 4 * 2], 4 * 1, 0);
+ mem2hex (&frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedLR, ®s[LR_REGNUM * 4 * 2], 4 * 1, 0);
+ mem2hex (&frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedCTR, ®s[CTR_REGNUM * 4 * 2], 4 * 1, 0);
+ mem2hex (&frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedXER, ®s[XER_REGNUM * 4 * 2], 4 * 1, 0);
+ mem2hex (&frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedMQ, ®s[MQ_REGNUM * 4 * 2], 4 * 1, 0);
+}
+
+/* Put the registers back into the frame information. */
+
+void
+registers_to_frame (regs, frame)
+ char *regs;
+ struct StackFrame *frame;
+{
+ hex2mem (®s[GP0_REGNUM * 4 * 2], &frame->ExceptionState.CsavedRegs, 4 * 32, 0);
+
+ hex2mem (®s[FP0_REGNUM * 4 * 2], &frame->ExceptionState.CSavedFPRegs, 4 * 32, 0);
+
+ hex2mem (®s[PC_REGNUM * 4 * 2], &frame->ExceptionPC, 4 * 1, 0);
+
+ hex2mem (®s[CR_REGNUM * 4 * 2], &frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedSRR1, 4 * 1, 0);
+ hex2mem (®s[LR_REGNUM * 4 * 2], &frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedLR, 4 * 1, 0);
+ hex2mem (®s[CTR_REGNUM * 4 * 2], &frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedCTR, 4 * 1, 0);
+ hex2mem (®s[XER_REGNUM * 4 * 2], &frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedXER, 4 * 1, 0);
+ hex2mem (®s[MQ_REGNUM * 4 * 2], &frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedMQ, 4 * 1, 0);
+}
+
+extern int ReadByteAltDebugger (char* addr, char *theByte);
+
+extern int WriteByteAltDebugger (char* addr, char theByte);
+
+extern volatile int mem_err;
+
+int
+get_char (addr)
+ char *addr;
+{
+ char c;
+
+ if (!ReadByteAltDebugger (addr, &c))
+ mem_err = 1;
+
+ return c;
+}
+
+void
+set_char (addr, val)
+ char *addr;
+ int val;
+{
+ if (!WriteByteAltDebugger (addr, val))
+ mem_err = 1;
+}
+
+int
+mem_write (dst, src, len)
+ char *dst, *src;
+ int len;
+{
+ while (len-- && !mem_err)
+ set_char (dst++, *src++);
+
+ return mem_err;
+}
+
+union inst
+{
+ LONG l;
+
+ struct
+ {
+ union
+ {
+ struct /* Unconditional branch */
+ {
+ unsigned opcode : 6; /* 18 */
+ signed li : 24;
+ unsigned aa : 1;
+ unsigned lk : 1;
+ } b;
+ struct /* Conditional branch */
+ {
+ unsigned opcode : 6; /* 16 */
+ unsigned bo : 5;
+ unsigned bi : 5;
+ signed bd : 14;
+ unsigned aa : 1;
+ unsigned lk : 1;
+ } bc;
+ struct /* Conditional branch to ctr or lr reg */
+ {
+ unsigned opcode : 6; /* 19 */
+ unsigned bo : 5;
+ unsigned bi : 5;
+ unsigned type : 15; /* 528 = ctr, 16 = lr */
+ unsigned lk : 1;
+ } bclr;
+ } variant;
+ } inst;
+};
+
+static LONG saved_inst;
+static char *saved_inst_pc = 0;
+static LONG saved_target_inst;
+static char *saved_target_inst_pc = 0;
+
+void
+set_step_traps (frame)
+ struct StackFrame *frame;
+{
+ union inst inst;
+ char *target;
+ int opcode;
+ int ra, rb;
+ char *pc = (char *)frame->ExceptionPC;
+
+ inst.l = *(LONG *)pc;
+
+ opcode = inst.inst.variant.b.opcode;
+
+ switch (opcode)
+ {
+ case 18: /* Unconditional branch */
+ target = (char *)(inst.inst.variant.b.li << 2);
+
+ if (!inst.inst.variant.b.aa) /* Relative? */
+ target += (long)pc;
+
+ break;
+ case 16: /* Conditional branch */
+ target = (char *)(inst.inst.variant.bc.bd << 2);
+
+ if (!inst.inst.variant.bc.aa) /* Relative? */
+ target += (long)pc;
+
+ break;
+ case 19: /* Cond. branch via ctr or lr reg */
+ switch (inst.inst.variant.bclr.type)
+ {
+ case 528: /* ctr */
+ target = (char *)frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedCTR;
+ break;
+ case 16: /* lr */
+ target = (char *)frame->ExceptionState.u.SpecialRegistersEnumerated.CsavedLR;
+ break;
+ default:
+ target = pc;
+ }
+ break;
+ default:
+ target = pc;
+ }
+
+ saved_inst = *(LONG *)pc;
+ mem_write (pc, breakpoint_insn, BREAKPOINT_SIZE);
+ saved_inst_pc = pc;
+
+ if (target != pc)
+ {
+ saved_target_inst = *(LONG *)target;
+ mem_write (target, breakpoint_insn, BREAKPOINT_SIZE);
+ saved_target_inst_pc = target;
+ }
+}
+
+/* Remove step breakpoints. Returns non-zero if pc was at a step breakpoint,
+ zero otherwise. This routine works even if there were no step breakpoints
+ set. */
+
+int
+clear_step_traps (frame)
+ struct StackFrame *frame;
+{
+ int retcode;
+ char *pc = (char *)frame->ExceptionPC;
+
+ if (saved_inst_pc == pc || saved_target_inst_pc == pc)
+ retcode = 1;
+ else
+ retcode = 0;
+
+ if (saved_inst_pc)
+ {
+ mem_write (saved_inst_pc, saved_inst, BREAKPOINT_SIZE);
+ saved_inst_pc = 0;
+ }
+
+ if (saved_target_inst_pc)
+ {
+ mem_write (saved_target_inst_pc, saved_target_inst, BREAKPOINT_SIZE);
+ saved_target_inst_pc = 0;
+ }
+
+ return retcode;
+}
+
+void
+do_status (ptr, frame)
+ char *ptr;
+ struct StackFrame *frame;
+{
+ int sigval;
+
+ sigval = computeSignal (frame->ExceptionNumber);
+
+ sprintf (ptr, "T%02x", sigval);
+ ptr += 3;
+
+ sprintf (ptr, "%02x:", PC_REGNUM);
+ ptr = mem2hex (&frame->ExceptionPC, ptr + 3, 4, 0);
+ *ptr++ = ';';
+
+ sprintf (ptr, "%02x:", SP_REGNUM);
+ ptr = mem2hex (&frame->ExceptionState.CsavedRegs[SP_REGNUM], ptr + 3, 4, 0);
+ *ptr++ = ';';
+
+ sprintf (ptr, "%02x:", LR_REGNUM);
+ ptr = mem2hex (&frame->ExceptionState.CsavedRegs[LR_REGNUM], ptr + 3, 4, 0);
+ *ptr++ = ';';
+
+ *ptr = '\000';
+}
+
+/*
+ * strtol : convert a string to long.
+ *
+ * Andy Wilson, 2-Oct-89.
+ */
+
+/* FIXME: It'd be nice to configure around these, but the include files are too
+ painful. These macros should at least be more portable than hardwired hex
+ constants. */
+
+#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */
+#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF */
+#define LONG_MIN ((long)(~LONG_MAX)) /* 0x80000000 */
+
+extern int errno;
+
+unsigned long strtoul(const char *s, char **ptr, int base);
+
+long
+strtol(s, ptr, base)
+ const char *s; char **ptr; int base;
+{
+ int minus=0;
+ unsigned long tmp;
+ const char *start=s;
+ char *eptr;
+
+ if (s==NULL)
+ {
+ errno = ERANGE;
+ if (!ptr)
+ *ptr = (char *)start;
+ return 0L;
+ }
+ while (isspace(*s))
+ s++;
+ if (*s == '-') {
+ s++;
+ minus = 1;
+ }
+ else if (*s == '+')
+ s++;
+
+ /*
+ * let strtoul do the hard work.
+ */
+ tmp = strtoul(s, &eptr, base);
+ if (ptr != NULL)
+ *ptr = (char *)((eptr==s) ? (char *)start : eptr);
+ if (tmp > (minus ? - (unsigned long) LONG_MIN : (unsigned long) LONG_MAX))
+ {
+ errno = ERANGE;
+ return (minus ? LONG_MIN : LONG_MAX);
+ }
+ return (minus ? (long) -tmp : (long) tmp);
+}
+
+/*
+ * strtol : convert a string to long.
+ *
+ * Andy Wilson, 2-Oct-89.
+ */
+
+#ifndef ULONG_MAX
+#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */
+#endif
+
+extern int errno;
+
+unsigned long
+strtoul(s, ptr, base)
+ const char *s; char **ptr; int base;
+{
+ unsigned long total = 0;
+ unsigned digit;
+ const char *start=s;
+ int did_conversion=0;
+ int overflow = 0;
+ int negate = 0;
+ unsigned long maxdiv, maxrem;
+
+ if (s==NULL)
+ {
+ errno = ERANGE;
+ if (!ptr)
+ *ptr = (char *)start;
+ return 0L;
+ }
+
+ while (isspace(*s))
+ s++;
+ if (*s == '+')
+ s++;
+ else if (*s == '-')
+ s++, negate = 1;
+ if (base==0 || base==16) /* the 'base==16' is for handling 0x */
+ {
+ int tmp;
+
+ /*
+ * try to infer base from the string
+ */
+ if (*s != '0')
+ tmp = 10; /* doesn't start with 0 - assume decimal */
+ else if (s[1] == 'X' || s[1] == 'x')
+ tmp = 16, s += 2; /* starts with 0x or 0X - hence hex */
+ else
+ tmp = 8; /* starts with 0 - hence octal */
+ if (base==0)
+ base = (int)tmp;
+ }
+
+ maxdiv = ULONG_MAX / base;
+ maxrem = ULONG_MAX % base;
+
+ while ((digit = *s) != '\0')
+ {
+ if (digit >= '0' && digit < ('0'+base))
+ digit -= '0';
+ else
+ if (base > 10)
+ {
+ if (digit >= 'a' && digit < ('a'+(base-10)))
+ digit = digit - 'a' + 10;
+ else if (digit >= 'A' && digit < ('A'+(base-10)))
+ digit = digit - 'A' + 10;
+ else
+ break;
+ }
+ else
+ break;
+ did_conversion = 1;
+ if (total > maxdiv
+ || (total == maxdiv && digit > maxrem))
+ overflow = 1;
+ total = (total * base) + digit;
+ s++;
+ }
+ if (overflow)
+ {
+ errno = ERANGE;
+ if (ptr != NULL)
+ *ptr = (char *)s;
+ return (ULONG_MAX);
+ }
+ if (ptr != NULL)
+ *ptr = (char *) ((did_conversion) ? (char *)s : (char *)start);
+ return negate ? -total : total;
+}
+
+void _exit (int foo) __attribute__ ((noreturn));
+
+void
+exit (int foo)
+{
+ _exit (foo);
+}
--- /dev/null
+typedef long Long;
+
+/* The following enum is used to access the special registers in
+ the saved machine state. */
+
+typedef enum
+{
+ kDc_SavedPC = 0, /* really SRR0 */
+ kDc_SavedMSR = 1, /* really SRR1 */
+ kDc_SavedCR = 2,
+ kDc_SavedLR = 3,
+ kDc_SavedDSISR = 4,
+ kDc_SavedDAR = 5,
+ kDc_SavedXER = 6,
+ kDc_SavedCTR = 7,
+ kDc_SavedSDR1 = 8,
+ kDc_SavedRTCU = 9,
+ kDc_SavedRTCL = 10,
+ kDc_SavedDEC = 11,
+ kDc_SavedSR00 = 12, /* The Segement Registers are consecutive */
+ kDc_SavedSR01 = 13, /* kDc_SavedSR00 + n is supported */
+ kDc_SavedSR02 = 14,
+ kDc_SavedSR03 = 15,
+ kDc_SavedSR04 = 16,
+ kDc_SavedSR05 = 17,
+ kDc_SavedSR06 = 18,
+ kDc_SavedSR07 = 19,
+ kDc_SavedSR08 = 20,
+ kDc_SavedSR09 = 21,
+ kDc_SavedSR10 = 22,
+ kDc_SavedSR11 = 23,
+ kDc_SavedSR12 = 24,
+ kDc_SavedSR13 = 25,
+ kDc_SavedSR14 = 26,
+ kDc_SavedSR15 = 27,
+ kDc_SavedFPSCR = 29,
+ kDc_SavedMQ = 30,
+ kDc_SavedBAT0U = 31,
+ kDc_SavedBAT0L = 32,
+ kDc_SavedBAT1U = 33,
+ kDc_SavedBAT1L = 34,
+ kDc_SavedBAT2U = 35,
+ kDc_SavedBAT2L = 36,
+ kDc_SavedBAT3U = 37,
+ kDc_SavedBAT3L = 38,
+
+ kNumberSpecialRegisters = 39
+} Dc_SavedRegisterName;
+
+/* Access to floating points is not very easy. This allows the number to be
+ accessed both as a floating number and as a pair of Longs. */
+
+typedef union
+{
+ double asfloat; /* access the variable as a floating number */
+ struct
+ {
+ Long high;
+ Long low;
+ }
+ asLONG; /* access the variable as two Longs */
+} FloatingPoints;
+
+/* The following is the standard record for Saving a machine state */
+
+struct SavedMachineState
+{
+ FloatingPoints CSavedFPRegs[32]; /* The floating point registers [0->31] */
+ /* ***32bit assumption*** */
+ Long CsavedRegs[32]; /* space to save the General Registers */
+ /* These are saved 0->31 */
+ Long CexReason;
+ Long SavedDomainID;
+ union
+ { /* must be 8-byte aligned, so doubleFPSCR is 8-byte aligned */
+ struct
+ {
+ Long CsavedSRR0; /* Index 0 - The saved PC */
+ Long CsavedSRR1; /* 1 saved MSR */
+ Long CsavedCR; /* 2 */
+ Long CsavedLR; /* 3 */
+ Long CsavedDSISR; /* 4 */
+ Long CsavedDAR; /* 5 */
+
+ Long CsavedXER; /* 6 */
+ Long CsavedCTR; /* 7 */
+ Long CsavedSDR1; /* 8 */
+ Long CsavedRTCU; /* 9 */
+ Long CsavedRTCL; /* 10 */
+ Long CsavedDEC; /* 11 */
+ Long CsavedSR0; /* 12 */
+ Long CsavedSR1; /* 13 */
+ Long CsavedSR2; /* 14 */
+ Long CsavedSR3; /* 15 */
+ Long CsavedSR4; /* 16 */
+ Long CsavedSR5; /* 17 */
+ Long CsavedSR6; /* 18 */
+ Long CsavedSR7; /* 19 */
+ Long CsavedSR8; /* 20 */
+ Long CsavedSR9; /* 21 */
+ Long CsavedSR10; /* 22 */
+ Long CsavedSR11; /* 23 */
+ Long CsavedSR12; /* 24 */
+ Long CsavedSR13; /* 25 */
+ Long CsavedSR14; /* 26 */
+ Long CsavedSR15; /* 27 */
+ /* CdoubleFPSCR must be double word aligned */
+ Long CdoubleFPSCR; /* 28 this is the upper part of the store and has
+ no meaning */
+ Long CsavedFPSCR; /* 29 */
+ Long CsavedMQ; /* 30 */
+ Long CsavedBAT0U; /* 31 */
+ Long CsavedBAT0L; /* 32 */
+ Long CsavedBAT1U; /* 33 */
+ Long CsavedBAT1L; /* 34 */
+ Long CsavedBAT2U; /* 35 */
+ Long CsavedBAT2L; /* 36 */
+ Long CsavedBAT3U; /* 37 */
+ Long CsavedBAT3L; /* 38 */
+ }
+ SpecialRegistersEnumerated;
+
+ Long SpecialRegistersIndexed[kNumberSpecialRegisters];
+ } u;
+
+ Long Padding[3]; /* Needed for quad-word alignment */
+};
+
+struct StackFrame
+{
+ LONG *ExceptionDomainID;
+ /*ProcessorStructure*/ int *ExceptionProcessorID;
+ BYTE *ExceptionDescription;
+ LONG ExceptionFlags;
+ LONG ExceptionErrorCode;
+ LONG ExceptionNumber;
+ struct SavedMachineState ExceptionState;
+};
+
+/* Register values. All of these values *MUST* agree with tm.h */
+#define GP0_REGNUM 0 /* GPR register 0 */
+#define SP_REGNUM 1 /* Contains address of top of stack */
+#define FP0_REGNUM 32 /* FPR (Floating point) register 0 */
+#define PC_REGNUM 64 /* Contains program counter */
+#define PS_REGNUM 65 /* Processor (or machine) status (%msr) */
+#define CR_REGNUM 66 /* Condition register */
+#define LR_REGNUM 67 /* Link register */
+#define CTR_REGNUM 68 /* Count register */
+#define XER_REGNUM 69 /* Fixed point exception registers */
+#define MQ_REGNUM 70 /* Multiply/quotient register */
+#define NUM_REGS 71 /* Number of machine registers */
+#define REGISTER_BYTES (420) /* Total size of registers array */
+
+#define ExceptionPC ExceptionState.u.SpecialRegistersEnumerated.CsavedSRR0
+#define DECR_PC_AFTER_BREAK 0 /* PPCs get this right! */
+#define BREAKPOINT {0x7d, 0x82, 0x10, 0x08}
+extern unsigned char breakpoint_insn[];
+#define BREAKPOINT_SIZE 4
+
+#define ALTERNATE_MEM_FUNCS /* We need our own get_char/set_char */
+
+extern int get_char (char *addr);
+extern void set_char (char *addr, int val);
==============================================================================
*/
#include <nwpre.h>
-#include "libhooks.h"
+/*#include "libhooks.h"*/
+#include <stddef.h>
+
+extern int main (int, char **);
static int NLMID;
&NLMID,
_cstart_);
- if (!rc)
- rc = _NWRegisterNLMLibraryUser(NLMID, _GetCLibNLMLibHandle());
-
return rc;
}