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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? debug.c

?? LUBBOCK板的BLOB
?? C
字號:
/*
 * debug.c: Debugging command functions
 *
 * Copyright (C) 2001 Stefan Eletzhofer <stefan.eletzhofer@www.eletztrick.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#ident "$Id: debug.c,v 1.9 2002/01/06 15:44:23 erikm Exp $"

/**********************************************************************
 * Includes
 */

#ifdef HAVE_CONFIG_H
# include <blob/config.h>
#endif

#include <blob/errno.h>
#include <blob/error.h>
#include <blob/types.h>
#include <blob/util.h>
#include <blob/serial.h>
#include <blob/command.h>


/**********************************************************************
 * defines
 */

#define CHKMEM_DEBUG BLOB_DEBUG

/* this will send a cold shiver through erik's spine ... */
#define	ERR( x )		{ ret = x; goto DONE; }

/* more readable IMHO */
#define MEM( x )        (*((u32 *)x))

/**********************************************************************
 * prototypes
 */

static void perror( int errno, char *func );

/*********************************************************************
 * CmdMemcpy
 *
 * AUTOR:		SELETZ
 * REVISED:
 *
 * Command wrapper for memcpy utility function.
 *
 */
static int CmdMemcpy( int argc, char *argv[] )
{
	int	ret = 0;
	u32	src	= 0L;
	u32	dest	= 0L;
	u32	len	= 0L;

	if ( argc < 4 )				ERR( -EINVAL );

	ret = strtou32( argv[1], &src );
	if ( ret < 0 )				ERR( -EINVAL );

	ret = strtou32( argv[2], &dest );
	if ( ret < 0 )				ERR( -EINVAL );

	ret = strtou32( argv[3], &len );
	if ( ret < 0 )				ERR( -EINVAL );

	/* check alignment of src and dest */
	if((src & 0x03) || (dest & 0x03))
		ERR(-EALIGN);

	/* counted in words */
	if ( len & 0x00000003 ) {
		len = ( len >> 2 ) + 1;
	} else {
		len = len >> 2;
	}

	SerialOutputString("\n### Now copying 0x");
	SerialOutputHex(len);
	SerialOutputString(" words from 0x");
	SerialOutputHex((int)src);
	SerialOutputString(" to 0x");
	SerialOutputHex((int)dest);
	serial_write('\n');

	MyMemCpy( (u32 *)dest, (const u32 *)src, len);

	SerialOutputString(" done\n");

	ret = 0;
DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char memcpyhelp[] = "memcpy src dst len\n"
"copy len bytes from src to dst\n";
__commandlist(CmdMemcpy, "memcpy", memcpyhelp);


/*********************************************************************
 * Poke
 *
 * AUTOR:	Stefan Eletzhofer
 * REVISED:
 *
 * Poke values to memory
 *
 */
static int Poke( int argc, char *argv[] )
{
	int		ret				= 0;
	u32		address;
	u32		value;
	char		type = 'w';

	if ( argc < 3 ) 			ERR( -EINVAL );

	ret = strtou32(argv[1], &address);
	if ( ret < 0 )				ERR( -EINVAL );

	ret = strtou32(argv[2], &value);
	if ( ret < 0 )				ERR( -EINVAL );

	if ( argc >= 3 ) {
		type = argv[3][0];
	}

#if CHKMEM_DEBUG
	SerialOutputString("adr=0x");
	SerialOutputHex(address);
	SerialOutputString(" val=0x");
	SerialOutputHex(value);
	SerialOutputString(" type=");
	serial_write(type);
	serial_write('\n');
#endif

	/* check memory alignment */
	switch(type | 0x20) {
	case 'b':
		/* bytes don't have alignment restrictions */
		break;

	case 'h':
		/* half word accesses should be aligned on half words */
		if(address & 0x01)
			ERR(-EALIGN);

		break;

	case 'w':
		/* word accesses should be aligned on word boundaries */
		if(address & 0x03)
			ERR(-EALIGN);
		
		break;

	default:
		/* hmm, invalid type */
		ERR( -EINVAL );
		break;
	}

	/* write the value to memory */
	switch( type | 0x20 ) {
	case 'b':
		*((u8 *)address) = (u8)(value & 0xff);
		break;

	case 'h':
		*((u16 *)address) = (u16)(value & 0xffff);
		break;

	case 'w':
		*((u32 *)address) = value;
		break;

	default:
		/* this should not happen */
		ERR( -EINVAL );
		break;
	}


	ret = 0;
DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char pokehelp[] = "poke address value [b|h|w]\n"
"b = byte, h = half word, w = word (default is w)\n";
__commandlist(Poke, "poke", pokehelp );

/*********************************************************************
 * Peek
 *
 * AUTHOR:	Stefan Eletzhofer
 * REVISED:
 *
 * Peeks values from memory
 *
 */
static int Peek( int argc, char *argv[] )
{
	int		ret				= 0;
	u32		address;
	u32		value;
	char		type	= 'w';

	if ( argc < 2 ) 			ERR( -EINVAL );

	ret = strtou32(argv[1], &address);
	if ( ret < 0 )				ERR( -EINVAL );

	if ( argc >= 2 ) {
		type = argv[2][0];
	}

#if CHKMEM_DEBUG
	SerialOutputString("adr=0x");
	SerialOutputHex(address);
	SerialOutputString(" type=");
	serial_write(type);
	serial_write('\n');
#endif

	/* check memory alignment */
	switch(type | 0x20) {
	case 'b':
		/* bytes don't have alignment restrictions */
		break;

	case 'h':
		/* half word accesses should be aligned on half words */
		if(address & 0x01)
			ERR(-EALIGN);

		break;

	case 'w':
		/* word accesses should be aligned on word boundaries */
		if(address & 0x03)
			ERR(-EALIGN);
		
		break;

	default:
		/* hmm, invalid type */
		ERR( -EINVAL );
		break;
	}

	/* read value from memory */
	switch( type | 0x20 ) {
	case 'b':
		value = (*((u8 *)address)) & 0xff;
		break;

	case 'h':
		value = (*((u16 *)address))& 0xffff;
		break;

	case 'w':
		value = (*((u32 *)address));
		break;

	default:
		/* this should not happen */
		ERR(-EINVAL);
		break;
	}

	serial_write(type);
	serial_write(' ');
	SerialOutputHex(value);
	SerialOutputString("\n");

	ret = 0;
DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char peekhelp[] = "peek address [b|h|w]\n"
"b = byte, h = half word, w = word (default is w)\n";
__commandlist(Peek, "peek", peekhelp );

/*********************************************************************
 * dump
 *
 * AUTHOR: Tim Riker
 * REVISED:
 *
 * dumps memory
 *
 */
static int dump( int argc, char *argv[] )
{
	int		ret = 0;
	u32		address;
	u32		endaddress;
	u32		tmpaddress;
	u32		value;

	if ( argc < 2 )
		ERR( -EINVAL );

	ret = strtou32(argv[1], &address);
	if ( ret < 0 )
		ERR( -EINVAL );

	if ( argc == 3 ) {
		ret = strtou32(argv[2], &endaddress);
		if ( ret < 0 )
			ERR( -EINVAL );
	} else
		endaddress = address + 0x80;


	/* check alignment of address and endaddress */
	if((address & 0x03) || (endaddress & 0x03))
		ERR(-EALIGN);

	/* print it */
	for ( ; address < endaddress; address += 0x10) {
		SerialOutputHex(address);
		SerialOutputString(": ");
		for (tmpaddress = address; tmpaddress < address + 0x10; tmpaddress += 4) {
			value = (*((u32 *)tmpaddress));
			SerialOutputHex(value);
			serial_write(' ');
		}
		for (tmpaddress = address; tmpaddress < address + 0x10; tmpaddress++) {
			value = (*((u8 *)tmpaddress)) & 0xff;
			if ((value >= ' ') && (value <= '~'))
				serial_write(value);
			else
				serial_write('.');
		}
		serial_write('\n');
	}

	ret = 0;
DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char dumphelp[] = "dump address [endAddress]\n";
__commandlist(dump, "dump", dumphelp );

/*********************************************************************
 * BitChange
 *
 * AUTOR:		SELETZ
 * REVISED:
 *
 * Modifies bits of an given memory location
 *
 */
static int BitChange( int argc, char *argv[] )
{
	int		ret		= 0;
	u32		adr		= 0L;
	u32		value	= 0L;

	if ( argc < 4 )				ERR( -EINVAL );

	ret = strtou32( argv[1], &adr );
	if ( ret < 0 )				ERR( -EINVAL );

	ret = strtou32( argv[2], &value );
	if ( ret < 0 )				ERR( -EINVAL );

	/* check memory alignment */
	if(adr &= 0x03)
		ERR(-EALIGN);

	SerialOutputHex( MEM( adr ) );

	switch ( argv[3][0] & (~0x20) ) {
		case 'A':
			MEM( adr ) &= value;
			break;
		case 'S':
		case 'O':
			MEM( adr ) |= value;
			break;
		case 'X':
			MEM( adr ) ^= value;
			break;
		case 'C':
			MEM( adr ) &= ~value;
			break;
		default:
			ERR( -EINVAL );
			break;
	}

	SerialOutputString( "->" );
	SerialOutputHex( MEM( adr ) );
	SerialOutputString( "\n" );

	ret = 0;
DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char bitchghelp[] = "bitchg address value {and|or|xor|set|clear}\n";
__commandlist(BitChange, "bitchg", bitchghelp );

/*********************************************************************
 * Call
 *
 * AUTHOR:		Christopher Hoover <ch@hpl.hp.com>
 * REVISED:
 *
 * Jumps to an arbitrary address.
 *
 */
static int Call( int argc, char *argv[] )
{
	int		ret		= 0;
	u32 adr, a = 0, b = 0, c = 0, d = 0;
	int (*called_fn)(u32, u32, u32, u32);

	if ( argc < 2  || argc > 6 )		ERR( -EINVAL );

	ret = strtou32( argv[1], &adr );
	if ( ret < 0 )				ERR( -EINVAL );

	if ( argc >= 3 ) {
		ret = strtou32( argv[2], &a );
		if ( ret < 0 )			ERR( -EINVAL );
	}
	if ( argc >= 4 ) {
		ret = strtou32( argv[2], &b );
		if ( ret < 0 )			ERR( -EINVAL );
	}
	if ( argc >= 5 ) {
		ret = strtou32( argv[2], &c );
		if ( ret < 0 )			ERR( -EINVAL );
	}
	if ( argc >= 6) {
		ret = strtou32( argv[2], &d );
		if ( ret < 0 )			ERR( -EINVAL );
	}

	SerialOutputString("Calling function at 0x");
	SerialOutputHex(adr);
	SerialOutputString(" ...\n");
	serial_flush_output();

	called_fn = (int (*)(u32, u32, u32, u32))adr;

	ret = called_fn(a, b, c, d);
	
	SerialOutputString("\nReturn value: 0x");
	SerialOutputHex((u32)ret);
	serial_write('\n');

	ret = 0;

DONE:
	if ( ret != 0 ) {
		perror( ret, __FUNCTION__ );
	}
	return ret;
}

static char callhelp[] = "call address [arg0 [arg1 [arg2 [arg3]]]]\n"
"Call function at <address> with optional arguments\n";

__commandlist(Call, "call", callhelp);


/**********************************************************************
 * static functions
 */

static void perror( int errno, char *func )
{
	printerrprefix();

	if ( errno < 0 )
		errno = -errno;

	if ( func != NULL) {
		SerialOutputString(func);
		SerialOutputString(": ");
	}
	SerialOutputString(strerror(errno));

	serial_write('\n');
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久夜色精品一区| 国内偷窥港台综合视频在线播放| 亚洲国产色一区| 国产真实乱对白精彩久久| 欧美自拍偷拍一区| 日本一二三四高清不卡| 美女任你摸久久| 欧美中文字幕亚洲一区二区va在线 | 热久久国产精品| av激情成人网| 久久久精品综合| 久久电影网站中文字幕| 欧美日韩国产一区二区三区地区| 中文字幕免费在线观看视频一区| 美女诱惑一区二区| 9191国产精品| 午夜欧美电影在线观看| 91久久精品网| 自拍偷在线精品自拍偷无码专区| 韩国av一区二区三区四区| 91精品欧美福利在线观看| 亚洲小说欧美激情另类| 色呦呦网站一区| 亚洲精选免费视频| 91免费视频网| 亚洲黄色免费网站| 在线免费观看一区| 亚洲国产精品视频| 欧美日韩精品一区二区| 亚洲国产视频a| 欧美日韩一二区| 亚洲午夜一二三区视频| 在线亚洲人成电影网站色www| 亚洲色图在线看| 色偷偷成人一区二区三区91| 亚洲乱码国产乱码精品精小说 | 欧美一级欧美一级在线播放| 日韩在线a电影| 91麻豆精品国产91久久久久久久久| 亚洲福中文字幕伊人影院| 欧美亚洲高清一区二区三区不卡| 亚洲一区二区欧美| 欧美日韩国产综合视频在线观看 | 久久精品亚洲国产奇米99| 国产一区二区三区在线观看免费 | 中文字幕中文字幕中文字幕亚洲无线| 国产精品综合视频| 亚洲欧美在线视频| 在线观看日韩电影| 日本成人中文字幕在线视频| 精品久久久网站| 成人小视频在线| 亚洲免费色视频| 91麻豆精品国产91久久久久| 国内精品久久久久影院一蜜桃| 国产欧美日产一区| 91国产丝袜在线播放| 婷婷激情综合网| 2021国产精品久久精品| 不卡一区二区三区四区| 亚洲福利一区二区| 久久亚洲综合av| 日本韩国欧美在线| 精品写真视频在线观看| 中文字幕在线不卡视频| 欧美精品久久99| 岛国精品在线播放| 视频一区欧美精品| 国产精品美女久久福利网站| 欧美日韩午夜影院| 国产成人日日夜夜| 性感美女极品91精品| 国产欧美日韩综合精品一区二区| 91豆麻精品91久久久久久| 精品一区二区在线播放| 日韩理论片网站| 欧美v国产在线一区二区三区| 99免费精品在线| 国产综合色视频| 午夜精品久久久久久久久| 国产精品区一区二区三| 欧美一区二区三区视频免费| 91丨九色丨蝌蚪丨老版| 韩国精品久久久| 天天操天天综合网| 国产精品伦理在线| 精品国产乱码久久| 欧美日本免费一区二区三区| 不卡电影免费在线播放一区| 激情图片小说一区| 日韩中文字幕91| 亚洲午夜在线视频| 玉米视频成人免费看| 国产欧美一区二区在线| 精品久久久影院| 欧美一区二区三区思思人| 91久久人澡人人添人人爽欧美| 国产经典欧美精品| 狠狠色狠狠色综合| 日本va欧美va精品| 视频一区中文字幕国产| 一区二区三区在线免费视频| 久久精品视频在线免费观看| 欧美一级片在线看| 91精品国产日韩91久久久久久| 欧美在线一二三四区| 91免费看视频| 99久久精品免费精品国产| 国产·精品毛片| 国产999精品久久| 成人午夜免费视频| 成人一区在线看| 成熟亚洲日本毛茸茸凸凹| 国产精品99久久久久久久女警| 国产在线不卡一区| 国产美女久久久久| 国产v综合v亚洲欧| 成人av免费在线| 在线成人av网站| 欧美日韩免费高清一区色橹橹| 欧美最新大片在线看| 欧美日韩国产一二三| 欧美日韩色综合| 日韩三级伦理片妻子的秘密按摩| 欧美精品第1页| 欧美一卡在线观看| 久久精品在线观看| 成人免费在线视频观看| 伊人一区二区三区| 天天综合色天天综合| 久久机这里只有精品| 国产乱码精品一区二区三区av| 成人在线综合网| 在线观看亚洲精品视频| 日韩亚洲欧美综合| 国产女人水真多18毛片18精品视频 | 麻豆成人久久精品二区三区小说| 美国毛片一区二区| 成人手机电影网| 色哟哟一区二区三区| 正在播放亚洲一区| 国产午夜精品美女毛片视频| 亚洲男帅同性gay1069| 亚洲成人7777| 国产福利一区二区三区在线视频| 99在线精品免费| 欧美一区二区三区的| 国产亚洲人成网站| 亚洲成人午夜电影| 国产一区在线视频| 欧美亚洲一区二区三区四区| 精品少妇一区二区| 亚洲欧美一区二区三区国产精品 | 亚洲视频中文字幕| 蜜桃精品视频在线| 99这里只有久久精品视频| 欧美肥大bbwbbw高潮| 国产精品毛片久久久久久| 亚洲高清免费视频| 成人视屏免费看| 91精品免费在线观看| 亚洲人成亚洲人成在线观看图片| 秋霞成人午夜伦在线观看| 成人激情视频网站| 精品黑人一区二区三区久久| 亚洲女人的天堂| 国产成人在线观看免费网站| 欧美精品第一页| 亚洲精品乱码久久久久久| 国产一区二区三区四区五区美女| 在线免费观看日本欧美| 国产精品免费av| 久久99精品久久久久婷婷| 欧美色综合天天久久综合精品| 国产日韩在线不卡| 精品一区二区三区免费毛片爱| 欧洲生活片亚洲生活在线观看| 国产精品久久久久桃色tv| 久久丁香综合五月国产三级网站| 欧美视频在线观看一区二区| 亚洲欧洲精品一区二区三区不卡| 精品亚洲aⅴ乱码一区二区三区| 欧美日韩精品一二三区| 亚洲精品高清视频在线观看| 国产成人午夜电影网| 精品88久久久久88久久久| 免费成人av资源网| 欧美精品 日韩| 香蕉av福利精品导航| 91国偷自产一区二区三区观看| 国产精品欧美久久久久一区二区| 国产一区二区不卡老阿姨| 精品国内二区三区| 精品制服美女久久| 精品久久久久久亚洲综合网| 日韩精品高清不卡| 欧美精品v国产精品v日韩精品 | 丁香婷婷综合五月| 久久日韩粉嫩一区二区三区| 久久成人免费网站|