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

📄 hw_disk.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  return 0;}static unsignedhw_disk_io_read_buffer(device *me,		       void *dest,		       int space,		       unsigned_word addr,		       unsigned nr_bytes,		       cpu *processor,		       unsigned_word cia){  hw_disk_device *disk = device_data(me);  unsigned nr_bytes_read;  if (space != 0)    device_error(me, "read - extended disk addressing unimplemented");  if (nr_bytes == 0)    nr_bytes_read = 0;  else if (fseek(disk->image, addr, SEEK_SET) < 0)    nr_bytes_read = 0;  else if (fread(dest, nr_bytes, 1, disk->image) != 1)    nr_bytes_read = 0;  else    nr_bytes_read = nr_bytes;  DTRACE(disk, ("io-read - address 0x%lx, nr-bytes-read %d, requested %d\n",                (unsigned long) addr, (int)nr_bytes_read, (int)nr_bytes));  return nr_bytes_read;}static unsignedhw_disk_io_write_buffer(device *me,			const void *source,			int space,			unsigned_word addr,			unsigned nr_bytes,			cpu *processor,			unsigned_word cia){  hw_disk_device *disk = device_data(me);  unsigned nr_bytes_written;  if (space != 0)    device_error(me, "write - extended disk addressing unimplemented");  if (disk->read_only)    nr_bytes_written = 0;  else if (nr_bytes == 0)    nr_bytes_written = 0;  else if (fseek(disk->image, addr, SEEK_SET) < 0)    nr_bytes_written = 0;  else if (fwrite(source, nr_bytes, 1, disk->image) != 1)    nr_bytes_written = 0;  else    nr_bytes_written = nr_bytes;  DTRACE(disk, ("io-write - address 0x%lx, nr-bytes-written %d, requested %d\n",                (unsigned long) addr, (int)nr_bytes_written, (int)nr_bytes));  return nr_bytes_written;}/* instances of the hw_disk device */static voidhw_disk_instance_delete(device_instance *instance){  hw_disk_instance *data = device_instance_data(instance);  DITRACE(disk, ("delete - instance=%ld\n",		 (unsigned long)device_instance_to_external(instance)));  zfree(data);}static inthw_disk_instance_read(device_instance *instance,		      void *buf,		      unsigned_word len){  hw_disk_instance *data = device_instance_data(instance);  DITRACE(disk, ("read - instance=%ld len=%ld\n",		 (unsigned long)device_instance_to_external(instance),		 (long)len));  if ((data->pos + len) < data->pos)    return -1; /* overflow */  if (fseek(data->disk->image, data->pos, SEEK_SET) < 0)    return -1;  if (fread(buf, len, 1, data->disk->image) != 1)    return -1;  data->pos = ftell(data->disk->image);  return len;}static inthw_disk_instance_write(device_instance *instance,		       const void *buf,		       unsigned_word len){  hw_disk_instance *data = device_instance_data(instance);  DITRACE(disk, ("write - instance=%ld len=%ld\n",		 (unsigned long)device_instance_to_external(instance),		 (long)len));  if ((data->pos + len) < data->pos)    return -1; /* overflow */  if (data->disk->read_only)    return -1;  if (fseek(data->disk->image, data->pos, SEEK_SET) < 0)    return -1;  if (fwrite(buf, len, 1, data->disk->image) != 1)    return -1;  data->pos = ftell(data->disk->image);  return len;}static inthw_disk_instance_seek(device_instance *instance,		      unsigned_word pos_hi,		      unsigned_word pos_lo){  hw_disk_instance *data = device_instance_data(instance);  if (pos_hi != 0)    device_error(device_instance_device(instance),		 "seek - extended addressing unimplemented");  DITRACE(disk, ("seek - instance=%ld pos_hi=%ld pos_lo=%ld\n",		 (unsigned long)device_instance_to_external(instance),		 (long)pos_hi, (long)pos_lo));  data->pos = pos_lo;  return 0;}static inthw_disk_max_transfer(device_instance *instance,		     int n_stack_args,		     unsigned32 stack_args[/*n_stack_args*/],		     int n_stack_returns,		     unsigned32 stack_returns[/*n_stack_returns*/]){  device *me = device_instance_device(instance);  if ((n_stack_args != 0)      || (n_stack_returns != 1)) {    device_error(me, "Incorrect number of arguments for max-transfer method\n");    return -1;  }  else {    unsigned_cell max_transfer;    if (device_find_property(me, "max-transfer"))      max_transfer = device_find_integer_property(me, "max-transfer");    else      max_transfer = 512;    DITRACE(disk, ("max-transfer - instance=%ld max-transfer=%ld\n",		   (unsigned long)device_instance_to_external(instance),		   (long int)max_transfer));    stack_returns[0] = max_transfer;    return 0;  }}static inthw_disk_block_size(device_instance *instance,		   int n_stack_args,		   unsigned32 stack_args[/*n_stack_args*/],		   int n_stack_returns,		   unsigned32 stack_returns[/*n_stack_returns*/]){  device *me = device_instance_device(instance);  if ((n_stack_args != 0)      || (n_stack_returns != 1)) {    device_error(me, "Incorrect number of arguments for block-size method\n");    return -1;  }  else {    unsigned_cell block_size;    if (device_find_property(me, "block-size"))      block_size = device_find_integer_property(me, "block-size");    else      block_size = 512;    DITRACE(disk, ("block-size - instance=%ld block-size=%ld\n",		   (unsigned long)device_instance_to_external(instance),		   (long int)block_size));    stack_returns[0] = block_size;    return 0;  }}static inthw_disk_nr_blocks(device_instance *instance,		  int n_stack_args,		  unsigned32 stack_args[/*n_stack_args*/],		  int n_stack_returns,		  unsigned32 stack_returns[/*n_stack_returns*/]){  device *me = device_instance_device(instance);  if ((n_stack_args != 0)      || (n_stack_returns != 1)) {    device_error(me, "Incorrect number of arguments for block-size method\n");    return -1;  }  else {    unsigned_word nr_blocks;    if (device_find_property(me, "#blocks"))      nr_blocks = device_find_integer_property(me, "#blocks");    else      nr_blocks = -1;    DITRACE(disk, ("#blocks - instance=%ld #blocks=%ld\n",		   (unsigned long)device_instance_to_external(instance),		   (long int)nr_blocks));    stack_returns[0] = nr_blocks;    return 0;  }}static device_instance_methods hw_disk_instance_methods[] = {  { "max-transfer", hw_disk_max_transfer },  { "block-size", hw_disk_block_size },  { "#blocks", hw_disk_nr_blocks },  { NULL, },};static const device_instance_callbacks hw_disk_instance_callbacks = {  hw_disk_instance_delete,  hw_disk_instance_read,  hw_disk_instance_write,  hw_disk_instance_seek,  hw_disk_instance_methods,};static device_instance *hw_disk_create_instance(device *me,			const char *path,			const char *args){  device_instance *instance;  hw_disk_device *disk = device_data(me);  hw_disk_instance *data = ZALLOC(hw_disk_instance);  data->disk = disk;  data->pos = 0;  instance = device_create_instance_from(me, NULL,					 data,					 path, args,					 &hw_disk_instance_callbacks);  DITRACE(disk, ("create - path=%s(%s) instance=%ld\n",		 path, args,		 (unsigned long)device_instance_to_external(instance)));  return pk_disklabel_create_instance(instance, args);}static device_callbacks const hw_disk_callbacks = {  { hw_disk_init_address, NULL },  { NULL, }, /* address */  { hw_disk_io_read_buffer,      hw_disk_io_write_buffer, },  { NULL, }, /* DMA */  { NULL, }, /* interrupt */  { NULL, }, /* unit */  hw_disk_create_instance,  hw_disk_ioctl,};static void *hw_disk_create(const char *name,	       const device_unit *unit_address,	       const char *args){  /* create the descriptor */  hw_disk_device *hw_disk = ZALLOC(hw_disk_device);  return hw_disk;}const device_descriptor hw_disk_device_descriptor[] = {  { "disk", hw_disk_create, &hw_disk_callbacks },  { "cdrom", hw_disk_create, &hw_disk_callbacks },  { "floppy", hw_disk_create, &hw_disk_callbacks },  { NULL },};#endif /* _HW_DISK_C_ */

⌨️ 快捷键说明

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