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

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

?? scsi_debug.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
字號:
/* $Id: scsi_debug.c,v 1.1 1992/07/24 06:27:38 root Exp root $
 *  linux/kernel/scsi_debug.c
 *
 *  Copyright (C) 1992  Eric Youngdale
 *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
 *  to make sure that we are not getting blocks mixed up, and panic if
 *  anything out of the ordinary is seen.
 */

#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/head.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/genhd.h>
#include <linux/fs.h>

#include <asm/system.h>
#include <asm/io.h>

#include "../block/blk.h"
#include "scsi.h"
#include "hosts.h"

/* Number of real scsi disks that will be detected ahead of time */
static int NR_REAL=-1;

#define MAJOR_NR SCSI_DISK_MAJOR
#define START_PARTITION 4
#define SCSI_DEBUG_TIMER 20
/* Number of jiffies to wait before completing a command */
#define DISK_SPEED     10
#define CAPACITY (0x80000)

static int starts[] = {4, 1000, 50000, CAPACITY, 0};
static int npart = 0;

#include "scsi_debug.h"
#ifdef DEBUG
#define DEB(x) x
#else
#define DEB(x)
#endif

#define VERIFY1_DEBUG(RW)			       			\
      if (bufflen != 1024) {printk("%d", bufflen); panic("(1)Bad bufflen");};			\
      start = 0;							\
      if ((SCpnt->request.dev & 0xf) != 0) start = starts[(SCpnt->request.dev & 0xf) - 1];		\
      if (bh){							\
	if (bh->b_size != 1024) panic ("Wrong bh size");	\
	if ((bh->b_blocknr << 1) + start != block)	       	\
	  {  printk("Wrong bh block# %d %d ",bh->b_blocknr, block);  \
	  panic ("Wrong bh block#");};  \
	if (bh->b_dev != SCpnt->request.dev) panic ("Bad bh target");\
      };

#if 0
/* This had been in the VERIFY_DEBUG macro, but it fails if there is already
   a disk on the system */
      if ((SCpnt->request.dev & 0xfff0) != ((target + NR_REAL) << 4) +(MAJOR_NR << 8)){	\
	printk("Dev #s %x %x ",SCpnt->request.dev, target);			\
	panic ("Bad target");};						\

#endif

#define VERIFY_DEBUG(RW)			       			\
      if (bufflen != 1024 && (!SCpnt->use_sg)) {printk("%x %d\n ",bufflen, SCpnt->use_sg); panic("Bad bufflen");};   	\
      start = 0;							\
      if ((SCpnt->request.dev & 0xf) > npart) panic ("Bad partition");	\
      if ((SCpnt->request.dev & 0xf) != 0) start = starts[(SCpnt->request.dev & 0xf) - 1];		\
      if (SCpnt->request.cmd != RW) panic ("Wrong  operation");		\
      if (SCpnt->request.sector + start != block) panic("Wrong block.");	\
      if (SCpnt->request.current_nr_sectors != 2 && (!SCpnt->use_sg)) panic ("Wrong # blocks");	\
      if (SCpnt->request.bh){							\
	if (SCpnt->request.bh->b_size != 1024) panic ("Wrong bh size");	\
	if ((SCpnt->request.bh->b_blocknr << 1) + start != block)	       	\
	  {  printk("Wrong bh block# %d %d ",SCpnt->request.bh->b_blocknr, block);  \
	  panic ("Wrong bh block#");};  \
	if (SCpnt->request.bh->b_dev != SCpnt->request.dev) panic ("Bad bh target");\
      };

static volatile void (*do_done[SCSI_DEBUG_MAILBOXES])(Scsi_Cmnd *) = {NULL, };
static int scsi_debug_host = 0;
extern void scsi_debug_interrupt();

volatile Scsi_Cmnd * SCint[SCSI_DEBUG_MAILBOXES] = {NULL,};
static volatile unsigned int timeout[SCSI_DEBUG_MAILBOXES] ={0,};

static char sense_buffer[128] = {0,};

static void scsi_dump(Scsi_Cmnd * SCpnt, int flag){
  int i;
#if 0
  unsigned char * pnt;
#endif
  unsigned int * lpnt;
  struct scatterlist * sgpnt = NULL;
  printk("use_sg: %d",SCpnt->use_sg);
  if (SCpnt->use_sg){
    sgpnt = (struct scatterlist *) SCpnt->buffer;
    for(i=0; i<SCpnt->use_sg; i++) {
      lpnt = (int *) sgpnt[i].alt_address;
      printk(":%x %x %d\n",sgpnt[i].alt_address, sgpnt[i].address, sgpnt[i].length);
      if (lpnt) printk(" (Alt %x) ",lpnt[15]);
    };
  } else {
    printk("nosg: %x %x %d\n",SCpnt->request.buffer, SCpnt->buffer,
	   SCpnt->bufflen);
    lpnt = (int *) SCpnt->request.buffer;
    if (lpnt) printk(" (Alt %x) ",lpnt[15]);
  };
  lpnt = (unsigned int *) SCpnt;
  for (i=0;i<sizeof(Scsi_Cmnd)/4+1; i++) {
    if ((i & 7) == 0) printk("\n");
    printk("%x ",*lpnt++);
  };
  printk("\n");
  if (flag == 0) return;
  lpnt = (unsigned int *) sgpnt[0].alt_address;
  for (i=0;i<sizeof(Scsi_Cmnd)/4+1; i++) {
    if ((i & 7) == 0) printk("\n");
    printk("%x ",*lpnt++);
  };
#if 0
  printk("\n");
  lpnt = (unsigned int *) sgpnt[0].address;
  for (i=0;i<sizeof(Scsi_Cmnd)/4+1; i++) {
    if ((i & 7) == 0) printk("\n");
    printk("%x ",*lpnt++);
  };
  printk("\n");
#endif
  printk("DMA free %d sectors.\n", dma_free_sectors);
}

int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
{
    unchar *cmd = (unchar *) SCpnt->cmnd;
    struct partition * p;
    int block, start;
    struct buffer_head * bh = NULL;
    unsigned char * buff;
    int nbytes, sgcount;
    int scsi_debug_errsts;
    struct scatterlist * sgpnt;
    int target = SCpnt->target;
    int bufflen = SCpnt->request_bufflen;
    int i;
    sgcount = 0;
    sgpnt = NULL;

    DEB(if (target > 1) { SCpnt->result = DID_TIME_OUT << 16;done(SCpnt);return 0;});
    
    buff = (unsigned char *) SCpnt->request_buffer;

    if(target>=2 || SCpnt->lun != 0) {
      SCpnt->result =  DID_NO_CONNECT << 16;
      done(SCpnt);
      return 0;
    };
    
    switch(*cmd){
    case REQUEST_SENSE:
      printk("Request sense...\n");
#ifndef DEBUG
      { int i;
	printk("scsi_debug: Requesting sense buffer (%x %x %x %d):", SCpnt, buff, done, bufflen);
	for(i=0;i<12;i++) printk("%d ",sense_buffer[i]);
	printk("\n");
      };
#endif
      memset(buff, 0, bufflen);
      memcpy(buff, sense_buffer, bufflen);
      memset(sense_buffer, 0, sizeof(sense_buffer));
      SCpnt->result = 0;
      done(SCpnt); 
      return 0;
    case ALLOW_MEDIUM_REMOVAL:
      if(cmd[4]) printk("Medium removal inhibited...");
      else printk("Medium removal enabled...");
      scsi_debug_errsts = 0;
      break;
    case INQUIRY:
      printk("Inquiry...(%x %d)\n", buff, bufflen);
      memset(buff, 0, bufflen);
      buff[0] = TYPE_DISK;
      buff[1] = 0x80;  /* Removable disk */
      buff[2] = 1;
      memcpy(&buff[8],"Foo Inc",7);
      memcpy(&buff[16],"XYZZY",5);
      memcpy(&buff[32],"1",1);
      scsi_debug_errsts = 0;
      break;
    case TEST_UNIT_READY:
      printk("Test unit ready.\n");
      if (buff)
	memset(buff, 0, bufflen);
      scsi_debug_errsts = 0;
      break;
    case READ_CAPACITY:
      printk("Read Capacity\n");
      if(NR_REAL < 0) NR_REAL = (SCpnt->request.dev >> 4) & 0x0f;
      memset(buff, 0, bufflen);
      buff[0] = (CAPACITY >> 24);
      buff[1] = (CAPACITY >> 16) & 0xff;
      buff[2] = (CAPACITY >> 8) & 0xff;
      buff[3] = CAPACITY & 0xff;
      buff[6] = 2; /* 512 byte sectors */
      scsi_debug_errsts = 0;
      break;
    case READ_10:
    case READ_6:
#ifdef DEBUG
      printk("Read...");
#endif
      if ((*cmd) == READ_10)
	block = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); 
      else 
	block = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16);
      VERIFY_DEBUG(READ);
      printk("(r%d)",SCpnt->request.nr_sectors);
      nbytes = bufflen;
      if(SCpnt->use_sg){
	sgcount = 0;
	sgpnt = (struct scatterlist *) buff;
	buff = sgpnt[sgcount].address;
	bufflen = sgpnt[sgcount].length;
	bh = SCpnt->request.bh;
      };
      scsi_debug_errsts = 0;
      do{
	VERIFY1_DEBUG(READ);
	memset(buff, 0, bufflen);
/* If this is block 0, then we want to read the partition table for this
   device.  Let's make one up */
	if(block == 0 && target == 0) {
	  *((unsigned short *) (buff+510)) = 0xAA55;
	  p = (struct partition* ) (buff + 0x1be);
	  npart = 0;
	  while(starts[npart+1]){
	    p->start_sect = starts[npart];
	    p->nr_sects = starts[npart+1] - starts [npart];
	    p->sys_ind = 0x81;  /* Linux partition */
	    p++;
	    npart++;
	  };
	  scsi_debug_errsts = 0;
	  break;
	};
#ifdef DEBUG
	if (SCpnt->use_sg) printk("Block %x (%d %d)\n",block, SCpnt->request.nr_sectors,
	       SCpnt->request.current_nr_sectors);
#endif
	/* Simulate a disk change */
	if(block == 0xfff0) {
	  sense_buffer[0] = 0x70;
	  sense_buffer[2] = UNIT_ATTENTION;
	  starts[0] += 10;
	  starts[1] += 10;
	  starts[2] += 10;
	 
#ifdef DEBUG
      { int i;
	printk("scsi_debug: Filling sense buffer:");
	for(i=0;i<12;i++) printk("%d ",sense_buffer[i]);
	printk("\n");
      };
#endif
	  scsi_debug_errsts = (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
	  break;
	} /* End phony disk change code */
	memset(buff, 0, bufflen);
	memcpy(buff, &target, sizeof(target));
	memcpy(buff+sizeof(target), cmd, 24);
	memcpy(buff+60, &block, sizeof(block));
	memcpy(buff+64, SCpnt, sizeof(Scsi_Cmnd));
	nbytes -= bufflen;
	if(SCpnt->use_sg){
	  memcpy(buff+128, bh, sizeof(struct buffer_head));
	  block += bufflen >> 9;
	  bh = bh->b_reqnext;
	  sgcount++;
	  if (nbytes) {
	    if(!bh) panic("Too few blocks for linked request.");
	    buff = sgpnt[sgcount].address;
	    bufflen = sgpnt[sgcount].length;
	  };
	}
      } while(nbytes);
      if (SCpnt->use_sg && !scsi_debug_errsts)
	if(bh) scsi_dump(SCpnt, 0);
      break;
    case WRITE_10:
    case WRITE_6:
#ifdef DEBUG
      printk("Write\n");
#endif
      if ((*cmd) == WRITE_10)
	block = cmd[5] + (cmd[4] << 8) + (cmd[3] << 16) + (cmd[2] << 24); 
      else 
	block = cmd[3] + (cmd[2] << 8) + ((cmd[1] & 0x1f) << 16);
      VERIFY_DEBUG(WRITE);
      printk("(w%d)",SCpnt->request.nr_sectors);
      if (SCpnt->use_sg){
	if ((bufflen >> 9) != SCpnt->request.nr_sectors)
	  panic ("Trying to write wrong number of blocks\n");
	sgpnt = (struct scatterlist *) buff;
	buff = sgpnt[sgcount].address;
      };
#if 0
      if (block != *((unsigned long *) (buff+60))) {
	printk("%x %x :",block,  *((unsigned long *) (buff+60)));
	scsi_dump(SCpnt,1);
	panic("Bad block written.\n");
      };
#endif
      scsi_debug_errsts = 0;
      break;
     default:
      printk("Unknown command %d\n",*cmd);
      SCpnt->result =  DID_NO_CONNECT << 16;
      done(SCpnt);
      return 0;
    };

    cli();
    for(i=0;i<SCSI_DEBUG_MAILBOXES; i++){
      if (SCint[i] == 0) break;
    };

    if (i >= SCSI_DEBUG_MAILBOXES || SCint[i] != 0) 
      panic("Unable to find empty SCSI_DEBUG command slot.\n");

    SCint[i] = SCpnt;

    if (done) {
	DEB(printk("scsi_debug_queuecommand: now waiting for interrupt "););
	if (do_done[i])
	  printk("scsi_debug_queuecommand: Two concurrent queuecommand?\n");
	else
	  do_done[i] = done;
    }
    else
      printk("scsi_debug_queuecommand: done cant be NULL\n");

    timeout[i] = jiffies+DISK_SPEED;

/* If no timers active, then set this one */
    if ((timer_active & (1 << SCSI_DEBUG_TIMER)) == 0) {
      timer_table[SCSI_DEBUG_TIMER].expires = timeout[i];
      timer_active |= 1 << SCSI_DEBUG_TIMER;
    };

    SCpnt->result = scsi_debug_errsts;
    sti();

#if 0
    printk("Sending command (%d %x %d %d)...", i, done, timeout[i],jiffies);
#endif

    return 0;
}

volatile static int internal_done_flag = 0;
volatile static int internal_done_errcode = 0;
static void internal_done(Scsi_Cmnd * SCpnt)
{
    internal_done_errcode = SCpnt->result;
    ++internal_done_flag;
}

int scsi_debug_command(Scsi_Cmnd * SCpnt)
{
    DEB(printk("scsi_debug_command: ..calling scsi_debug_queuecommand\n"));
    scsi_debug_queuecommand(SCpnt, internal_done);

    while (!internal_done_flag);
    internal_done_flag = 0;
    return internal_done_errcode;
}

/* A "high" level interrupt handler.  This should be called once per jiffy
 to simulate a regular scsi disk.  We use a timer to do this. */

static void scsi_debug_intr_handle(void)
{
    Scsi_Cmnd * SCtmp;
    int i, pending;
    void (*my_done)(Scsi_Cmnd *); 
   int to;

    timer_table[SCSI_DEBUG_TIMER].expires = 0;
    timer_active &= ~(1 << SCSI_DEBUG_TIMER);

  repeat:
    cli();
    for(i=0;i<SCSI_DEBUG_MAILBOXES; i++) {
      if (SCint[i] == 0) continue;
      if (timeout[i] == 0) continue;
      if (timeout[i] <= jiffies) break;
    };

    if(i == SCSI_DEBUG_MAILBOXES){
      pending = INT_MAX;
      for(i=0;i<SCSI_DEBUG_MAILBOXES; i++) {
	if (SCint[i] == 0) continue;
	if (timeout[i] == 0) continue;
	if (timeout[i] <= jiffies) {sti(); goto repeat;};
	if (timeout[i] > jiffies) {
	  if (pending > timeout[i]) pending = timeout[i];
	  continue;
	};
      };
      if (pending && pending != INT_MAX) {
	timer_table[SCSI_DEBUG_TIMER].expires = 
	  (pending <= jiffies ? jiffies+1 : pending);
	timer_active |= 1 << SCSI_DEBUG_TIMER;
      };
      sti();
      return;
    };

    if(i < SCSI_DEBUG_MAILBOXES){
      timeout[i] = 0;
      my_done = do_done[i];
      do_done[i] = NULL;
      to = timeout[i];
      timeout[i] = 0;
      SCtmp = (Scsi_Cmnd *) SCint[i];
      SCint[i] = NULL;
      sti();

      if (!my_done) {
	printk("scsi_debug_intr_handle: Unexpected interrupt\n"); 
	return;
      }
      
#ifdef DEBUG
      printk("In intr_handle...");
      printk("...done %d %x %d %d\n",i , my_done, to, jiffies);
      printk("In intr_handle: %d %x %x\n",i, SCtmp, my_done);
#endif

      my_done(SCtmp);
#ifdef DEBUG
      printk("Called done.\n");
#endif
    };
    goto repeat;
}


int scsi_debug_detect(int hostnum)
{
    scsi_debug_host = hostnum;
    timer_table[SCSI_DEBUG_TIMER].fn = scsi_debug_intr_handle;
    timer_table[SCSI_DEBUG_TIMER].expires = 0;
    return 1;
}

int scsi_debug_abort(Scsi_Cmnd * SCpnt,int i)
{
    int j;
    void (*my_done)(Scsi_Cmnd *);
    DEB(printk("scsi_debug_abort\n"));
    SCpnt->result = i << 16;
    for(j=0;j<SCSI_DEBUG_MAILBOXES; j++) {
      if(SCpnt == SCint[j]) {
	my_done = do_done[j];
	my_done(SCpnt);
	cli();
	timeout[j] = 0;
	SCint[j] = NULL;
	do_done[j] = NULL;
	sti();
      };
    };
    return 0;
}

int scsi_debug_biosparam(int size, int* info){
  info[0] = 32;
  info[1] = 64;
  info[2] = (size + 2047) >> 11;
  if (info[2] >= 1024) info[2] = 1024;
  return 0;
}

int scsi_debug_reset(Scsi_Cmnd * SCpnt)
{
    int i;
    void (*my_done)(Scsi_Cmnd *);
    DEB(printk("scsi_debug_reset called\n"));
    for(i=0;i<SCSI_DEBUG_MAILBOXES; i++) {
      if (SCint[i] == NULL) continue;
      SCint[i]->result = DID_ABORT << 16;
      my_done = do_done[i];
      my_done(SCint[i]);
      cli();
      SCint[i] = NULL;
      do_done[i] = NULL;
      timeout[i] = 0;
      sti();
    };
    return 0;
}

char *scsi_debug_info(void)
{
    static char buffer[] = " ";			/* looks nicer without anything here */
    return buffer;
}


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区三区沐欲| 在线精品视频免费观看| 午夜av一区二区| 一区二区在线观看免费| 一区二区三区在线视频观看| 亚洲国产日韩a在线播放 | 亚洲国产日韩一区二区| 亚洲天堂久久久久久久| 夜夜揉揉日日人人青青一国产精品| 亚洲欧洲日韩在线| 亚洲女同ⅹxx女同tv| 亚洲一区二区三区在线| 午夜精品福利一区二区三区av| 日韩有码一区二区三区| 乱一区二区av| 粉嫩一区二区三区在线看| 91免费观看视频在线| 欧美色成人综合| 欧美一级在线观看| 久久人人超碰精品| 国产精品伦理在线| 久久久蜜桃精品| 国产精品精品国产色婷婷| 一二三四区精品视频| 蜜桃av一区二区| 成人午夜电影小说| 欧美日韩黄色影视| 久久久久免费观看| 亚洲最大成人综合| 国产在线视视频有精品| 色天天综合久久久久综合片| 777奇米四色成人影色区| 国产亚洲欧美在线| 亚洲人成在线播放网站岛国| 伦理电影国产精品| aaa亚洲精品| 欧美日韩精品欧美日韩精品 | 成人av电影在线播放| 色噜噜狠狠成人网p站| 欧美日韩免费高清一区色橹橹| 精品国产乱码久久久久久夜甘婷婷 | 国产日韩av一区| 亚洲地区一二三色| 成人av高清在线| 日韩欧美一区二区久久婷婷| 亚洲欧美日韩综合aⅴ视频| 精品亚洲免费视频| 色成人在线视频| 中文字幕乱码日本亚洲一区二区 | 欧美v国产在线一区二区三区| 亚洲国产精品高清| 麻豆国产91在线播放| 91麻豆国产福利在线观看| 久久久久国产一区二区三区四区| 午夜精品免费在线观看| 99国产精品久久久久久久久久久| 欧美一级片在线看| 亚洲午夜精品在线| 色狠狠综合天天综合综合| 国产欧美综合在线| 韩国视频一区二区| 欧美一区二区在线免费观看| 亚洲国产日韩一区二区| 91社区在线播放| 中文字幕精品三区| 国产成人免费视频网站高清观看视频| 69堂成人精品免费视频| 亚洲大片免费看| 欧美最新大片在线看| 亚洲欧美一区二区三区国产精品 | 国产欧美日韩在线| 国产在线精品不卡| 久久亚洲二区三区| 国产麻豆日韩欧美久久| 久久久久国产精品人| 国产成人av自拍| 国产欧美一区二区精品忘忧草 | 91日韩一区二区三区| 国产精品久久777777| 不卡的av在线| 中文字幕一区在线观看视频| 91在线视频免费91| 亚洲激情第一区| 欧美日韩精品一区二区三区蜜桃| 午夜成人免费电影| 日韩一区二区三区视频在线观看| 七七婷婷婷婷精品国产| 欧美变态凌虐bdsm| 狠狠色狠狠色合久久伊人| 日韩欧美国产午夜精品| 韩国成人在线视频| 中文字幕一区二区三| 欧美日韩国产美| 精品一区二区三区在线观看 | 欧美丰满美乳xxx高潮www| 青青草91视频| 国产视频一区不卡| 91麻豆国产在线观看| 偷拍一区二区三区四区| 精品国产乱码久久久久久老虎| 国产麻豆午夜三级精品| 亚洲人xxxx| 欧美成人欧美edvon| 成人aaaa免费全部观看| 天天操天天色综合| 久久久久久久久久久久电影| 色激情天天射综合网| 美女视频网站久久| 亚洲素人一区二区| 日韩丝袜美女视频| 99久久国产综合精品麻豆| 日韩影院在线观看| 中文字幕一区二区三区在线不卡 | 国内精品伊人久久久久av影院| 中文字幕在线不卡一区| 欧美一级黄色大片| 91香蕉视频在线| 精品一区二区三区视频| 亚洲电影中文字幕在线观看| 国产欧美精品一区二区色综合朱莉 | 色婷婷精品久久二区二区蜜臂av | 一本久久a久久免费精品不卡| 日韩专区欧美专区| 中文字幕日本不卡| 2023国产精品| 欧美肥妇毛茸茸| 在线观看av一区| 成人黄色777网| 亚洲一区二区五区| 国产欧美日韩另类一区| 精品国产露脸精彩对白 | 六月丁香综合在线视频| 亚洲综合一区二区| 国产精品久久久久久一区二区三区| 日韩欧美专区在线| 欧美性生交片4| 91麻豆视频网站| 播五月开心婷婷综合| 国产a久久麻豆| 国产一区美女在线| 麻豆精品一区二区三区| 日韩在线卡一卡二| 亚洲第四色夜色| 亚洲一区二区三区爽爽爽爽爽 | 久久蜜桃av一区二区天堂| 欧美精品黑人性xxxx| 欧美色图免费看| 在线观看一区二区视频| 不卡的看片网站| 99精品欧美一区二区三区小说| 成人午夜免费av| 成人app网站| 色婷婷国产精品久久包臀| 一本久久精品一区二区| 91黄色免费看| 欧美日韩黄色一区二区| 欧美日韩小视频| 欧美一区二区免费观在线| 日韩西西人体444www| 日韩欧美美女一区二区三区| 精品国产制服丝袜高跟| 精品成人一区二区三区| 国产丝袜在线精品| 中文字幕一区二区三区不卡 | 国产欧美在线观看一区| 中文字幕av一区二区三区高 | 在线成人免费观看| 日韩一区二区免费电影| 欧美精品一区二区久久婷婷| 国产欧美日本一区二区三区| 国产精品黄色在线观看| 亚洲国产一区二区视频| 日韩精品亚洲专区| 国产精品夜夜嗨| 91浏览器入口在线观看| 欧美日韩亚洲国产综合| 久久婷婷综合激情| 亚洲品质自拍视频网站| 日韩av一级电影| 国产成人精品午夜视频免费 | 另类人妖一区二区av| 国产成人精品一区二区三区四区 | 成人性生交大片免费看视频在线| 色综合天天在线| 91精品国产综合久久久久久| 国产欧美一区二区精品秋霞影院 | 欧美日韩精品一区二区三区蜜桃 | 中文字幕在线一区免费| 午夜精品免费在线| 国产91富婆露脸刺激对白| 欧美在线制服丝袜| 精品日产卡一卡二卡麻豆| 亚洲人成电影网站色mp4| 久久99精品网久久| 成人污视频在线观看| 欧美一级爆毛片| 日韩理论片网站| 亚洲大片免费看| 国内精品视频一区二区三区八戒| 91美女在线观看|