virtual void copyRawContent(uint8_t buffer[]) const { // Use ARM instructions that can jump to thumb. assert( ! _target->isThumb() ); if (_s_log) fprintf(stderr, "3 Thumb2 instruction shim to jump to %s\n", _target->name()); OSWriteLittleInt32(&buffer[0], 0, 0xc004f8df); // ldr ip, pc + 4 OSWriteLittleInt16(&buffer[4], 0, 0x44fc); // add ip, pc, ip OSWriteLittleInt16(&buffer[6], 0, 0x4760); // bx ip OSWriteLittleInt32(&buffer[8], 0, 0x00000000); // .long target-this }
/* write a 16-bit word, little endian */ void appendUint16( CFMutableDataRef buf, uint16_t word) { unsigned char cb[2]; OSWriteLittleInt16(cb, 0, word); CFDataAppendBytes(buf, cb, 2); }
/* * Write a security buffer, providing the index into the CFData at which * this security buffer's offset is located. Just before the actual data is written, * go back and update the offset with the start of that data using secBufOffset(). */ void appendSecBuf( CFMutableDataRef buf, uint16_t len, CFIndex *offsetIndex) { #if 1 unsigned char cb[8]; OSWriteLittleInt16(cb, 0, len); /* buffer length */ OSWriteLittleInt16(cb, 2, len); /* buffer allocated size */ OSWriteLittleInt32(cb, 4, 0); /* offset is empty for now */ CFDataAppendBytes(buf, cb, 8); *offsetIndex = CFDataGetLength(buf) - 4; /* offset will go here */ #else appendUint16(buf, len); /* buffer length */ appendUint16(buf, len); /* buffer allocated size */ *offsetIndex = CFDataGetLength(buf); /* offset will go here */ appendUint32(buf, 0); /* but it's empty for now */ #endif }
virtual void copyRawContent(uint8_t buffer[]) const { // Use ARM instructions that can jump to thumb. assert( ! _target->isThumb() ); if (_s_log) fprintf(stderr, "6 Thumb1 instruction shim to jump to %s\n", _target->name()); OSWriteLittleInt16(&buffer[ 0], 0, 0xb402); // push {r1} OSWriteLittleInt16(&buffer[ 2], 0, 0x4902); // ldr r1, [pc, #8] OSWriteLittleInt16(&buffer[ 4], 0, 0x4479); // add r1, pc OSWriteLittleInt16(&buffer[ 6], 0, 0x468c); // mov ip, r1 OSWriteLittleInt16(&buffer[ 8], 0, 0xbc02); // pop {r1} OSWriteLittleInt16(&buffer[10], 0, 0x4760); // bx ip OSWriteLittleInt32(&buffer[12], 0, 0x00000000); // .long target-this }
static uint64_t WriteMMIO(uint64_t phys, uint8_t length, uint64_t value){ 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: *(volatile uint8_t *)((uintptr_t)io_map->getVirtualAddress() + page_offset) = value; break; case 2: OSWriteLittleInt16((void *)io_map->getVirtualAddress(), page_offset, (uint16_t) value); break; case 4: OSWriteLittleInt32((void *)io_map->getVirtualAddress(), page_offset, (uint32_t) value); break; case 8: OSWriteLittleInt64((void *)io_map->getVirtualAddress(), page_offset, value); default: pmem_error("WriteMMIO Incorrect write length"); break; } } unxlate_pa_va(&io_desc, &io_map); return value; }