⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bkpt.c

📁 gdb是linux下的一个远程调试环境.能让你很方便地调试linux下的代码.
💻 C
字号:
static char _[] = " @(#)bkpt.c	5.20 93/07/30 16:38:20, 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. ***************************************************************************** **       This module contains the functions used to provide breakpointing **	  capability. ***************************************************************************** */#include <stdio.h>#include <ctype.h>#include "memspcs.h"#include "main.h"#include "monitor.h"#include "miniint.h"#include "error.h"#ifdef	MSDOS#include <stdlib.h>#include <string.h>#else#include <strings.h>#endif/*** Definitions*/int   get_addr_29k_m PARAMS((char *, struct addr_29k_t *, INT32));int   addr_29k_ok PARAMS((struct addr_29k_t *));int   get_word PARAMS((char *, INT32 *));int   get_word_decimal PARAMS((char *, INT32 *));INT32   clear_table PARAMS((void));INT32   clear_bkpt PARAMS((struct addr_29k_t));INT32   show_table PARAMS((void));INT32   set_bkpt PARAMS((struct addr_29k_t,			 INT32, 			 INT32));INT32 match_entry PARAMS((ADDR32 offset,			  INT32 space,			  int *id));INT32 remove_from_table PARAMS((int id));INT32 add_to_table PARAMS((ADDR32 offset, 			   INT32 space,			   INT32 passcnt,			   INT32 bktype,			   int id));extern	struct	bkpt_t	*bkpt_table;/*** The function below is used in manipulating breakpoints.** This function is called in the main command loop parser** of the monitor.  The parameters passed to this function** are:**** token - This is an array of pointers to strings.  Each string**         referenced by this array is a "token" of the user's**         input, translated to lower case.**** token_count - This is the number of tokens in "token".***/INT32bkpt_cmd(token, token_count)   char   *token[];   int     token_count;   {   INT32    result;   struct addr_29k_t addr_29k;   INT32  pass_count;   INT32  bkpt_type;   /*   ** Clear breakpoint(s)   */   if (strcmp(token[0], "bc") == 0) {      if (token_count == 1) {         result = clear_table();         return (result);         }      else      /* Clear a specific breakpoints */      if (token_count == 2) {         result = get_addr_29k_m(token[1], &addr_29k, I_MEM);         if (result != 0)            return (result);         result = addr_29k_ok(&addr_29k);         if (result != 0)            return (result);	 if (addr_29k.memory_space == (INT32) GENERIC_SPACE)	    addr_29k.memory_space = (INT32) I_MEM;         result = clear_bkpt(addr_29k);         return (result);         }      else  /* token_count != 1 or 2 */         return (EMSYNTAX);      }   else   /*   ** Set breakpoint(s)   */   if ((strcmp(token[0], "b") == 0) ||       (strcmp(token[0], "b050p") == 0) ||       (strcmp(token[0], "b050v") == 0) ||       (strcmp(token[0], "b050") == 0)) { /* b050 defaults to b050p */      if (strcmp(token[0], "b") == 0)         bkpt_type = BKPT_29000;      else      if (strcmp(token[0], "b050p") == 0)         bkpt_type = BKPT_29050_BTE_0;	/* translation disabled */      else      if (strcmp(token[0], "b050v") == 0)         bkpt_type = BKPT_29050_BTE_1;      else      if (strcmp(token[0], "b050") == 0)         bkpt_type = BKPT_29050_BTE_0;	/* translation disabled */      else         return (EMSYNTAX);      if (token_count == 1) {         result = show_table();         return (result);         }      else      /* Set breakpoint with pass count of 1 */      if (token_count == 2) {         result = get_addr_29k_m(token[1], &addr_29k, I_MEM);         if (result != 0)            return (result);         result = addr_29k_ok(&addr_29k);         if (result != 0)            return (result);         /* The TIP checks the memory space for acceptance */	 if (addr_29k.memory_space == (INT32) GENERIC_SPACE)	    addr_29k.memory_space = (INT32) I_MEM;         result = set_bkpt(addr_29k, (INT32) 1, bkpt_type);         return (result);         }      else      /* Set breakpoint with pass count */      if (token_count == 3) {         result = get_addr_29k_m(token[1], &addr_29k, I_MEM);         if (result != 0)            return (result);         result = addr_29k_ok(&addr_29k);         if (result != 0)            return (result);         result = get_word_decimal(token[2], &pass_count);         if (result != 0)            return (EMSYNTAX);	 if (addr_29k.memory_space == (INT32) GENERIC_SPACE)	    addr_29k.memory_space = (INT32) I_MEM;         result = set_bkpt(addr_29k, pass_count, bkpt_type);         return (result);         }      else  /* too many parms for set breakpoint */      return (EMSYNTAX);      }   else /* not a proper 'b" command */      return (EMSYNTAX);   }  /* end bkpt_cmd() *//*** Functions used by bkpt_cmd()*//*** This function is used to remove a breakpoint from the** target and from the host breakpoint table.*/INT32clear_bkpt(addr_29k)   struct addr_29k_t  addr_29k;{   int	breakid;   INT32	retval;   (void) match_entry (addr_29k.address, 		       addr_29k.memory_space,		       &breakid);   /* Did we find the breakpoint? */   if (breakid <= (int) 0) {      warning (EMBKPTRM);      return (FAILURE);   };   /* if a valid breakpoint entry is found */   if ((retval = Mini_bkpt_rm (breakid))  != SUCCESS) {      return(FAILURE);   } else if (retval == SUCCESS) {      /* remove breakpoint from table */      if (remove_from_table(breakid) != SUCCESS) {	 /* this shouldn't occur */	 return(FAILURE);      };      return(SUCCESS);   };}  /* end clear_bkpt() *//*** This function is used to set a breakpoint on the** target and in the host breakpoint table.*/INT32set_bkpt(addr_29k, pass_count, bkpt_type)   struct   addr_29k_t addr_29k;   INT32    pass_count;   INT32    bkpt_type;   {   INT32	retval;   int	breakid;   /* is there one already at the same place */   (void) match_entry(addr_29k.address, 		      addr_29k.memory_space,		      &breakid);   if (breakid > (int) 0) {      warning (EMBKPTUSED);      return (FAILURE);   };   /* else set the breakpoint */   breakid = (int) 0;   if ((retval = Mini_bkpt_set (addr_29k.memory_space,				addr_29k.address,				pass_count,				bkpt_type,				&breakid)) != SUCCESS) {       return(FAILURE);   } else  {      /* Add breakpoint to table */      if (breakid > (int) 0) { /* double checking */	 return (add_to_table(addr_29k.address,		      addr_29k.memory_space,		      pass_count,		      bkpt_type,		      breakid));      };      return(FAILURE);   };}  /* end set_bkpt() */INT32add_to_table(offset, space, passcnt, bktype, id )ADDR32	offset;INT32	space;INT32	passcnt;INT32	bktype;int	id;{  struct   bkpt_t  *temp, *temp2;  if ((temp = (struct bkpt_t *) malloc (sizeof(struct bkpt_t))) == NULL) {     return(EMALLOC);  } else {    temp->break_id = id;    temp->memory_space =  space;    temp->address = offset;    temp->pass_count = passcnt;    temp->curr_count = passcnt;    temp->bkpt_type = bktype;    temp->next = NULL;  };  if (bkpt_table == NULL) { /* first element */     bkpt_table = temp;  } else { /* add at end */     temp2 = bkpt_table;     while (temp2->next != NULL)       temp2 = temp2->next;     temp2->next = temp;   /* add */  }  return(SUCCESS);}INT32match_entry(offset, space, id)ADDR32	offset;INT32	space;int	*id;{  struct  bkpt_t  *temp;  if (bkpt_table == NULL) { /* empty, so no match */    *id = (int) 0;    return(SUCCESS);  } else {    temp = bkpt_table;    if ((temp->address == offset) && 		     (temp->memory_space == space)) { /* match */       *id = temp->break_id;       return(SUCCESS);    } else {       while (temp->next != NULL) {	  if ((temp->next->address == offset) && 	      (temp->next->memory_space == space)) {	     *id = temp->next->break_id;	     return(SUCCESS);	  } else {	     temp = temp->next;	  };       }       *id = (int) 0;       return(SUCCESS);    };  };}INT32remove_from_table(id)int   id;{  struct  bkpt_t  *temp;  if (bkpt_table == NULL) { /* empty table */     return(FAILURE);  } else {     temp = bkpt_table;     if (bkpt_table->break_id == id) { /* remove first element */	bkpt_table = bkpt_table->next;	return(SUCCESS);     } else {	while (temp->next != NULL) {	  if (temp->next->break_id == id) {	     temp->next = temp->next->next;	     return(SUCCESS);	  } else {	     temp = temp->next;	  };	}	return(FAILURE);     };  }}INT32clear_table(){  struct bkpt_t  *tmp;  INT32	retval;  if (bkpt_table == NULL) { /* no entries */    fprintf(stderr, "no breakpoints in use.\n");    if (io_config.echo_mode == (INT32) TRUE)       fprintf(io_config.echo_file, "no breakpoints in use.\n");  } else {     while (bkpt_table) {        if ((retval = Mini_bkpt_rm (bkpt_table->break_id))  != SUCCESS) {           return(FAILURE);        } else if (retval == SUCCESS) {           /* remove breakpoint from table */	   tmp = bkpt_table;           bkpt_table = bkpt_table->next;	   (void) free ((char *) tmp);        };     };  }  return(SUCCESS);}INT32show_table(){  struct  bkpt_t  *temp;   INT32	retval;   ADDR32	temp_addr;   INT32	temp_space;   INT32	curr_count;   INT32	temp_passcnt, temp_bktype;   int		i;  if (bkpt_table == NULL) { /* no entries */  } else {    do {       temp = bkpt_table;       bkpt_table = bkpt_table->next;       (void) free ((char *) temp);    } while (bkpt_table != NULL);  };  for (i = 1;1;i++) {     retval = Mini_bkpt_stat( i,			      &temp_addr,			      &temp_space,			      &temp_passcnt,			      &temp_bktype,			      &curr_count);     if ((retval == (INT32) MONBreakInvalid) ||         (retval == (INT32) FAILURE)) {	continue;     } else if (retval == (INT32) MONBreakNoMore) {	return (SUCCESS);     } else {	 /* add entry in the table */	 if ((retval = add_to_table ((ADDR32) temp_addr,		       		(INT32) temp_space,		       		(INT32) temp_passcnt,		       		(INT32) temp_bktype,		       		i)) != SUCCESS)		return (retval);         /* Mark Am29050 breakpoints with a '*' */         if (temp_bktype == BKPT_29050)             fprintf(stderr, "*");         else             fprintf(stderr, " ");         fprintf(stderr, "(%#05d: %#08lx[%#02d])\n", i, 			       temp_addr, 			       temp_passcnt);	 if (io_config.echo_mode == (INT32) TRUE)  {             if (temp_bktype == BKPT_29050)                 fprintf(io_config.echo_file, "*");             else                fprintf(io_config.echo_file, " ");             fprintf(io_config.echo_file, "(%#05d: %#08lx[%#02d])\n", i, 				       temp_addr, 				       temp_passcnt);	 }     };  }  return(SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -