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

📄 vcs_hook.c

📁 linux内核源码
💻 C
字号:
// $Id: vcs_hook.c,v 1.2 2003/08/12 12:01:06 starvik Exp $//// Call simulator hook. This is the part running in the// simulated program.//#include "vcs_hook.h"#include <stdarg.h>#include <asm/arch-v32/hwregs/reg_map.h>#include <asm/arch-v32/hwregs/intr_vect_defs.h>#define HOOK_TRIG_ADDR     0xb7000000   /* hook cvlog model reg address */#define HOOK_MEM_BASE_ADDR 0xa0000000   /* csp4 (shared mem) base addr */#define HOOK_DATA(offset) ((unsigned*) HOOK_MEM_BASE_ADDR)[offset]#define VHOOK_DATA(offset) ((volatile unsigned*) HOOK_MEM_BASE_ADDR)[offset]#define HOOK_TRIG(funcid) do { *((unsigned *) HOOK_TRIG_ADDR) = funcid; } while(0)#define HOOK_DATA_BYTE(offset) ((unsigned char*) HOOK_MEM_BASE_ADDR)[offset]// ------------------------------------------------------------------ hook_callint hook_call( unsigned id, unsigned pcnt, ...) {  va_list ap;  unsigned i;  unsigned ret;#ifdef USING_SOS  PREEMPT_OFF_SAVE();#endif  // pass parameters  HOOK_DATA(0) = id;  /* Have to make hook_print_str a special case since we call with a     parameter of byte type. Should perhaps be a separate     hook_call. */  if (id == hook_print_str) {    int i;    char *str;    HOOK_DATA(1) = pcnt;    va_start(ap, pcnt);    str = (char*)va_arg(ap,unsigned);    for (i=0; i!=pcnt; i++) {      HOOK_DATA_BYTE(8+i) = str[i];    }    HOOK_DATA_BYTE(8+i) = 0;	/* null byte */  }  else {    va_start(ap, pcnt);    for( i = 1; i <= pcnt; i++ ) HOOK_DATA(i) = va_arg(ap,unsigned);    va_end(ap);  }  // read from mem to make sure data has propagated to memory before trigging  *((volatile unsigned*) HOOK_MEM_BASE_ADDR);  // trigger hook  HOOK_TRIG(id);  // wait for call to finish  while( VHOOK_DATA(0) > 0 ) {}  // extract return value  ret = VHOOK_DATA(1);#ifdef USING_SOS  PREEMPT_RESTORE();#endif  return ret;}unsignedhook_buf(unsigned i){  return (HOOK_DATA(i));}void print_str( const char *str ) {  int i;  for (i=1; str[i]; i++);         /* find null at end of string */  hook_call(hook_print_str, i, str);}// --------------------------------------------------------------- CPU_KICK_DOGvoid CPU_KICK_DOG(void) {  (void) hook_call( hook_kick_dog, 0 );}// ------------------------------------------------------- CPU_WATCHDOG_TIMEOUTvoid CPU_WATCHDOG_TIMEOUT( unsigned t ) {  (void) hook_call( hook_dog_timeout, 1, t );}

⌨️ 快捷键说明

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