URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [insight/] [utils/] [amd-udi/] [mondfe/] [mini2udi.c] - Rev 1765
Compare with Previous | Blame | View Log
static char _[] = "@(#)mini2udi.c 5.23 93/08/18 13:48:08, Srini, AMD. "; /****************************************************************************** * Copyright 1991 Advanced Micro Devices, Inc. * * This software is the property of Advanced Micro Devices, Inc (AMD) which * specifically grants the user the right to modify, use and distribute this * software provided this notice is not removed or altered. All other rights * are reserved by AMD. * * AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS * SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL * DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR * USE OF THIS SOFTWARE. * * So that all may benefit from your experience, please report any problems * or suggestions about this software to the 29K Technical Support Center at * 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or * 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. * * Advanced Micro Devices, Inc. * 29K Support Products * Mail Stop 573 * 5900 E. Ben White Blvd. * Austin, TX 78741 * 800-292-9263 ***************************************************************************** * Engineer: Srini Subramanian. ***************************************************************************** * Definitions of the functions that define Minimon's Interface * to the UDI * interface The minimon functions are declared in miniint.h The UDI * functions are declared in udi/udiproc.h ***************************************************************************** */ #include <stdio.h> #ifdef MSDOS #include <io.h> #endif #include <string.h> #include "main.h" #include "memspcs.h" #include "macros.h" #include "miniint.h" #include "udiproc.h" #include "udiids.h" #include "udiext.h" #include "versions.h" /* Define BreakIdType here to avoid having to change at many places * every time it changes. */ typedef unsigned int BreakIdType; /* ABOUT UDI calls: * There are three types of return values: * < 0: means a TIP failure. * = 0: means success. * > 0: means a "local" failure. */ static UDISessionId SessionID; static char MONErrorMsg[MONErrorMsgSize]; static int GoForever=0; static char *udi_errmsg[] = { /* #define UDINoError 0 */ "UDIERR: No Error", /* #define UDIErrorNoSuchConfiguration 1 */ "UDIERR: No Such Configuration in Config File.", /* #define UDIErrorCantHappen 2 */ "UDIERR: Cannot Happen With Current Environment Setup.", /* #define UDIErrorCantConnect 3 */ "UDIERR: Cannot Connect to TIP Specified.", /* #define UDIErrorNoSuchConnection 4 */ "UDIERR: No Such Connection Found.", /* #define UDIErrorNoConnection 5 */ "UDIERR: No Connection Occurred.", /* #define UDIErrorCantOpenConfigFile 6 */ "UDIERR: Cannot Open UDI Config File.", /* #define UDIErrorCantStartTIP 7 */ "UDIERR: Cannot Start TIP In Current Environment Setup.", /* #define UDIErrorConnectionUnavailable 8 */ "UDIERR: Requested Connection Unavailable.", /* #define UDIErrorTryAnotherTIP 9 */ "UDIERR: Try Another TIP For Connection.", /* #define UDIErrorExecutableNotTIP 10 */ "UDIERR: TIP Specified in Config File Not An Executable.", /* #define UDIErrorInvalidTIPOption 11 */ "UDIERR: Connection Failed Due To Invalid TIP Options in Config File.", /* #define UDIErrorCantDisconnect 12 */ "UDIERR: Cannot Disconnect TIP", /* #define UDIErrorUnknownError 13 */ "UDIERR: Unknown Error Number Specified.", /* #define UDIErrorCantCreateProcess 14 */ "UDIERR: TIP Cannot Create a New Process.", /* #define UDIErrorNoSuchProcess 15 */ "UDIERR: No Such Process in the Current TIP.", /* #define UDIErrorUnknownResourceSpace 16 */ "UDIERR: Unknown Resource Space Encountered By TIP.", /* #define UDIErrorInvalidResource 17 */ "UDIERR: Invalid Resource Specified To TIP.", /* #define UDIErrorUnsupportedStepType 18 */ "UDIERR: Unsupported Step Type For This TIP Specified.", /* #define UDIErrorCantSetBreakpoint 19 */ "UDIERR: Could Not Set The Breakpoint.", /* #define UDIErrorTooManyBreakpoints 20 */ "UDIERR: Too Many Breakpoints Already In Use.", /* #define UDIErrorInvalidBreakId 21 */ "UDIERR: Breakpoint Does Not Exist For This BreakId.", /* #define UDIErrorNoMoreBreakIds 22 */ "UDIERR: No More Breakpoints. BreakId Too High.", /* #define UDIErrorUnsupportedService 23 */ "UDIERR: TIP Does Not Support The Requested Service.", /* #define UDIErrorTryAgain 24 */ "UDIERR: Error Occurred. Trying Again.", /* #define UDIErrorIPCLimitation 25 */ "UDIERR: IPC Limitation Exceeded.", /* #define UDIErrorIncomplete 26 */ "UDIERR: Service Incomplete.More Data Available.", /* #define UDIErrorAborted 27 */ "UDIERR: Aborted Requested Service.", /* #define UDIErrorTransDone 28 */ "UDIERR: Transaction Completed.", /* #define UDIErrorCantAccept 29 */ "UDIERR: Cannot Accept.", /* #define UDIErrorTransInputNeeded 30 */ "UDIERR: Transaction Input Needed.", /* #define UDIErrorTransModeX 31 */ "UDIERR: Transaction ModeX", /* #define UDIErrorInvalidSize 32 */ "UDIERR: Invalid Object Size Specified.", /* #define UDIErrorBadConfigFileEntry 33 */ "UDIERR: Bad Entry In UDI Config File Found.", /* #define UDIErrorIPCInternal 34 */ "UDIERR: Internal Error Occurred In IPC Layer." }; static UDIPId CurrentPID=(UDIPId) UDIProcessProcessor; static void PrintErrorMessage PARAMS((UDIError num)); static void udi_warning PARAMS((int num)); static CPUSpace xlate_mspace_mon2udi PARAMS((INT32 mspace)); static INT32 xlate_mspace_udi2mon PARAMS((CPUSpace mspace)); static UDIError FillString PARAMS(( UDIResource from, UDIHostMemPtr pattern, UDISizeT pattern_count, UDICount fill_count)); static UDIError FillWords PARAMS(( UDIResource from, UDIHostMemPtr pattern, UDISizeT pattern_count, UDICount fill_count)); INT32 /*********************************************Mini_TIP_init */ Mini_TIP_init(connect_string, mon_session_id) char *connect_string; int *mon_session_id; { UDIError UDIretval; UDISessionId session; /* First connect the target */ if ((UDIretval = UDIConnect(connect_string, &session)) <= TIPFAILURE) { SessionID = session; *mon_session_id = (int) session; PrintErrorMessage (UDIretval); return ((INT32) UDIretval); } else if (UDIretval == SUCCESS) { SessionID = session; *mon_session_id = (int) session; return (SUCCESS); } else { SessionID = session; *mon_session_id = (int) session; udi_warning(UDIretval); return((INT32) UDIretval); }; } INT32 Mini_TIP_Capabilities() { UDIError UDIretval; UDIUInt32 TIPId; /* Out */ UDIUInt32 TargetId; /* Out */ UDIUInt32 DFEId; /* In */ UDIUInt32 DFE; /* In */ UDIUInt32 TIP; /* Out */ UDIUInt32 DFEIPCId; /* Out */ UDIUInt32 TIPIPCId; /* Out */ char TIPString[80]; /* Out */ (void) strcpy (TIPString,""); DFEId = (UDIUInt32) UDIID (UDIProductCode_Mondfe, MONDFERev, MONDFESubRev, MONDFESubSubRev); DFE = (UDIUInt32) MONDFEUDIVers; if ((UDIretval = UDICapabilities ( &TIPId, &TargetId, DFEId, DFE, &TIP, &DFEIPCId, &TIPIPCId, &TIPString[0])) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { if (!QuietMode) { if (io_config.echo_mode == (INT32) TRUE) { fprintf(io_config.echo_file, "MiniMON29K Release 3.0\n"); fprintf(io_config.echo_file, ">AMD MONDFE Version: %d.%d.%d", (int) ((DFEId & 0x00000F00) >> 8), (int) ((DFEId & 0x000000F0) >> 4), (int) ((DFEId & 0x0000000F) >> 0)); fprintf(io_config.echo_file, "\tIPC Version: %d.%d.%d UDI Rev. %d.%d.%d <\n", (int) ((DFEIPCId & 0x00000F00) >> 8), (int) ((DFEIPCId & 0x000000F0) >> 4), (int) ((DFEIPCId & 0x0000000F) >> 0), (int) ((DFE & 0x00000F00) >> 8), (int) ((DFE & 0x000000F0) >> 4), (int) ((DFE & 0x0000000F) >> 0)); fprintf(io_config.echo_file, "%s\n", TIPString); fprintf(io_config.echo_file, ">TIP Version: %d.%d.%d", (int) ((TIPId & 0x00000F00) >> 8), (int) ((TIPId & 0x000000F0) >> 4), (int) ((TIPId & 0x0000000F) >> 0)); fprintf(io_config.echo_file, "\tIPC Version: %d.%d.%d UDI Rev. %d.%d.%d<\n", (int) ((TIPIPCId & 0x00000F00) >> 8), (int) ((TIPIPCId & 0x000000F0) >> 4), (int) ((TIPIPCId & 0x0000000F) >> 0), (int) ((TIP & 0x00000F00) >> 8), (int) ((TIP & 0x000000F0) >> 4), (int) ((TIP & 0x0000000F) >> 0)); } fprintf(stderr, "MiniMON29K Release 3.0\n"); fprintf(stderr, ">AMD MONDFE Version: %d.%d.%d", (int) ((DFEId & 0x00000F00) >> 8), (int) ((DFEId & 0x000000F0) >> 4), (int) ((DFEId & 0x0000000F) >> 0)); fprintf(stderr, "\tIPC Version: %d.%d.%d UDI Rev. %d.%d.%d <\n", (int) ((DFEIPCId & 0x00000F00) >> 8), (int) ((DFEIPCId & 0x000000F0) >> 4), (int) ((DFEIPCId & 0x0000000F) >> 0), (int) ((DFE & 0x00000F00) >> 8), (int) ((DFE & 0x000000F0) >> 4), (int) ((DFE & 0x0000000F) >> 0)); fprintf(stderr, "%s\n", TIPString); fprintf(stderr, ">TIP Version: %d.%d.%d", (int) ((TIPId & 0x00000F00) >> 8), (int) ((TIPId & 0x000000F0) >> 4), (int) ((TIPId & 0x0000000F) >> 0)); fprintf(stderr, "\tIPC Version: %d.%d.%d UDI Rev. %d.%d.%d<\n", (int) ((TIPIPCId & 0x00000F00) >> 8), (int) ((TIPIPCId & 0x000000F0) >> 4), (int) ((TIPIPCId & 0x0000000F) >> 0), (int) ((TIP & 0x00000F00) >> 8), (int) ((TIP & 0x000000F0) >> 4), (int) ((TIP & 0x0000000F) >> 0)); } if ( (int) ((TIPId & 0x00000F00) >> 8) < (int) ((DFEId & 0x00000F00) >> 8) ) { fprintf(stderr, "!!!!! WARNING: MONTIP's major version number is older than that of MONDFE's !!!!!\n"); fprintf(stderr, "!!!!! Please verify the versions and call AMD 29K Technical Support for assistance. !!!!!\n"); } if ((TIP == (UDIUInt32) 0) || ((TIP & 0xFFF) > (DFE & 0xFFF))) { fprintf(stderr, "UDI WARNING: UDI Versions NOT Compatible.\n"); } if (TIP == (UDIUInt32) 0) return (FAILURE); return (SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_TIP_CreateProc() { UDIError UDIretval; UDIPId pid; if ((UDIretval = UDICreateProcess(&pid)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { CurrentPID = pid; return (SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_TIP_disc() { UDIError UDIretval; if ((UDIretval = UDIDisconnect(SessionID, UDIContinueSession)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } INT32 Mini_TIP_SetCurrSession(sid) int sid; { UDIError UDIretval; if ((UDIretval = UDISetCurrentConnection((UDISessionId) sid)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { SessionID = (UDISessionId) sid; return (SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_TIP_SetPID(pid) int pid; { UDIError UDIretval; if ((UDIretval = UDISetCurrentProcess((UDIPId) pid)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return (SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_TIP_DestroyProc() { UDIError UDIretval; if ((UDIretval = UDIDestroyProcess(CurrentPID)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return (SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_TIP_exit() { UDIError UDIretval; if ((UDIretval = UDIDisconnect(SessionID, UDITerminateSession)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } /* Breakpoint routines */ /* Remove breakpoint */ INT32 /*******************************************Mini_bkpt_rm */ Mini_bkpt_rm(break_id) int break_id; { UDIError UDIretval; if ((UDIretval = UDIClearBreakpoint ((BreakIdType) break_id)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } /* Set Breakpoints */ INT32 /**********************************************Mini_bkpt_set */ Mini_bkpt_set(m_space, address, pass_count, type, break_id) INT32 m_space; ADDR32 address; INT32 pass_count; INT32 type; int *break_id; { UDIResource addr; UDIError UDIretval; addr.Space = xlate_mspace_mon2udi(m_space); addr.Offset = address; if (type == BKPT_29000) type = (UDIBreakType) UDIBreakFlagExecute; else if (type == BKPT_29050) type = (UDIBreakType) (MONBreakFlagHardware | UDIBreakFlagExecute); else if (type == BKPT_29050_BTE_0) type = (UDIBreakType) (MONBreakFlagHardware | UDIBreakFlagExecute); else if (type == BKPT_29050_BTE_1) type = (UDIBreakType) (MONBreakTranslationEnabled | MONBreakFlagHardware | UDIBreakFlagExecute); if ((UDIretval = UDISetBreakpoint(addr, (UDIInt32) pass_count, (UDIBreakType) type, (BreakIdType *) break_id)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } /* Query (get status) Breakpoints */ INT32 /**********************************************Mini_bkpt_stat */ Mini_bkpt_stat(break_id, address, m_space, pass_count, bkpt_type, current_cnt) int break_id; INT32 *m_space; ADDR32 *address; INT32 *pass_count; INT32 *bkpt_type; INT32 *current_cnt; { UDIError UDIretval; UDIResource addr; if ((UDIretval = UDIQueryBreakpoint ((BreakIdType) break_id, &addr, (UDIInt32 *)pass_count, (UDIBreakType *) bkpt_type, (UDIInt32 *) current_cnt)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { *address = addr.Offset; *m_space = xlate_mspace_udi2mon(addr.Space); if (*bkpt_type & MONBreakFlagHardware) *bkpt_type = BKPT_29050; return(SUCCESS); } else { if (UDIretval == UDIErrorNoMoreBreakIds) return ((INT32) MONBreakNoMore); else if (UDIretval == UDIErrorInvalidBreakId) return ((INT32) MONBreakInvalid); else { udi_warning(UDIretval); return(FAILURE); } }; } /* Kill Target */ INT32 /**********************************************Mini_break */ Mini_break() { UDIStop(); return (SUCCESS); } /* Obtain Target configuration and resynchronize with target */ UDIInt32 /**********************************************Mini_config_req */ Mini_config_req(target_config, versions) TARGET_CONFIG *target_config; VERSIONS_ETC *versions; { UDIError UDIretval; UDIMemoryRange DFEMemRange[MONMaxMemRanges]; UDIUInt32 ChipVersions[MONMaxChips]; UDIInt NumRanges, NumChips; UDIInt i; NumRanges = (UDIInt) MONMaxMemRanges; NumChips = (UDIInt) MONMaxChips; if ((UDIretval = UDIGetTargetConfig( (UDIMemoryRange *) &DFEMemRange[0], (UDIInt *) &NumRanges, /* 3 -> I, D, R */ (UDIUInt32 *) &ChipVersions[0], (UDIInt *) &NumChips)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if ((UDIretval == SUCCESS) || (UDIretval == UDIErrorIncomplete)) { if (UDIretval == UDIErrorIncomplete) { fprintf(stderr, "Ignoring: "); if (io_config.echo_mode == (INT32) TRUE) { fprintf(io_config.echo_file, "Ignoring: "); fflush (io_config.echo_file); } udi_warning(UDIretval); }; i = (UDIInt) 0; while ((i < (UDIInt) MONMaxMemRanges) && (i < NumRanges)) { switch ((int) DFEMemRange[i].Space) { case UDI29KDRAMSpace: target_config->D_mem_start = (ADDR32) DFEMemRange[i].Offset; target_config->D_mem_size = (INT32) DFEMemRange[i].Size; break; case UDI29KIROMSpace: target_config->ROM_start = (ADDR32) DFEMemRange[i].Offset; target_config->ROM_size = (INT32) DFEMemRange[i].Size; break; case UDI29KIRAMSpace: target_config->I_mem_start = (ADDR32) DFEMemRange[i].Offset; target_config->I_mem_size = (INT32) DFEMemRange[i].Size; break; default: /* don't care, so ignore it */ break; }; i = i + (UDIInt) 1; } /* end while */ i = (UDIInt) 0; while ((i < (UDIInt) MONMaxChips) && (i < NumChips)) { switch (i) { case 0: /* cpu */ target_config->processor_id = (UINT32) ChipVersions[i]; break; case 1: /* coprocessor */ target_config->coprocessor = (UINT32) ChipVersions[i]; if (target_config->coprocessor == (UINT32) UDI29KChipNotPresent) target_config->coprocessor = (UINT32) -1; /* MONDFE's */ break; default: /* ignore */ break; }; i = i + (UDIInt) 1; } /* end while */ return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } /* Copy memory and registers */ INT32 /**********************************************Mini_copy */ Mini_copy(src_space, src_addr, dst_space, dst_addr, byte_count, size, dir) INT32 src_space, dst_space; ADDR32 src_addr, dst_addr; INT32 byte_count; INT16 size; INT32 dir; { UDIError UDIretval; UDIResource from, to; UDICount count_done; from.Space = xlate_mspace_mon2udi(src_space); from.Offset = src_addr; to.Space = xlate_mspace_mon2udi(dst_space); to.Offset = dst_addr; if ((UDIretval = UDICopy (from, to, (UDICount) byte_count, (UDISizeT) size, &count_done, (UDIBool) dir)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } /* Fill memory and registers */ /* fill_count if greater than 4 should be a multiple of 4 */ INT32 /**********************************************Mini_fill */ Mini_fill(m_space, start, fill_count, pattern_count, pattern) INT32 m_space; ADDR32 start; INT32 fill_count, pattern_count; BYTE *pattern; { UDIBool host_endian; UDIResource from; UDICount count_done; UDIError UDIretval; host_endian = FALSE; from.Offset = start; from.Space = xlate_mspace_mon2udi (m_space); if (fill_count == (INT32) 1) { /* takes only one write */ if ((UDIretval = UDIWrite((UDIHostMemPtr) pattern, from, (UDICount) fill_count, (UDISizeT) pattern_count, /* a byte at a time */ (UDICount *) &count_done, host_endian)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } else { /* Handle arbitrary length strings to Data memory separately */ if ((pattern_count > (INT32) 4) && ((int) (pattern_count % 4) != (int) 0)){ if (from.Space != UDI29KDRAMSpace) return (FAILURE); return((INT32) FillString(from, (UDIHostMemPtr) pattern, (UDISizeT) pattern_count, (UDICount) fill_count)); } else { return((INT32) FillWords(from, (UDIHostMemPtr) pattern, (UDISizeT) pattern_count, (UDICount) fill_count)); } }; } /* Initiate a wait and get target status */ INT32 /**********************************************Mini_get_target_stats */ Mini_get_target_stats(maxtime, target_status) INT32 maxtime; INT32 *target_status; { UDIPId pid; UDIError UDIretval; UDIInt32 udiwait_code; if (maxtime == (INT32) -1) { udiwait_code = (UDIInt32) UDIWaitForever; } else { udiwait_code = (UDIInt32) maxtime; }; if ((UDIretval = UDIWait ((UDIInt32) udiwait_code, &pid, (UDIUInt32 *) target_status)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (SUCCESS); /* considered non-fatal */ } else if (UDIretval == SUCCESS) { CurrentPID = (UDIPId) pid; /* useful when reconnecting */ return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } INT32 /**********************************************Mini_go */ Mini_go() { UDIError UDIretval; if ((UDIretval = UDIExecute()) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } INT32 /**********************************************Mini_init */ Mini_init(txt_start, txt_end, dat_start, dat_end, entry_point, m_stack, r_stack, arg_string) ADDR32 txt_start, txt_end, dat_start, dat_end; ADDR32 entry_point; INT32 m_stack, r_stack; char *arg_string; { UDIMemoryRange ProcessMemory[MONMaxProcessMemRanges]; UDIInt NumRanges; UDIResource Entry; CPUSizeT StackSizes[MONMaxStacks]; UDIInt NumStacks; UDIError UDIretval; NumRanges = (UDIInt) MONMaxProcessMemRanges; NumStacks = (UDIInt) MONMaxStacks; ProcessMemory[0].Space = (CPUSpace) UDI29KIRAMSpace; ProcessMemory[0].Offset = (CPUOffset) txt_start; ProcessMemory[0].Size = (CPUSizeT) (txt_end - txt_start); ProcessMemory[1].Space = (CPUSpace) UDI29KDRAMSpace; ProcessMemory[1].Offset = (CPUOffset) dat_start; ProcessMemory[1].Size = (CPUSizeT) (dat_end - dat_start); Entry.Offset = entry_point; Entry.Space = xlate_mspace_mon2udi((INT32) I_MEM); StackSizes[0] = (CPUSizeT) r_stack; StackSizes[1] = (CPUSizeT) m_stack; if ((UDIretval = UDIInitializeProcess (&ProcessMemory[0], (UDIInt) NumRanges, Entry, &StackSizes[0], (UDIInt) NumStacks, arg_string)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } /* Read memory or registers from target */ INT32 /**********************************************Mini_read_req */ Mini_read_req(m_space, address, byte_count, size, count_done, buffer, host_endian) INT32 m_space; ADDR32 address; INT32 byte_count; INT16 size; INT32 host_endian; INT32 *count_done; BYTE *buffer; { UDIError UDIretval; UDIResource from; from.Space = xlate_mspace_mon2udi(m_space); from.Offset = address; if ((UDIretval = UDIRead (from, (UDIHostMemPtr) buffer, (UDICount) byte_count, (UDISizeT) size, (UDICount *) count_done, (UDIBool) host_endian)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } /* * Reset target processor */ INT32 /**********************************************Mini_reset_processor */ Mini_reset_processor() { UDIMemoryRange ProcessMemory[MONMaxProcessMemRanges]; UDIInt NumRanges; UDIResource Entry; CPUSizeT StackSizes[MONMaxStacks]; UDIInt NumStacks; UDIError UDIretval; UDIPId CurrentPID; UDIUInt32 StopReason; NumRanges = (UDIInt) MONMaxProcessMemRanges; NumStacks = (UDIInt) MONMaxStacks; ProcessMemory[0].Space = (CPUSpace) UDI29KIRAMSpace; ProcessMemory[0].Offset = (CPUOffset) 0; ProcessMemory[0].Size = (CPUSizeT) 0; ProcessMemory[0].Space = (CPUSpace) UDI29KIRAMSpace; ProcessMemory[0].Offset = (CPUOffset) 0; ProcessMemory[0].Size = (CPUSizeT) 0; Entry.Offset = 0; Entry.Space = xlate_mspace_mon2udi((INT32) I_MEM); StackSizes[0] = (CPUSizeT) 0; StackSizes[1] = (CPUSizeT) 0; if ((UDIretval = UDIWait((UDIInt32) 0, &CurrentPID, &StopReason)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval != SUCCESS) { udi_warning(UDIretval); return(FAILURE); }; /* set PID to ProcProcessor */ if (( UDIretval = UDISetCurrentProcess((UDIPId) UDIProcessProcessor)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval != SUCCESS) { udi_warning(UDIretval); return(FAILURE); }; /* Successful */ /* call InitializeProcess. Paramters ignored. */ if ((UDIretval = UDIInitializeProcess (&ProcessMemory[0], (UDIInt) NumRanges, Entry, &StackSizes[0], (UDIInt) NumStacks, (char *) 0)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval != SUCCESS) { udi_warning(UDIretval); return(FAILURE); }; /* Successful */ if (( UDIretval = UDISetCurrentProcess((UDIPId) CurrentPID)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval != SUCCESS) { udi_warning(UDIretval); return(FAILURE); }; return (SUCCESS); } /* Write memory or registers to target */ INT32 /**********************************************Mini_write_req */ Mini_write_req(m_space, address, byte_count, size, count_done, buffer, host_endian) INT32 m_space; ADDR32 address; INT32 byte_count; INT16 size; INT32 *count_done; BYTE *buffer; INT32 host_endian; { UDIError UDIretval; UDIResource to; to.Space = xlate_mspace_mon2udi(m_space); to.Offset = address; if ((UDIretval = UDIWrite((UDIHostMemPtr) buffer, to, (UDICount) byte_count, (UDISizeT) size, (UDICount *) count_done, (UDIBool) host_endian)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return(FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 Mini_stdin_mode_x(mode) INT32 *mode; { UDIError UDIretval; if ((UDIretval = UDIStdinMode ((UDIMode *) mode)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } INT32 /**********************************************Mini_put_stdin */ Mini_put_stdin(buffer, bufsize, count) char *buffer; INT32 bufsize; INT32 *count; { UDIError UDIretval; if ((UDIretval = UDIPutStdin ((UDIHostMemPtr) buffer, (UDISizeT) bufsize, (UDISizeT *) count)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } /* Put characters to stdout */ INT32 /**********************************************Mini_get_stdout */ Mini_get_stdout(buffer, bufsize, count_done) char *buffer; INT32 *count_done; INT32 bufsize; { UDIError UDIretval; if ((UDIretval = UDIGetStdout ((UDIHostMemPtr) buffer, (UDISizeT) bufsize, (UDISizeT *) count_done)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } INT32 /**********************************************Mini_get_stderr */ Mini_get_stderr(buffer, bufsize, count_done) char *buffer; INT32 *count_done; INT32 bufsize; { UDIError UDIretval; if ((UDIretval = UDIGetStderr ((UDIHostMemPtr) buffer, (UDISizeT) bufsize, (UDISizeT *) count_done)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } } /* Step instructions */ INT32 /**********************************************Mini_step */ Mini_step(count) INT32 count; { UDIError UDIretval; UDIRange dummy_range; UDIStepType step_type; dummy_range.Low = 0; dummy_range.High = 0xffffffff; step_type = UDIStepNatural; if ((UDIretval = UDIStep((UDIUInt32) count, step_type, dummy_range)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } INT32 /***************************************************** Mini_put_trans */ Mini_put_trans(buffer) char *buffer; { UDIError UDIretval; UDISizeT count; UDISizeT *count_done; count = (UDISizeT) (strlen (buffer) + 1); if ((UDIretval = UDIPutTrans((UDIHostMemPtr) buffer, (UDISizeT) count, (UDISizeT *) count_done)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } static CPUSpace xlate_mspace_mon2udi(m_space) INT32 m_space; { switch(m_space) { case LOCAL_REG: return((CPUSpace) UDI29KLocalRegs); case ABSOLUTE_REG: return((CPUSpace) UDI29KGlobalRegs); case GLOBAL_REG: return((CPUSpace) UDI29KGlobalRegs); case SPECIAL_REG: return((CPUSpace) UDI29KSpecialRegs); case TLB_REG: return((CPUSpace) UDI29KTLBRegs); case COPROC_REG: return((CPUSpace) UDI29KAm29027Regs); case I_MEM: return((CPUSpace) UDI29KIRAMSpace); case D_MEM: return((CPUSpace) UDI29KDRAMSpace); case I_ROM: return((CPUSpace) UDI29KIROMSpace); case D_ROM: return((CPUSpace) UDI29KDRAMSpace); case I_O: return((CPUSpace) UDI29KIOSpace); case I_CACHE: return((CPUSpace) UDI29KICacheSpace); case D_CACHE: return((CPUSpace) UDI29KDCacheSpace); case PC_SPACE: return((CPUSpace) UDI29KPC); case A_SPCL_REG: return((CPUSpace) UDI29KSpecialRegs); case GENERIC_SPACE: return ((CPUSpace) UDI29KDRAMSpace); case VERSION_SPACE: return ((CPUSpace) VERSION_SPACE); default: return((CPUSpace) FAILURE); }; } static INT32 xlate_mspace_udi2mon(mspace) CPUSpace mspace; { switch(mspace) { case UDI29KDRAMSpace: return((INT32) D_MEM); case UDI29KIOSpace: return((INT32) I_O); case UDI29KCPSpace0: return((INT32) FAILURE); case UDI29KCPSpace1: return((INT32) FAILURE); case UDI29KIROMSpace: return((INT32) I_ROM); case UDI29KIRAMSpace: return((INT32) I_MEM); case UDI29KLocalRegs: return((INT32) LOCAL_REG); case UDI29KGlobalRegs: return((INT32) GLOBAL_REG); case UDI29KRealRegs: return((INT32) GLOBAL_REG); case UDI29KSpecialRegs: return((INT32) SPECIAL_REG); case UDI29KTLBRegs: return((INT32) TLB_REG); case UDI29KACCRegs: return((INT32) FAILURE); case UDI29KICacheSpace: return((INT32) I_CACHE); case UDI29KAm29027Regs: return((INT32) COPROC_REG); case UDI29KPC: return((INT32) PC_SPACE); case UDI29KDCacheSpace: return((INT32) D_CACHE); default: return(FAILURE); }; } static void udi_warning(num) int num; { fprintf(stderr, "UDIERROR: %d : %s\n", num, udi_errmsg[num]); fflush(stderr); if (io_config.echo_mode == (INT32) TRUE) { fprintf(io_config.echo_file, "UDIERROR: %d :%s\n", num, udi_errmsg[num]); fflush (io_config.echo_file); } } static void PrintErrorMessage(UDIretval) UDIError UDIretval; { UDISizeT ErrorMsgCnt; fprintf(stderr, "TIPERROR: %d :", UDIretval); fflush(stderr); if (io_config.echo_mode == (INT32) TRUE) { fprintf(io_config.echo_file, "TIPERROR: %d :", UDIretval); fflush(io_config.echo_file); } ErrorMsgCnt = (UDISizeT) 0; do { if (UDIGetErrorMsg(UDIretval, (UDISizeT) MONErrorMsgSize, MONErrorMsg, &ErrorMsgCnt) != UDINoError) { fprintf(stderr, "TIPERROR: Could not get TIP error message.\n"); fflush(stderr); return; } write (fileno(stderr), &MONErrorMsg[0], (int) ErrorMsgCnt); if (io_config.echo_mode == (INT32) TRUE) write (fileno(io_config.echo_file), &MONErrorMsg[0], (int) ErrorMsgCnt); } while (ErrorMsgCnt == (UDISizeT) MONErrorMsgSize); fprintf(stderr, "\n"); if (io_config.echo_mode == (INT32) TRUE) { fprintf(io_config.echo_file, "\n"); fflush(io_config.echo_file); } return; } static UDIError FillWords(from, pattern, pattern_count, fill_count) UDIResource from; UDIHostMemPtr pattern; UDISizeT pattern_count; UDICount fill_count; { UDICount count_done; UDIBool host_endian, direction; UDIError UDIretval; UDIResource to; INT32 isregspace = ISREG(xlate_mspace_udi2mon(from.Space)); host_endian = FALSE; if ((UDIretval = UDIWrite((UDIHostMemPtr) pattern, from, (UDICount) 1, (UDISizeT) pattern_count, (UDICount *) &count_done, host_endian)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { /* do copy */ fill_count = fill_count - 1; /* one less */ if (fill_count > (INT32) 0) { /* do copy */ if (isregspace) to.Offset = from.Offset + (pattern_count/4); else to.Offset = from.Offset + pattern_count; to.Space = from.Space; /* already translated */ direction = TRUE; /* front to back */ if (pattern_count > (INT32) 4) { /* is a multiple of 4 also */ fill_count = (INT32) (fill_count * (pattern_count/4)); pattern_count = (INT32) 4; }; if ((UDIretval = UDICopy (from, to, fill_count, (UDISizeT) pattern_count, (UDICount *) &count_done, direction)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } }; /* return if no more to copy */ return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; } static UDIError FillString(from, pattern, pattern_count, fill_count) UDIResource from; UDIHostMemPtr pattern; UDISizeT pattern_count; UDICount fill_count; { UDICount count_done; UDIBool host_endian, direction; UDIError UDIretval; UDIResource to; host_endian = FALSE; if ((UDIretval = UDIWrite((UDIHostMemPtr) pattern, from, (UDICount) pattern_count, (UDISizeT) 1, (UDICount *) &count_done, host_endian)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { /* do copy */ fill_count = fill_count - 1; /* one less */ if (fill_count > (INT32) 0) { /* do copy */ to.Offset = from.Offset + pattern_count; to.Space = from.Space; direction = TRUE; /* front to back */ if ((UDIretval = UDICopy (from, to, (UDICount) (fill_count*pattern_count), (UDISizeT) 1, (UDICount *) &count_done, direction)) <= TIPFAILURE) { PrintErrorMessage (UDIretval); return (FAILURE); } else if (UDIretval == SUCCESS) { return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); } }; /* return if no more to copy */ return(SUCCESS); } else { udi_warning(UDIretval); return(FAILURE); }; }