readpage.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "nandfs.h"
  4. #include "nandecc.h"
  5. #include "local.h"
  6. char *
  7. nandfsreadpage(Nandfs *nandfs, void *buf, NandfsTags *tags, long block, int page, int reportbad, LogfsLowLevelReadResult *result)
  8. {
  9. ulong ecc1, ecc2, storedecc1, storedecc2;
  10. NandEccError e1, e2;
  11. ulong rawoffset;
  12. NandfsAuxiliary hdr;
  13. char *errmsg;
  14. rawoffset = nandfs->rawblocksize * (nandfs->baseblock + block) + NandfsFullSize * page;
  15. errmsg = (*nandfs->read)(nandfs->magic, buf, NandfsPageSize, rawoffset);
  16. if (errmsg)
  17. return errmsg;
  18. errmsg = (*nandfs->read)(nandfs->magic, &hdr, sizeof(hdr), rawoffset + NandfsPageSize);
  19. if (errmsg)
  20. return errmsg;
  21. ecc1 = nandecc(buf);
  22. ecc2 = nandecc((uchar *)buf + 256);
  23. storedecc1 = getlittle3(hdr.ecc1);
  24. storedecc2 = getlittle3(hdr.ecc2);
  25. e1 = nandecccorrect(buf, ecc1, &storedecc1, reportbad);
  26. e2 = nandecccorrect((uchar *)buf + 256, ecc2, &storedecc2, reportbad);
  27. if (e1 == NandEccErrorBad || e2 == NandEccErrorBad)
  28. *result = LogfsLowLevelReadResultHardError;
  29. else if (e1 != NandEccErrorGood || e2 != NandEccErrorGood)
  30. *result = LogfsLowLevelReadResultSoftError;
  31. else
  32. *result = LogfsLowLevelReadResultOk;
  33. if (tags) {
  34. *result = _nandfscorrectauxiliary(&hdr);
  35. _nandfsextracttags(&hdr, tags);
  36. }
  37. return nil;
  38. }
  39. char *
  40. nandfsreadpagerange(Nandfs *nandfs, void *buf, long block, int page, int offset, int count, LogfsLowLevelReadResult *result)
  41. {
  42. char *errmsg;
  43. uchar tmpbuf[NandfsPageSize];
  44. errmsg = nandfsreadpage(nandfs, tmpbuf, nil, block, page, 1, result);
  45. if (errmsg == nil)
  46. memmove(buf, tmpbuf + offset, count);
  47. return errmsg;
  48. }