/* Initialize the memory buffer including its checksum. * No changes alloed to the header and the tail after that. */ HGSMIOFFSET HGSMIBufferInitializeSingle (const HGSMIAREA *pArea, HGSMIBUFFERHEADER *pHeader, HGSMISIZE cbBuffer, uint8_t u8Channel, uint16_t u16ChannelInfo) { if (cbBuffer < HGSMIBufferMinimumSize ()) { return HGSMIOFFSET_VOID; } return hgsmiBufferInitializeSingle (pArea, pHeader, cbBuffer - HGSMIBufferMinimumSize (), u8Channel, u16ChannelInfo); }
/* Initialize the memory buffer including its checksum. * No changes alloed to the header and the tail after that. */ HGSMIOFFSET HGSMIBufferInitializeSingle(const HGSMIAREA *pArea, HGSMIBUFFERHEADER *pHeader, HGSMISIZE cbBuffer, uint8_t u8Channel, uint16_t u16ChannelInfo) { if ( !pArea || !pHeader || cbBuffer < HGSMIBufferMinimumSize()) { return HGSMIOFFSET_VOID; } /* Buffer must be within the area: * * header data size do not exceed the maximum data size; * * buffer address is greater than the area base address; * * buffer address is lower than the maximum allowed for the given data size. */ HGSMISIZE cbMaximumDataSize = pArea->offLast - pArea->offBase; uint32_t u32DataSize = cbBuffer - HGSMIBufferMinimumSize(); if ( u32DataSize > cbMaximumDataSize || (uint8_t *)pHeader < pArea->pu8Base || (uint8_t *)pHeader > pArea->pu8Base + cbMaximumDataSize - u32DataSize) { return HGSMIOFFSET_VOID; } HGSMIOFFSET offBuffer = HGSMIPointerToOffset(pArea, pHeader); pHeader->u8Flags = HGSMI_BUFFER_HEADER_F_SEQ_SINGLE; pHeader->u32DataSize = u32DataSize; pHeader->u8Channel = u8Channel; pHeader->u16ChannelInfo = u16ChannelInfo; RT_ZERO(pHeader->u.au8Union); HGSMIBUFFERTAIL *pTail = HGSMIBufferTailFromPtr(pHeader, u32DataSize); pTail->u32Reserved = 0; pTail->u32Checksum = HGSMIChecksum(offBuffer, pHeader, pTail); return offBuffer; }
int HGSMIAreaInitialize (HGSMIAREA *pArea, void *pvBase, HGSMISIZE cbArea, HGSMIOFFSET offBase) { uint8_t *pu8Base = (uint8_t *)pvBase; if ( !pArea /* Check that the area: */ || cbArea < HGSMIBufferMinimumSize () /* Large enough. */ || pu8Base + cbArea < pu8Base /* No address space wrap. */ || offBase > UINT32_C(0xFFFFFFFF) - cbArea /* Area within the 32 bit space: offBase + cbMem <= 0xFFFFFFFF */ ) { return VERR_INVALID_PARAMETER; } pArea->pu8Base = pu8Base; pArea->offBase = offBase; pArea->offLast = cbArea - HGSMIBufferMinimumSize () + offBase; pArea->cbArea = cbArea; return VINF_SUCCESS; }