static void vboxImageEvtU64(uint32_t uCmd, uint64_t uValue) { RTUINT64U u; /* 64-bit shift builtins. */ u.u = uValue; ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_MAKE(uCmd, u.au16[3])); ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_MAKE(uCmd, u.au16[2])); ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_MAKE(uCmd, u.au16[1])); ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_MAKE(uCmd, u.au16[0])); }
static void vboxImageEvtEmitOne(PE_COFF_LOADER_IMAGE_CONTEXT const *pImageCtx, uint32_t uEvt) { ASMOutU32(EFI_PORT_IMAGE_EVENT, uEvt); if (pImageCtx->DestinationAddress) vboxImageEvtU64(EFI_IMAGE_EVT_CMD_ADDR0, pImageCtx->DestinationAddress); else vboxImageEvtU64(EFI_IMAGE_EVT_CMD_ADDR0, pImageCtx->ImageAddress); vboxImageEvtU64(EFI_IMAGE_EVT_CMD_SIZE0, pImageCtx->ImageSize); if (pImageCtx->PdbPointer) vboxImageEvtString(EFI_IMAGE_EVT_CMD_NAME, pImageCtx->PdbPointer); ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_CMD_COMPLETE); }
static void VBoxWriteNVRAMNameParam(const CHAR16 *pwszName) { UINT32 i; UINT32 cwcName = StrLen(pwszName); ASMOutU32(EFI_VARIABLE_OP, EFI_VM_VARIABLE_OP_NAME_UTF16); for (i = 0; i <= cwcName; i++) ASMOutU16(EFI_VARIABLE_PARAM, pwszName[i]); }
/** * Reads a key by name from the host SMC. * * @returns success indicator. * @param pszName The key name, must be exactly 4 chars long. * @param pbBuf The output buffer. * @param cbBuf The buffer size. Max 32 bytes. */ static bool devR0SmcQueryHostKey(const char *pszName, uint8_t *pbBuf, size_t cbBuf) { Assert(strlen(pszName) == 4); Assert(cbBuf <= 32); Assert(cbBuf > 0); /* * Issue the READ command. */ uint32_t cMsSleep = 1; for (;;) { ASMOutU32(SMC_PORT_CMD, SMC_CMD_GET_KEY_VALUE); RTThreadSleep(cMsSleep); uint8_t bCurState = ASMInU8(SMC_PORT_CMD); if ((bCurState & 0xf) == 0xc) break; cMsSleep <<= 1; if (cMsSleep > 64) { LogRel(("devR0Smc: %s: bCurState=%#x, wanted %#x.\n", "cmd", bCurState, 0xc)); return false; } } /* * Send it the key. */ for (unsigned off = 0; off < 4; off++) { ASMOutU8(SMC_PORT_DATA, pszName[off]); if (!devR0SmcWaitHostState(4, "key")) return false; } /* * The desired amount of output. */ ASMOutU8(SMC_PORT_DATA, (uint8_t)cbBuf); /* * Read the output. */ for (size_t off = 0; off < cbBuf; off++) { if (!devR0SmcWaitHostState(5, off ? "data" : "len")) return false; pbBuf[off] = ASMInU8(SMC_PORT_DATA); } LogRel(("SMC: pbBuf=%.*s\n", cbBuf, pbBuf)); return true; }
/* * Internal Functions * */ static UINT32 GetVmVariable(UINT32 Variable, CHAR8* Buffer, UINT32 Size ) { UINT32 VarLen, i; ASMOutU32(EFI_INFO_PORT, Variable); VarLen = ASMInU32(EFI_INFO_PORT); for (i=0; i < VarLen && i < Size; i++) { Buffer[i] = ASMInU8(EFI_INFO_PORT); } return VarLen; }
DECLR0VBGL(int) VbglR0GRPerform(VMMDevRequestHeader *pReq) { int rc = vbglR0Enter(); if (RT_SUCCESS(rc)) { if (pReq) { RTCCPHYS PhysAddr = VbglR0PhysHeapGetPhysAddr(pReq); if ( PhysAddr != 0 && PhysAddr < _4G) /* Port IO is 32 bit. */ { ASMOutU32(g_vbgldata.portVMMDev + VMMDEV_PORT_OFF_REQUEST, (uint32_t)PhysAddr); /* Make the compiler aware that the host has changed memory. */ ASMCompilerBarrier(); rc = pReq->rc; } else rc = VERR_VBGL_INVALID_ADDR; } else rc = VERR_INVALID_PARAMETER; } return rc; }
static inline UINT32 VBoxWriteNVRAMGuidParam(const EFI_GUID *pGuid) { ASMOutU32(EFI_VARIABLE_OP, EFI_VM_VARIABLE_OP_GUID); return VBoxWriteNVRAMByteArrayParam((UINT8 *)pGuid, sizeof(EFI_GUID)); }
static inline void VBoxWriteNVRAMU32Param(UINT32 u32CodeParam, UINT32 u32Param) { ASMOutU32(EFI_VARIABLE_OP, u32CodeParam); ASMOutU32(EFI_VARIABLE_PARAM, u32Param); }
DECLINLINE(UINT32) VBoxWriteNVRAMGuidParam(const EFI_GUID *pGuid) { ASMOutU32(EFI_PORT_VARIABLE_OP, EFI_VM_VARIABLE_OP_GUID); return VBoxWriteNVRAMByteArrayParam((UINT8 *)pGuid, sizeof(EFI_GUID)); }
DECLINLINE(void) VBoxWriteNVRAMU32Param(UINT32 u32CodeParam, UINT32 u32Param) { ASMOutU32(EFI_PORT_VARIABLE_OP, u32CodeParam); ASMOutU32(EFI_PORT_VARIABLE_PARAM, u32Param); }
static void vboxImageEvtString(uint32_t uCmd, const char *pszName) { unsigned char uch; while ((uch = *pszName++) != '\0') ASMOutU32(EFI_PORT_IMAGE_EVENT, EFI_IMAGE_EVT_MAKE(uCmd, uch)); }