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

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

?? tfs.c

?? 可移到ucos上的文件系統(tǒng)
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
/* tfs.c:
 *	Tiny File System
 *	TFS supports the ability to store/access files in flash.  The TFS
 *	functions provide a command at the monitor's user interface (the
 *	"tfs" command) as well as a library of functions that are available to
 *	the monitor/application code on this target (TFS api).
 *
 *	The code that supports TFS in the MicroMonitor package spans across 
 *	several files.  This is done so that various pieces of TFS can optionally
 *	be compiled in or out (using INCLUDE_XXX macros in config.h) of the
 *	monitor package...
 *
 *	tfs.c:
 *		Core TFS code that cannot be optionally omitted without eliminating
 *		the TFS facility from the monitor.
 *	
 *	tfsapi.c:
 *		This file contains the code that supports the application's ability
 *		to use the TFS api.  Since some of the api is used by the monitor
 *		itself, not all of the api-specific code is there, some of it is
 *		in tfs.c.
 *
 *	tfsclean.c:
 *		TFS can be configured to have a robust power-hit-safe cleanup
 *		mechanism which requires a significant amount of flash, or a simple,
 *		non-power-hit-safe mechanism.  Both implementations are in tfsclean.c.
 *
 *	tfscli.c:
 *		If you don't need the "tfs" command in your command line interface,
 *		then the code in this file can be omitted.
 *
 *	tfsloader.c:
 *		TFS can support COFF, ELF or A.OUT binary file formats.  The code
 *		to load each of these formats from flash to RAM is here.
 *
 *	tfslog.c:
 *		If there is a need to log flash interaction to a file, then this
 *		file contains code to support that.
 *
 *
 *	NOTES:
 *	* Dealing with multiple task access:
 *	  Since the monitor is inherently a single threaded program
 *	  potentially being used in a multi-tasking environment, the monitor's
 *	  access functions (API) must be provided with a lock/unlock 
 *	  wrapper that will guarantee sequential access to all of the monitor 
 *	  facilities.  Refer to monlib.c to see this implementation.  This
 *	  provides the protection needed by TFS to keep multiple "mon_"
 *	  functions from being executed by different tasks.
 *	  Note that originally this was supported with tfsctrl(TFS_MUTEX ) and
 *	  it only protected the tfs API functions.  This turned out to be
 *	  insufficient because it did not prevent other tasks from calling
 *	  other non-tfs functions in the monitor while tfs access (and
 *	  potentially, flash update) was in progress.  This meant that a flash
 *	  update could be in progress and some other task could call mon_getenv()
 *	  (for example).  This could screw up the flash update because
 *	  mon_getenv() might be fetched out of the same flash device that
 *	  the TFS operation is being performed on.
 *
 *	* Dealing with cache coherency:
 *	  I believe the only concern here is that Icache must be invalidated
 *	  and Dcache must be flushed whenever TFS does a memory copy that may
 *	  ultimately be executable code.  This is handled at the end of the
 *	  tfsmemcpy function by calling flushDcache() and invalidateIcache().
 *	  It is the application's responsibility to give the monitor the
 *	  appropriate functions (see assigncachefuncs()) if necessary.
 *
 *	* Configuring a device to run as TFS memory:
 *	  Assuming you are using power-safe cleanup...
 *	  TFS expects that on any given device used for storage of files, the
 *	  device is broken up into some number of sectors with the last sector
 *	  being the largest and used as the spare sector for defragmentation.
 *	  All other sector sizes must be smaller than the SPARE sector and the
 *	  sector just prior to the spare is used for defragmentation state
 *	  overhead.  This sector should be large enough to allow the overhead 
 *	  space to grow down from the top without filling the sector.  For most
 *	  flash devices, these two sectors (spare and overhead) are usually the
 *	  same size and are large.  For FlashRam, the device should be configured
 *	  so that these two sectors are large.  The spare sector will never be
 *	  allowed to contain any file information (because it is 100% dedicated to
 *	  the defragmentation process) and the sector next to this can have files
 *	  in it, but the overhead space is also in this sector.
 *
 *	* Testing TFS:
 *	  There are three files dedicated to testing the file system.  Two of them
 *	  (tfstestscript & tfstestscript1) are scripts that are put into the
 *	  file system and run.  The third file (tfstest.c) is a piece of code 
 *	  that can be built into a small application that runs out of TFS to test
 *	  all of the API functionality.
 *	  - tfstestscript:
 *		This script is used to simply bang on normal defragmentation.  It
 *		builds files with sizes and names based on the content of memory
 *		starting at $APPRAMBASE.  Changing the content of memory starting at
 *		$APPRAMBASE will change the characteristics of this test so it is
 *		somewhat random.  It is not 100% generic, but can be used as a
 *		base for testing TFS on various systems.
 *	  - tfstestscript1:
 *		This script is used to bang on the power-safe defragmentation of
 *		TFS.  It simulates power hits that might occur during defragmentation.
 *		This script assumes that the monitor has been built with the
 *		DEFRAG_TEST_ENABLED flag set.
 *	  - tfstest.c:
 *		This code can be built into a small application that will thoroughly
 *		exercise the TFS API.  This file can also be used as a reference for
 *		some examples of TFS api usage.
 *
 *	General notice:
 *	This code is part of a boot-monitor package developed as a generic base
 *	platform for embedded system designs.  As such, it is likely to be
 *	distributed to various projects beyond the control of the original
 *	author.  Please notify the author of any enhancements made or bugs found
 *	so that all may benefit from the changes.  In addition, notification back
 *	to the author will allow the new user to pick up changes that may have
 *	been made by other users after this version of the code was distributed.
 *
 *	Author:	Ed Sutter
 *	email:	esutter@lucent.com		(home: lesutter@worldnet.att.net)
 *	phone:	908-582-2351			(home: 908-889-5161)
 */
#include "config.h"
#include "cpu.h"
#include "stddefs.h"
#include "genlib.h"
#include "tfs.h"
#include "tfsdev.h"
#include "flash.h"

#if INCLUDE_TFS

char	*(*tfsGetAtime)(long,char *,int);
long	(*tfsGetLtime)(void);
void	(*tfsDocommand)(char *,int);
TDEV	tfsDeviceTbl[TFSDEVTOT];
TFILE	**tfsAlist;
int		ScriptExitFlag;
struct	tfsdat tfsSlots[TFS_MAXOPEN];
long	tfsTrace;

static long		tfsFmodCount;
static int		tfsAlistSize, tfsOldDelFlagCheckActive;

/* tfsflgtbl & tfserrtbl:
 *	Tables that establish an easy lookup mechanism to convert from
 *	bitfield to string or character.
 *	Note that TFS_ULVL0 is commented out.  I leave it in here as a place
 *	holder (comment), but it actually is not needed becasue ulvl_0 is the
 *	default if no other ulvl is specified.
 */
struct tfsflg tfsflgtbl[] = {
	{ TFS_BRUN,			'b',	"run_at_boot",			TFS_BRUN },
	{ TFS_QRYBRUN,		'B',	"qry_run_at_boot",		TFS_QRYBRUN },
	{ TFS_EXEC,			'e',	"executable",			TFS_EXEC },
	{ TFS_EBIN,			'E',	TFS_EBIN_NAME,			TFS_EBIN },
	{ TFS_IPMOD,		'i',	"inplace_modifiable",	TFS_IPMOD },
	{ TFS_UNREAD,		'u',	"ulvl_unreadable", 		TFS_UNREAD },
/*	{ TFS_ULVL0,		'0',	"ulvl_0", 				TFS_ULVLMSK }, */
	{ TFS_ULVL1,		'1',	"ulvl_1", 				TFS_ULVLMSK },
	{ TFS_ULVL2,		'2',	"ulvl_2", 				TFS_ULVLMSK },
	{ TFS_ULVL3,		'3',	"ulvl_3", 				TFS_ULVLMSK },
	{ TFS_CPRS,			'c',	"compressed", 			TFS_CPRS },
	{ 0, 0, 0, 0 }
};

static struct tfserr tfserrtbl[] = {
	{ TFS_OKAY,				"no error" },
	{ TFSERR_NOFILE,		"file not found" },
	{ TFSERR_NOSLOT,		"max fps opened" },
	{ TFSERR_EOF,			"end of file" },
	{ TFSERR_BADARG,		"bad argument" },
	{ TFSERR_NOTEXEC,		"not executable" },
	{ TFSERR_BADCRC,		"bad crc" },
	{ TFSERR_FILEEXISTS,	"file already exists" },
	{ TFSERR_FLASHFAILURE,	"flash operation failed" },
	{ TFSERR_WRITEMAX,		"max write count exceeded" },
	{ TFSERR_RDONLY,		"file is read-only" },
	{ TFSERR_BADFD,			"invalid descriptor" },
	{ TFSERR_BADHDR,		"bad binary executable header" },
	{ TFSERR_CORRUPT,		"corrupt file" },
	{ TFSERR_MEMFAIL,		"memory failure" },
	{ TFSERR_NOTIPMOD,		"file is not in-place-modifiable" },
	{ TFSERR_FLASHFULL,		"out of flash space" },
	{ TFSERR_USERDENIED,	"user level access denied" },
	{ TFSERR_NAMETOOBIG,	"name or info field too big" },
	{ TFSERR_FILEINUSE,		"file in use" },
	{ TFSERR_SCRIPTINSUB,	"can't put script in subroutine" },
	{ TFSERR_NOTAVAILABLE,	"tfs facility not available" },
	{ TFSERR_BADFLAG,		"bad flag" },
	{ 0,0 }
};

/* dummyAtime() & dummyLtime():
 *	These two functions are loaded into the function pointers as defaults
 *	for the time-retrieval stuff used in TFS.
 */
static char *
dummyAtime(long tval,char *buf,int buflen)
{
/*	strcpy(buf,"Fri Sep 13 00:00:00 1986"); */
	*buf = 0;
	return(buf);
}

static long
dummyLtime(void)
{
	return(TIME_UNDEFINED);
}

/* getdfsdev():
 *	Input is a file pointer; based on that pointer return the appropriate
 *	device header pointer.  If error, just return 0.
 *	A "device" in TFS is some block of some type of memory that is assumed
 *	to be contiguous space that can be configured as a block of sectors (to
 *	look like flash).  For most systems, there is only one (the flash); 
 *	other systems may have battery-backed RAM, etc...
 *	Note that this is not fully implemented.
 */
static TDEV *
gettfsdev(TFILE *fp)
{
	TDEV *tdp;

	for(tdp=tfsDeviceTbl;tdp->start != TFSEOT;tdp++) {
		if ((fp >= (TFILE *)tdp->start) &&
			(fp < (TFILE *)tdp->end))
			return(tdp);
	}
	return(0);
}

TDEV *
gettfsdev_fromprefix(char * prefix, int verbose)
{
	TDEV *tdp;

	for(tdp=tfsDeviceTbl;tdp->start != TFSEOT;tdp++) {
		if (!strcmp(prefix,tdp->prefix))
			return(tdp);
	}
	if (verbose)
		printf("Bad device prefix: %s\n",prefix);
	return(0);
}

/* tfsflasherase(), tfsflasheraseall() & tfsflashwrite():
 *	Wrappers for corresponding flash operations.  The wrappers are used
 *	to provide one place for the incrmentation of tfsFmodCount.
 */
int
tfsflasheraseall(TDEV *tdp)
{
	int	snum, last;

	if (tfsTrace > 2)
		printf("tfsflasheraseall(%s)\n",tdp->prefix);

	tfsFmodCount++;
	/* Erase the sectors within the device that are used for file store... */
	if (addrtosector((char *)tdp->start,&snum,0,0) < 0)
		return(TFSERR_MEMFAIL);
	last = snum + tdp->sectorcount;
	while(snum < last) {
		if (AppFlashErase(snum++) == -1)
			return(TFSERR_MEMFAIL);
	}

	/* Erase the spare... */
	if (addrtosector((char *)tdp->spare,&snum,0,0) < 0)
		return(TFSERR_MEMFAIL);
	if (AppFlashErase(snum) == -1)
		return(TFSERR_MEMFAIL);
	return(TFS_OKAY);
}

int
tfsflasherase(int snum)
{
	if (tfsTrace > 2)
		printf("tfsflasherase(%d)\n",snum);

	tfsFmodCount++;
	return(AppFlashErase(snum));
}

int
tfsflashwrite(ulong *dest,ulong *src,long bytecnt)
{
	if (tfsTrace > 2)
		printf("tfsflashwrite(0x%lx,0x%lx,%ld)\n",
			(ulong)dest,(ulong)src,bytecnt);

	if (bytecnt < 0)
		return(-1);
	
	tfsFmodCount++;
	return(AppFlashWrite(dest,src,bytecnt));
}

/* tfserrmsg():
 *	Return the error message string that corresponds to the incoming
 *	tfs error number.
 */
char *
tfserrmsg(int errno)
{
	struct	tfserr	*tep;
	
	tep = tfserrtbl;
	while(tep->msg) {
		if (errno == tep->err)
			return(tep->msg);
		tep++;
	}
	return("unknown tfs errno");
}

/* tfsmakeStale():
 *	Modify the state of a file to be stale.
 *	Do this by clearing the TFS_NOTSTALE flag in the tfs header.
 *	This function is used by tfsadd() when in the process of
 *	updating a file that already exists in the flash.
 *	See comments above tfsadd() for more details on the TFS_NOTSTALE flag.
 */
static int
tfsmakeStale(TFILE *tfp)
{
	ulong	flags;

	flags = TFS_FLAGS(tfp) & ~TFS_NSTALE;
	if (tfsflashwrite(&tfp->flags,&flags,sizeof(long)) < 0)
		return(TFSERR_FLASHFAILURE);
	return(TFS_OKAY);
}

/* tfsflagsbtoa():
 *	Convert binary flags to ascii and return the string.
 */
char *
tfsflagsbtoa(long flags,char *fstr)
{
	int	i;
	struct	tfsflg	*tfp;

	if ((!flags) || (!fstr))
		return((char *)0);

	i = 0;
	tfp = tfsflgtbl;
	*fstr = 0;
	while(tfp->sdesc) {
		if ((flags & tfp->mask) == tfp->flag)
			fstr[i++] = tfp->sdesc;
		tfp++;
	}
	fstr[i] = 0;
	return(fstr);
}

/* tfsflagsatob():
 *	Convert ascii flags to binary and return the long.
 */
static int
tfsflagsatob(char *fstr, long *flag)
{
	struct	tfsflg	*tfp;

	*flag = 0;

	if (!fstr)
		return(TFSERR_BADFLAG);

	while(*fstr) {
		tfp = tfsflgtbl;
		while(tfp->sdesc) {
			if (*fstr == tfp->sdesc) {
				*flag |= tfp->flag;
				break;
			}
			tfp++;
		}
		if (!tfp->flag)
			return(TFSERR_BADFLAG);
		fstr++;
	}
	return(TFS_OKAY);
}

/* validtfshdr():
 *	Return 1 if the header pointed to by the incoming header pointer is valid.
 *	Else return 0.  The header crc is calculated based on the hdrcrc
 *	and next members of the structure being zero.
 *	Note that if the file is deleted, then just ignore the crc and return 1.
 */
int
validtfshdr(TFILE *hdr)
{
	TFILE hdrcpy;
	ulong hdrcrc;

	/* A few quick checks... */
	if (!hdr || hdr->hdrsize == ERASED16)
		return(0);

	/* Run a crc32 test...
	 * The header crc was originally calculated (in tfsadd()) with the
	 * header crc and next pointer nulled out; so a copy must be made and
	 * these two fields cleared.  Also, note that the TFS_NSTALE and
	 * TFS_ACTIVE flags are forced to be set in the copy.  This is done
	 * because it is possible that either of these bits may have been 
	 * cleared due to other TFS interaction; hence, they need to be set
	 * prior to crc validateion.
	 * Note also that earlier versions of TFS deleted a file by clearing
	 * the entire flags field.  This made it impossible to do a header crc
	 * check on a deleted file; deletion has been changed to simply clear
	 * the TFS_ACTIVE bit in the flags, so now a deleted file's header can
	 * can be crc tested by simply forcing the TFS_ACTIVE bit high as was
	 * mentioned above.
	 */
	hdrcpy = *hdr;
	hdrcrc = hdr->hdrcrc;
	hdrcpy.next = 0;
	hdrcpy.hdrcrc = 0;
	hdrcpy.flags |= (TFS_NSTALE | TFS_ACTIVE);
	if (crc32((uchar *)&hdrcpy,TFSHDRSIZ) == hdrcrc)
		return(1);
	else {
		/* Support transition to new deletion flag method... */
		if ((hdr->flags == 0) && tfsOldDelFlagCheckActive)
			return(1);					

		printf("Bad TFS hdr crc @ 0x%lx\n",(ulong)hdr);
		return(0);
	}
}

/* nextfp():
 *	Used as a common means of retrieving the next file header pointer.  It
 *	does some sanity checks based on the fact that all pointers must fall
 *	within the TFSSTART<->TFSEND memory range and since each file is placed
 *	just after the previous one in linear memory space, fp->next should
 *	always be greater than fp.
 */
TFILE *
nextfp(TFILE *fp, TDEV *tdp)
{
	if (!tdp)
		tdp = gettfsdev(fp);

	/* Make some basic in-range checks... */
	if ((!tdp) || (fp < (TFILE *)tdp->start) || (fp > (TFILE *)tdp->end) ||
		(fp->next < (TFILE *)tdp->start) || (fp->next > (TFILE *)tdp->end)  ||
		(fp->next <= fp)) {
		printf("Bad TFS hdr ptr @ 0x%lx\n",(ulong)fp);
		return(0);
	}
	return(fp->next);
}

/* tfsflasherased():
 *	Jump to the point in flash after the last file in TFS, then verify
 *	that all remaining flash  that is dedicated to TFS is erased (0xff).
 *	If erased, return 1; else return 0.
 */
int
tfsflasherased(TDEV *tdp, int verbose)
{
	ulong	*lp;
	TFILE	*tfp;

	tfp = (TFILE *)tdp->start;
	while(validtfshdr(tfp))
		tfp = nextfp(tfp,tdp);

	lp = (ulong *)tfp;
	while (lp < (ulong *)tdp->end) {
		if (*lp != ERASED32) {
			if (verbose)
				printf("End of TFS on %s not erased at 0x%lx\n",
					tdp->prefix,(ulong)lp);
			return(0);
		}
#ifdef WATCHDOG_MACRO
		WATCHDOG_MACRO();
#endif
		lp++;
	}
	return(1);
}

/* tfsmemuse():
 *	Step through one (or all) TFS devices and tally up various memory usage
 *	totals.  See definition of tfsmem structure for more details.
 *	If incoming tdpin pointer is NULL, then tally up for all TFS devices;
 *	otherwise, tally up for only the one device pointed to by tdpin.
 */
int
tfsmemuse(TDEV *tdpin, TINFO *tinfo, int verbose)
{
	int		devtot;
	TFILE	*tfp;
	TDEV	*tdp;

	/* Start by clearing incoming structure... */
	tinfo->pso = 0;
	tinfo->sos = 0;
	tinfo->memtot = 0;
	tinfo->liveftot = 0;
	tinfo->deadftot = 0;
	tinfo->livedata = 0;
	tinfo->deaddata = 0;
	tinfo->liveovrhd = 0;
	tinfo->deadovrhd = 0;

	if (verbose) {
		printf("TFS Memory Usage...\n     ");
		printf(" name    start       end       spare     spsize  scnt type\n");
	}
	devtot = 0;
	for (tdp=tfsDeviceTbl;tdp->start != TFSEOT;tdp++) {
		if (!tdpin || (tdpin == tdp)) {
			devtot++;
			tfp = (TFILE *)tdp->start;

			if (verbose) {
				printf("%10s: 0x%08lx|0x%08lx|0x%08lx|0x%06lx|%4ld|0x%lx\n",
					tdp->prefix,(ulong)(tdp->start),(ulong)(tdp->end),
					(ulong)(tdp->spare),tdp->sparesize,
					tdp->sectorcount,(ulong)(tdp->devinfo));
			}
			tinfo->memtot += ((tdp->end - tdp->start) + 1) + tdp->sparesize;
			tinfo->pso += (tdp->sectorcount * 4) + 16;
			tinfo->sos += tdp->sparesize;
			while(validtfshdr(tfp)) {
				if (TFS_FILEEXISTS(tfp)) {
					tinfo->liveftot++;
					tinfo->livedata += TFS_SIZE(tfp);
					tinfo->liveovrhd += (TFSHDRSIZ + sizeof(struct defraghdr));

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
三级精品在线观看| 欧美日韩成人一区二区| 久久99国产精品成人| 秋霞av亚洲一区二区三| 香蕉乱码成人久久天堂爱免费| 亚洲尤物视频在线| 亚洲国产综合91精品麻豆| 樱花草国产18久久久久| 一区二区三区蜜桃| 亚洲自拍偷拍欧美| 五月天激情综合网| 美国毛片一区二区三区| 麻豆精品一区二区| 国产麻豆一精品一av一免费| 国产一区二区三区日韩| 成人一区二区视频| 97aⅴ精品视频一二三区| 一本大道av一区二区在线播放 | 成人三级伦理片| av中文字幕亚洲| 欧美在线一区二区三区| 欧美精品亚洲二区| 精品少妇一区二区| 亚洲国产精品国自产拍av| 日韩美女啊v在线免费观看| 亚洲精品伦理在线| 丝袜美腿一区二区三区| 精品一区二区久久| 大尺度一区二区| 一本一道久久a久久精品| 欧美撒尿777hd撒尿| 91精品视频网| 国产日本亚洲高清| 亚洲一区二区三区免费视频| 日韩精品国产欧美| 高清不卡一区二区在线| 91福利社在线观看| 日韩一区二区精品| 国产精品色呦呦| 亚洲网友自拍偷拍| 国产综合成人久久大片91| 不卡一卡二卡三乱码免费网站| 欧洲亚洲精品在线| 久久欧美一区二区| 亚洲欧美日韩在线播放| 青青草国产精品97视觉盛宴| 国产成人免费视| 欧美三级蜜桃2在线观看| 久久日韩粉嫩一区二区三区| 亚洲少妇最新在线视频| 免费人成在线不卡| 91麻豆产精品久久久久久 | 一区免费观看视频| 日韩不卡一区二区| 91在线看国产| 精品盗摄一区二区三区| 亚洲欧美国产77777| 精品一区二区三区免费视频| 91久久国产最好的精华液| 日韩精品久久久久久| 成人免费毛片高清视频| 日韩欧美在线影院| 亚洲精品一二三| 国产精品一区二区三区99| 欧洲视频一区二区| 中文子幕无线码一区tr| 麻豆91免费看| 在线观看av一区二区| 欧美国产精品一区| 老汉av免费一区二区三区| 欧美艳星brazzers| 1024亚洲合集| 国产一区二区三区视频在线播放| 欧美私模裸体表演在线观看| 国产精品久久久久久久久久免费看 | 日韩欧美一二区| 亚洲一区二区欧美| 成人a级免费电影| 精品少妇一区二区三区视频免付费 | 国产亚洲一本大道中文在线| 亚洲成av人**亚洲成av**| 99久久国产综合精品女不卡| 久久一日本道色综合| 日本少妇一区二区| 欧美性高清videossexo| 亚洲视频一区二区免费在线观看| 国产美女精品一区二区三区| 日韩午夜激情电影| 日韩av一区二| 欧美夫妻性生活| 无码av中文一区二区三区桃花岛| 91麻豆免费观看| 一区在线中文字幕| 成人av午夜电影| 欧美激情一区二区三区| 国产福利一区二区三区视频| 精品少妇一区二区三区| 蜜桃传媒麻豆第一区在线观看| 欧美军同video69gay| 亚洲韩国精品一区| 精品视频免费在线| 爽爽淫人综合网网站| 欧美日韩一区二区欧美激情| 亚洲午夜久久久久中文字幕久| 91九色最新地址| 亚洲一区二区三区自拍| 欧美影视一区在线| 亚洲va中文字幕| 欧美日韩免费电影| 日本免费新一区视频| 日韩欧美另类在线| 精品一区二区三区日韩| 久久精品人人爽人人爽| 国产成人在线视频网站| 国产精品日韩精品欧美在线 | 精品国产人成亚洲区| 蜜桃av一区二区三区| 精品国产不卡一区二区三区| 国产一区二区三区高清播放| 亚洲国产精品二十页| 97超碰欧美中文字幕| 亚洲一区国产视频| 欧美一区二区三区日韩视频| 奇米888四色在线精品| 精品久久久久一区二区国产| 国产麻豆成人传媒免费观看| 国产精品欧美一区二区三区| 色综合亚洲欧洲| 亚洲高清免费观看| 精品少妇一区二区三区免费观看| 国产成人午夜精品影院观看视频| 欧美国产日韩亚洲一区| 色婷婷激情久久| 婷婷开心久久网| 欧美精品一区二区三区蜜臀| 成人sese在线| 香蕉加勒比综合久久 | 免费高清不卡av| 国产亚洲精品精华液| 色综合av在线| 日本不卡在线视频| 欧美激情在线免费观看| 欧美亚洲国产怡红院影院| 麻豆精品视频在线观看| 国产精品乱子久久久久| 欧美天天综合网| 国内精品伊人久久久久av一坑| ...av二区三区久久精品| 91精品欧美一区二区三区综合在| 国产九色精品成人porny | 国产成都精品91一区二区三| 一区二区在线看| 2019国产精品| 在线中文字幕不卡| 国产一本一道久久香蕉| 一区二区三区小说| 日韩片之四级片| 色综合久久中文综合久久牛| 久久精品72免费观看| 亚洲蜜臀av乱码久久精品蜜桃| 日韩欧美视频在线| 色综合久久久久久久久久久| 精彩视频一区二区三区| 亚洲一区中文在线| 国产欧美视频一区二区三区| 欧美精品乱码久久久久久| 成人午夜精品在线| 蜜桃av一区二区| 夜色激情一区二区| 欧美国产精品一区二区| 日韩欧美国产不卡| 欧美视频一区在线| www.亚洲色图| 国产在线视视频有精品| 亚瑟在线精品视频| 亚洲欧美日本在线| 国产视频911| 精品日本一线二线三线不卡| 在线看不卡av| 91蜜桃在线观看| 不卡一区二区中文字幕| 极品少妇xxxx精品少妇| 婷婷久久综合九色综合绿巨人| 亚洲裸体xxx| 中文字幕av一区二区三区免费看| 欧美不卡123| 91精品国产综合久久久蜜臀图片| 色婷婷精品久久二区二区蜜臂av| 国产成人av福利| 国产精品自在欧美一区| 麻豆精品蜜桃视频网站| 调教+趴+乳夹+国产+精品| 亚洲主播在线观看| 亚洲精品乱码久久久久久久久| 国产精品青草综合久久久久99| 久久久久亚洲综合| 久久亚洲精精品中文字幕早川悠里 | 国产一区二区导航在线播放| 美腿丝袜在线亚洲一区 | 成人免费不卡视频|