亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? generic-stub.c

?? 開放源碼實(shí)時(shí)操作系統(tǒng)源碼.
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
            val.bytes[0] = *hexMemSrc;
        }
        if (__mem_fault)
            return;

        for (i = 0;  i < len;  i++) {
            ch = val.bytes[i];
            *(hexMemDst++) = hexchars[(ch >> 4) & 0xf];
            if (__mem_fault)
                return;
            *(hexMemDst++) = hexchars[ch & 0xf];
            if (__mem_fault)
                return;
        }
        hexMemCount -= len;
        hexMemSrc += len;
    }
}

/* Convert the memory pointed to by MEM into HEX, placing result in BUF.
 * Return a pointer to the last char put in buf (NUL). In case of a memory
 * fault, return 0.
 * If MAY_FAULT is non-zero, then we will handle memory faults by returning
 * a 0 (and assume that MEM is a pointer into the user program), else we 
 * treat a fault like any other fault in the stub (and assume that MEM is
 * a pointer into the stub's memory).
 */

char *
__mem2hex (mem, buf, count, may_fault)
     char *mem;
     char *buf;
     int count;
     int may_fault;
{
  hexMemDst      = (unsigned char *) buf;
  hexMemSrc      = (unsigned char *) mem;
  hexMemCount    = count;
  may_fault_mode = may_fault;
#ifdef TARGET_HAS_HARVARD_MEMORY
  progMem = 0;
#endif
  
  if (may_fault)
    {
      if (__set_mem_fault_trap (__mem2hex_helper))
        return 0;
    }
  else
    __mem2hex_helper ();

  *hexMemDst = 0;

  return (char *) hexMemDst;
}

/* Convert the target memory identified by MEM into HEX, placing result in BUF.
 * Return a pointer to the last char put in buf (NUL). In case of a memory
 * fault, return 0.
 */

static char *
__mem2hex_safe (target_addr_t mem, char *buf, int count)
{
  hexMemDst      = (unsigned char *) buf;
  hexMemSrc      = (unsigned char *) TARGET_ADDR_TO_PTR(mem);
  hexMemCount    = count;
  may_fault_mode = 1;
#ifdef TARGET_HAS_HARVARD_MEMORY
  progMem = TARGET_ADDR_IS_PROGMEM(mem);
#endif
  
  if (__set_mem_fault_trap (__mem2hex_helper))
    return 0;

  *hexMemDst = 0;

  return (char *) hexMemDst;
}



static void
__hex2mem_helper (void)
{
    union {
        unsigned long  long_val;
        unsigned char  bytes[sizeof(long)];
    } val;
    int len, i;
    unsigned char ch = '\0';

    __mem_fault = 0;
    while (hexMemCount > 0 && *hexMemSrc) {
        if (may_fault_mode) {
            if ((hexMemCount >= sizeof(long)) &&
                (((target_register_t)hexMemDst & (sizeof(long)-1)) == 0)) {
                len = sizeof(long);
            } else if ((hexMemCount >= sizeof(short)) &&
                       (((target_register_t)hexMemDst & (sizeof(short)-1)) == 0)) {
                len = sizeof(short);
            } else {
                len = 1;
            }
        } else {
            len = 1;
        }

        for (i = 0;  i < len;  i++) {
            // Check for short data?
            ch = stubhex (*(hexMemSrc++)) << 4;
            if (__mem_fault)
                return;
            ch |= stubhex (*(hexMemSrc++));
            if (__mem_fault)
                return;
            val.bytes[i] = ch;
        }

        if (may_fault_mode) {
#ifdef TARGET_HAS_HARVARD_MEMORY
	    if (progMem)
		__write_progmem_safe (&val.bytes[0], hexMemDst, len);
	    else
#endif
            __write_mem_safe (&val.bytes[0], hexMemDst, len);
        } else
            *hexMemDst = ch;

        if (__mem_fault)
            return;
        hexMemCount -= len;
        hexMemDst += len;
    }
}

/* Convert COUNT bytes of 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.

   If MAY_FAULT is set, we will return a non-zero value if a memory
   fault occurs (and we assume that MEM is a pointer into the user
   program). Otherwise, we will take a trap just like any other memory
   fault (and assume that MEM points into the stub's memory). */

char *
__hex2mem (buf, mem, count, may_fault)
     char *buf;
     char *mem;
     int count;
     int may_fault;
{
  hexMemSrc      = (unsigned char *) buf;
  hexMemDst      = (unsigned char *) mem;
  hexMemCount    = count;
  may_fault_mode = may_fault;
#ifdef TARGET_HAS_HARVARD_MEMORY
  progMem = 0;
#endif

  if (may_fault)
    {
      if (__set_mem_fault_trap (__hex2mem_helper))
        return 0;
    }
  else
    __hex2mem_helper ();

  return (char *) hexMemDst;
}

/* Convert COUNT bytes of the hex array pointed to by BUF into binary
   to be placed in target MEM.  Return a pointer to the character AFTER
   the last byte written.
*/
char *
__hex2mem_safe (char *buf, target_addr_t mem, int count)
{
  hexMemSrc      = (unsigned char *) buf;
  hexMemDst      = (unsigned char *) TARGET_ADDR_TO_PTR(mem);
  hexMemCount    = count;
  may_fault_mode = 1;
#ifdef TARGET_HAS_HARVARD_MEMORY
  progMem = TARGET_ADDR_IS_PROGMEM(mem);
#endif

  if (__set_mem_fault_trap (__hex2mem_helper))
    return 0;

  return (char *) hexMemDst;
}


void
set_debug_traps (void)
{
  __install_traps ();
  initialized = 1;    /* FIXME: Change this to dbg_stub_initialized */
}

/*
 * While we find nice hex chars, build an int.
 * Return number of chars processed.
 */

unsigned int
__hexToInt (char **ptr, target_register_t *intValue)
{
  int numChars = 0;
  int hexValue;

  *intValue = 0;

  while (**ptr)
    {
      hexValue = stubhex (**ptr);
      if (hexValue < 0)
        break;

      *intValue = (*intValue << 4) | hexValue;
      numChars ++;

      (*ptr)++;
    }

  return (numChars);
}

/*
 * While we find nice hex chars, build a target memory address.
 * Return number of chars processed.
 */

unsigned int
__hexToAddr (char **ptr, target_addr_t *val)
{
  int numChars = 0;
  int hexValue;

  *val = 0;

  while (**ptr)
    {
      hexValue = stubhex (**ptr);
      if (hexValue < 0)
        break;

      *val = (*val << 4) | hexValue;
      numChars ++;

      (*ptr)++;
    }

  return (numChars);
}


/* 
 * Complement of __hexToInt: take an int of size "numBits", 
 * convert it to a hex string.  Return length of (unterminated) output.
 */

unsigned int
__intToHex (char *ptr, target_register_t intValue, int numBits)
{
  int numChars = 0;

  if (intValue == 0)
    {
      *(ptr++) = '0';
      *(ptr++) = '0';
      return 2;
    }

  numBits = (numBits + 7) / 8;
  while (numBits)
    {
      int v = (intValue >> ((numBits - 1) * 8));
      if (v || (numBits == 1))
        {
          v = v & 255;
          *(ptr++) = __tohex ((v / 16) & 15);
          *(ptr++) = __tohex (v & 15);
          numChars += 2;
        }
      numBits--;
    }

  return (numChars);
}

#if DEBUG_THREADS 
/*
 * Kernel Thread Control
 *
 * If the current thread is set to other than zero (or minus one),
 * then ask the kernel to lock it's scheduler so that only that thread
 * can run.
 */

static unsigned char did_lock_scheduler = 0;
static unsigned char did_disable_interrupts = 0;

/* Pointer to "kernel call" for scheduler control */
static int (*schedlock_fn) (int, int, long) = stub_lock_scheduler;

/* Pointer to target stub call for disabling interrupts.
   Target stub will initialize this if it can.  */
int (*__disable_interrupts_hook) (int); /* don't initialize here! */
#endif

static void
lock_thread_scheduler (int kind)        /* "step" or "continue" */
{
#if DEBUG_THREADS 
  int ret = 0;

  /* GDB will signal its desire to run a single thread
     by setting _gdb_cont_thread to non-zero / non-negative.  */
  if (_gdb_cont_thread <= 0)
    return;

  if (schedlock_fn)                     /* kernel call */
    ret = (*schedlock_fn) (1, kind, _gdb_cont_thread);

  if (ret == 1)
    {
      did_lock_scheduler = 1;
      return;
    }

  if (schedlock_fn == 0 ||              /* no kernel scheduler call */
      ret == -1)                        /* kernel asks stub to handle it */
    if (__disable_interrupts_hook)      /* target stub has capability */
      if ((*__disable_interrupts_hook) (1))
        {
          did_disable_interrupts = 1;
          return;
        }
#endif /* DEBUG_THREADS */
}

static void
unlock_thread_scheduler ()
{
#if DEBUG_THREADS
  if (did_lock_scheduler)
    if (schedlock_fn)                   /* kernel call */
      {
        (*schedlock_fn) (0, 0, _gdb_cont_thread);
        /* I could check the return value, but 
           what would I do if it failed???  */
        did_lock_scheduler = 0;
      }
  if (did_disable_interrupts)
    if (__disable_interrupts_hook)      /* target stub call */
      {
        (*__disable_interrupts_hook) (0);
        /* Again, I could check the return value, but 
           what would I do if it failed???  */
        did_disable_interrupts = 0;
      }
#endif /* DEBUG_THREADS */
}

#ifdef CYGPKG_CYGMON
int processing_breakpoint_function = 0;
#endif

void
__handle_exception (void)
{
  int sigval = 0;

#ifdef TARGET_HAS_NEXT_STEP
  if (! __next_step_done ())
    {
      __clear_breakpoints ();
      __install_breakpoints ();
      __single_step ();
      return;
    }
#endif

#ifdef __ECOS__
  // We need to unpack the registers before they are accessed.
  if (__cleanup_vec != NULL)
    __cleanup_vec ();

#if defined(CYGSEM_REDBOOT_BSP_SYSCALLS)
  // Temporary support for gnupro bsp SWIs
  if (__is_bsp_syscall())
  {
      sigval = hal_syscall_handler();
      if (sigval <= 0)
      {
	  if (sigval < 0)
	      __process_exit_vec ();

	  if (__init_vec != NULL)
              __init_vec ();
	  return;
      }
  }
#endif

#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
  // Special case for GDB BREAKs. This flag is set by cyg_stub_cleanup.
  if (cyg_hal_gdb_break) {
      cyg_hal_gdb_break = 0;
      sigval = SIGINT;
  }
#endif
   
  // Only compute sigval if it wasn't already computed (in
  // hal_syscall_handler or as a result of a GDB async break)
  if (0 == sigval)
      sigval = __computeSignal (__get_trap_number ());

#else  // __ECOS__
  /* reply to host that an exception has occurred */
  sigval = __computeSignal (__get_trap_number ());
#endif // __ECOS__

  if (__is_breakpoint_function ())
  {
#ifdef CYGPKG_CYGMON
    processing_breakpoint_function = 1;
#endif
    __skipinst ();
  } else {
#ifdef CYGPKG_CYGMON
    processing_breakpoint_function = 0;
#endif
  }

#ifndef __ECOS__
  if (__cleanup_vec != NULL)
    __cleanup_vec ();
#endif // !__ECOS__

  __clear_breakpoints (); 

  /* Undo effect of previous single step.  */
  unlock_thread_scheduler ();
  __clear_single_step ();

#ifdef __ECOS__
      /* Need to flush the data and instruction cache here, as we may have
         removed a breakpoint in __single_step - and we may be sharing
         some code with the application! */

        __data_cache (CACHE_FLUSH) ;
        __instruction_cache (CACHE_FLUSH) ;
#endif

#ifdef SIGSYSCALL
  if (sigval == SIGSYSCALL)
    {
      int val;
      /* Do the skipinst FIRST. */
#ifndef SYSCALL_PC_AFTER_INST
      __skipinst ();
#endif
      val =  __process_syscall_vec (__get_syscall_num ());
      if (val < 0)
        sigval = -val;
      else
        sigval = 0;
    }

#endif

  /* Indirect function call to stub, cygmon monitor or other */
  if (sigval != 0)
    {
      while (__process_exception_vec (sigval))
        {
          /* Empty! */
        }
    }

  __install_breakpoints ();

  if (__init_vec != NULL)
    __init_vec ();
}

/*
 * _get_trace_register_hook:
 * This function pointer will be non-zero if the trace component
 * wants to intercept requests for register values.
 * 
 * FIXME: evidently I need a new hook for large registers...
 */

int   (*_get_trace_register_hook) (regnames_t, target_register_t *);

void
stub_format_registers(char *packet, char *ptr)
{
    int regnum;
    int sr = 0, er = NUMREGS_GDB;

    if (packet[0] == 'p')
      {
	 target_register_t regno;
         char *p = &packet[1];
	 if (__hexToInt (&p, &regno))
	   {
	     sr = regno;
	     er = regno + 1;
	   }
	 else
	   {

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合在线第一页| 日韩经典中文字幕一区| 欧美日韩国产三级| 国产高清在线观看免费不卡| 亚洲高清免费观看| 久久久高清一区二区三区| 在线观看日韩av先锋影音电影院| 激情欧美一区二区三区在线观看| 亚洲一区中文日韩| 欧美韩国日本综合| 欧美一区二区精品在线| 欧美影片第一页| www.综合网.com| 国产毛片精品一区| 麻豆精品久久精品色综合| 亚洲午夜精品网| 亚洲蜜桃精久久久久久久| 国产精品久久久久婷婷| 久久久久久久久久久久久女国产乱| 欧美日本韩国一区二区三区视频| 91在线视频在线| 暴力调教一区二区三区| 高清在线成人网| 国产精品1024久久| 精品一区二区成人精品| 青青草视频一区| 石原莉奈在线亚洲二区| 亚洲一区二区在线观看视频| 亚洲美女免费视频| 亚洲黄色录像片| 亚洲欧美另类在线| 亚洲丝袜另类动漫二区| 亚洲天堂2014| 一区二区三区四区亚洲| 一区二区在线免费观看| 亚洲激情自拍视频| 亚洲一区二区三区小说| 亚洲午夜激情av| 午夜日韩在线电影| 视频在线观看一区| 捆绑调教一区二区三区| 久久精品国产秦先生| 国产一区二区三区日韩 | ...av二区三区久久精品| 欧美激情在线免费观看| 国产精品网友自拍| 国产精品视频一二三| 亚洲欧洲精品成人久久奇米网| 欧美激情一区二区三区四区| 国产精品乱码妇女bbbb| 综合久久久久久久| 久久99精品国产91久久来源| 国产一区二区三区不卡在线观看| 国产精品资源在线看| 成人av影院在线| 一本色道亚洲精品aⅴ| 欧美午夜一区二区三区| 538在线一区二区精品国产| 精品国产免费视频| 欧美韩国日本不卡| 亚洲综合男人的天堂| 日韩电影在线免费观看| 国产自产高清不卡| 92国产精品观看| 日韩一级大片在线观看| 久久精品亚洲乱码伦伦中文| 国产精品―色哟哟| 午夜精品一区二区三区免费视频| 久久精品免费观看| 97成人超碰视| 欧美精品色一区二区三区| 久久综合久久99| 亚洲激情图片qvod| 久久97超碰国产精品超碰| 成人免费高清视频| 欧美人伦禁忌dvd放荡欲情| 久久综合九色欧美综合狠狠| 亚洲日本在线观看| 美国十次综合导航| 99久久伊人精品| 欧美一级二级三级蜜桃| 中文字幕乱码久久午夜不卡| 亚洲综合久久久| 国产一区二区久久| 欧美色成人综合| 国产三区在线成人av| 亚洲 欧美综合在线网络| 国产成人精品三级麻豆| 91精品麻豆日日躁夜夜躁| 亚洲国产成人午夜在线一区| 三级影片在线观看欧美日韩一区二区 | 一区二区三区蜜桃| 国内久久婷婷综合| 在线视频国产一区| 香蕉成人啪国产精品视频综合网| 粉嫩一区二区三区在线看| 欧美精品v日韩精品v韩国精品v| 国产农村妇女毛片精品久久麻豆| 肉肉av福利一精品导航| 91免费观看视频在线| 2017欧美狠狠色| 日本美女一区二区| 色狠狠综合天天综合综合| 久久久精品国产免费观看同学| 亚洲第一福利一区| 91免费视频大全| 国产精品拍天天在线| 韩日欧美一区二区三区| 欧美精品aⅴ在线视频| 亚洲人午夜精品天堂一二香蕉| 国产精品综合一区二区| 日韩三级中文字幕| 日日噜噜夜夜狠狠视频欧美人| 91网站最新网址| 国产精品欧美久久久久一区二区| 国产一区二区主播在线| 欧美日本一道本| 亚洲大尺度视频在线观看| 99国产精品国产精品毛片| 国产精品午夜电影| 国产成人精品一区二区三区四区 | 99国产精品一区| 国产精品毛片久久久久久久| 国产一区二区三区免费在线观看 | 精品欧美久久久| 91玉足脚交白嫩脚丫在线播放| 日本一区二区电影| 粉嫩蜜臀av国产精品网站| 久久久久久日产精品| 国产一区二区三区免费| 欧美精品一区二区三区在线| 蜜臀av一区二区三区| 欧美久久一二三四区| 午夜精品久久久久| 欧美日韩精品久久久| 午夜精品一区二区三区电影天堂| 欧美日韩中文另类| 五月天网站亚洲| 91精品一区二区三区久久久久久| 日本视频一区二区三区| 日韩欧美国产小视频| 麻豆成人91精品二区三区| 日韩精品一区国产麻豆| 国产一区二区免费看| 欧美经典一区二区三区| 成人精品一区二区三区四区| 国产精品美女久久久久av爽李琼 | 亚洲一本大道在线| 欧美午夜片在线观看| 视频在线观看一区| 欧美成人精品1314www| 国产一区二区三区在线观看免费 | 日本亚洲欧美天堂免费| 精品国产乱码久久久久久牛牛| 国产成人免费9x9x人网站视频| 中文字幕久久午夜不卡| 在线观看日韩国产| 免费成人av资源网| 欧美极品xxx| 欧美三级乱人伦电影| 免费成人结看片| 国产精品高清亚洲| 欧美最猛性xxxxx直播| 日韩av中文字幕一区二区三区| xvideos.蜜桃一区二区| 99re6这里只有精品视频在线观看| 亚洲成人精品一区二区| 精品99久久久久久| 99久久精品国产导航| 在线免费一区三区| 日本va欧美va欧美va精品| 日本一区二区三区国色天香| 91传媒视频在线播放| 九一久久久久久| 综合色中文字幕| 欧美一区二区三区在线观看视频| 国产精品乡下勾搭老头1| 亚洲一区二区综合| 久久精品人人做人人爽人人| 欧美午夜精品电影| 国产成人精品免费| 日韩成人免费看| 自拍av一区二区三区| 日韩美女天天操| 91福利国产精品| 国产91在线看| 美女免费视频一区二区| 国产精品国产三级国产aⅴ入口 | 精品av久久707| 日本国产一区二区| 国产一区二区视频在线播放| 一二三区精品福利视频| 久久久精品黄色| 日韩亚洲欧美在线| 色综合天天综合网天天看片| 国产一区亚洲一区| 奇米在线7777在线精品| 亚洲一区二区三区美女| 国产精品毛片无遮挡高清| 日韩欧美一区二区不卡|