memide.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Fake IDE disk; stores blocks in memory.
  2. // Useful for running kernel without scratch disk.
  3. #include "types.h"
  4. #include "defs.h"
  5. #include "param.h"
  6. #include "mmu.h"
  7. #include "proc.h"
  8. #include "arm.h"
  9. #include "traps.h"
  10. #include "spinlock.h"
  11. #include "buf.h"
  12. extern uchar _binary_fs_img_start[], _binary_fs_img_end[];
  13. static int disksize;
  14. static uchar *memdisk;
  15. void
  16. ideinit(void)
  17. {
  18. memdisk = _binary_fs_img_start;
  19. disksize = div(((uint)_binary_fs_img_end - (uint)_binary_fs_img_start), 512);
  20. }
  21. // Interrupt handler.
  22. void
  23. ideintr(void)
  24. {
  25. // no-op
  26. }
  27. // Sync buf with disk.
  28. // If B_DIRTY is set, write buf to disk, clear B_DIRTY, set B_VALID.
  29. // Else if B_VALID is not set, read buf from disk, set B_VALID.
  30. void
  31. iderw(struct buf *b)
  32. {
  33. uchar *p;
  34. if(!(b->flags & B_BUSY))
  35. panic("iderw: buf not busy");
  36. if((b->flags & (B_VALID|B_DIRTY)) == B_VALID)
  37. panic("iderw: nothing to do");
  38. if(b->dev != 1)
  39. panic("iderw: request not for disk 1");
  40. if(b->sector >= disksize)
  41. panic("iderw: sector out of range");
  42. p = memdisk + b->sector*512;
  43. if(b->flags & B_DIRTY){
  44. b->flags &= ~B_DIRTY;
  45. memmove(p, b->data, 512);
  46. } else
  47. memmove(b->data, p, 512);
  48. b->flags |= B_VALID;
  49. }