static uint64_t ReadMMIO(uint64_t phys, uint8_t length){ uint64_t value = 0; //uint32_t *ioaddr; IOMemoryDescriptor* io_desc; IOMemoryMap* io_map; uint64_t page_offset = phys & PAGE_MASK; log_addr((uint64_t) page_offset, 64, "page_offset"); xlate_pa_va(phys, &io_desc, &io_map); if(io_map) { log_addr(io_map->getVirtualAddress(), 64, "io_map->getVirtualAddress"); switch (length) { case 1: value = *(volatile uint8_t *)((uintptr_t)(io_map->getVirtualAddress()) + page_offset); break; case 2: value = OSReadLittleInt16((void *)io_map->getVirtualAddress(), page_offset); break; case 4: value = OSReadLittleInt32((void *)io_map->getVirtualAddress(), page_offset); break; case 8: value = OSReadLittleInt64((void *)io_map->getVirtualAddress(), page_offset); default: pmem_error("ReadMMIO Incorrect read length"); break; } // DEBUG //ioaddr = (uint32_t *) (io_map->getVirtualAddress() + page_offset); //log_addr((uint64_t)ioaddr, 64, "ioaddr"); } unxlate_pa_va(&io_desc, &io_map); return value; }
/* * Examine a volume to see if we recognize it as a mountable. */ void NTFSGetDescription(CICell ih, char *str, long strMaxLen) { struct bootfile *boot; unsigned bytesPerSector; unsigned sectorsPerCluster; int mftRecordSize; u_int64_t totalClusters; u_int64_t cluster, mftCluster; size_t mftOffset; void *nameAttr; size_t nameSize; char *buf; buf = (char *)malloc(MAX_CLUSTER_SIZE); if (buf == 0) { goto error; } /* * Read the boot sector, check signatures, and do some minimal * sanity checking. NOTE: the size of the read below is intended * to be a multiple of all supported block sizes, so we don't * have to determine or change the device's block size. */ Seek(ih, 0); Read(ih, (long)buf, MAX_BLOCK_SIZE); boot = (struct bootfile *) buf; /* * The first three bytes are an Intel x86 jump instruction. I assume it * can be the same forms as DOS FAT: * 0xE9 0x?? 0x?? * 0xEC 0x?? 0x90 * where 0x?? means any byte value is OK. */ if (boot->reserved1[0] != 0xE9 && (boot->reserved1[0] != 0xEB || boot->reserved1[2] != 0x90)) { goto error; } /* * Check the "NTFS " signature. */ if (memcmp((const char *)boot->bf_sysid, "NTFS ", 8) != 0) { goto error; } /* * Make sure the bytes per sector and sectors per cluster are * powers of two, and within reasonable ranges. */ bytesPerSector = OSReadLittleInt16(&boot->bf_bps,0); if ((bytesPerSector & (bytesPerSector-1)) || bytesPerSector < 512 || bytesPerSector > 32768) { //verbose("NTFS: invalid bytes per sector (%d)\n", bytesPerSector); goto error; } sectorsPerCluster = boot->bf_spc; /* Just one byte; no swapping needed */ if ((sectorsPerCluster & (sectorsPerCluster-1)) || sectorsPerCluster > 128) { //verbose("NTFS: invalid sectors per cluster (%d)\n", bytesPerSector); goto error; } /* * Calculate the number of clusters from the number of sectors. * Then bounds check the $MFT and $MFTMirr clusters. */ totalClusters = OSReadLittleInt64(&boot->bf_spv,0) / sectorsPerCluster; mftCluster = OSReadLittleInt64(&boot->bf_mftcn,0); if (mftCluster > totalClusters) { ////verbose("NTFS: invalid $MFT cluster (%lld)\n", mftCluster); goto error; } cluster = OSReadLittleInt64(&boot->bf_mftmirrcn,0); if (cluster > totalClusters) { //verbose("NTFS: invalid $MFTMirr cluster (%lld)\n", cluster); goto error; } /* * Determine the size of an MFT record. */ mftRecordSize = (int8_t) boot->bf_mftrecsz; if (mftRecordSize < 0) mftRecordSize = 1 << -mftRecordSize; else mftRecordSize *= bytesPerSector * sectorsPerCluster; //verbose("NTFS: MFT record size = %d\n", mftRecordSize); /* * Read the MFT record for $Volume. This assumes the first four * file records in the MFT are contiguous; if they aren't, we * would have to map the $MFT itself. * * This will fail if the device sector size is larger than the * MFT record size, since the $Volume record won't be aligned * on a sector boundary. */ mftOffset = mftCluster * sectorsPerCluster * bytesPerSector; mftOffset += mftRecordSize * NTFS_VOLUMEINO; Seek(ih, mftOffset); Read(ih, (long)buf, mftRecordSize); #if UNUSED if (lseek(fd, mftOffset, SEEK_SET) == -1) { //verbose("NTFS: lseek to $Volume failed: %s\n", strerror(errno)); goto error; } if (read(fd, buf, mftRecordSize) != mftRecordSize) { //verbose("NTFS: error reading MFT $Volume record: %s\n", strerror(errno)); goto error; }
uint64_t xle64dec(const uint8_t *d) { return OSReadLittleInt64(d, 0); }