Esempio n. 1
0
void *IPC_BufferFill(IPC_Buffer Buffer, void *SourcePtr, IPC_U32 SourceLength)
{
	IPC_Buffer_T *BufferPtr;
	IPC_U32 MaxDataSize;

	if (SourceLength == 0)
		return NULL;

	BufferPtr = IPC_BufferToPtr(Buffer);
	if (BufferPtr == 0) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferFill",
			  "Invalid Buffer %d", Buffer, 0, 0, 0);
		return NULL;
	}

	MaxDataSize = IPC_PoolMaxDataSize(BufferPtr->Pool);

	if (MaxDataSize < SourceLength) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferFill",
			  "Buffer %08X, Length %d too big", Buffer,
			  SourceLength, 0, 0);
		return NULL;
	}

	IPC_TRACE(IPC_Channel_Data, "IPC_BufferFill",
		  "Buffer %08X, From %08P, Length %d", Buffer, SourcePtr,
		  SourceLength, 0);

	BufferPtr->DataSize = SourceLength;

	return memcpy(IPC_SmAddress(BufferPtr->DataOffset), SourcePtr,
		      SourceLength);
}
Esempio n. 2
0
void *IPC_BufferHeaderRemove(IPC_Buffer Buffer, IPC_U32 HeaderSize)
{
	IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer);

	if (BufferPtr == 0) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderRemove",
			  "Invalid Buffer %d", Buffer, 0, 0, 0);
		return 0;
	}

	if (HeaderSize > BufferPtr->HeaderSize) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderRemove",
			  "Buffer %08X, HeaderSize %d too big", Buffer,
			  HeaderSize, 0, 0);
		return 0;
	} else {

		IPC_TRACE(IPC_Channel_Data, "IPC_BufferHeaderRemove",
			  "Buffer %08X, HeaderSize %d", Buffer, HeaderSize, 0,
			  0);
		BufferPtr->HeaderSize -= HeaderSize;
		return IPC_SmAddress(BufferPtr->DataOffset -
				     BufferPtr->HeaderSize);
	}
}
Esempio n. 3
0
void *IPC_BufferHeaderPointer(IPC_Buffer Buffer)
{
	IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer);

	if (BufferPtr == 0) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderPointer",
			  "Invalid Buffer %d", Buffer, 0, 0, 0);
		return 0;
	}

	IPC_TRACE(IPC_Channel_Data, "IPC_BufferHeaderPointer", "Buffer %08X",
		  Buffer, 0, 0, 0);

	return IPC_SmAddress(BufferPtr->DataOffset - BufferPtr->HeaderSize);
}
Esempio n. 4
0
void *IPC_BufferFillByLinkList(IPC_Buffer Buffer,
				IPC_LinkList_T *LinkListPtr,
				IPC_U32 LinkListLength)
{
	IPC_Buffer_T *BufferPtr;
	IPC_U32 MaxDataSize;
	IPC_U32 SourceLength;
	IPC_U32 i;
	unsigned char *p;
	unsigned char *q;

	SourceLength = 0;
	for (i = 0; i < LinkListLength; i++)
		SourceLength += LinkListPtr[i].size;

	if (SourceLength == 0)
		return NULL;

	BufferPtr = IPC_BufferToPtr(Buffer);
	if (BufferPtr == 0) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferFillByLinkList",
			  "Invalid Buffer %d", Buffer, 0, 0, 0);
		return NULL;
	}

	MaxDataSize = IPC_PoolMaxDataSize(BufferPtr->Pool);

	if (MaxDataSize < SourceLength) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferFillByLinkList",
			  "Buffer %08X, Length %d too big", Buffer,
			  SourceLength, 0, 0);
		return NULL;
	}

	IPC_TRACE(IPC_Channel_Data, "IPC_BufferFillByLinkList",
		  "Buffer %08X, LinkListPtr %08X, Length %d", Buffer,
		  LinkListPtr, SourceLength, 0);

	BufferPtr->DataSize = SourceLength;

	p = q = IPC_SmAddress(BufferPtr->DataOffset);
	for (i = 0; i < LinkListLength; i++) {
		memcpy(p, LinkListPtr[i].byte_array, LinkListPtr[i].size);
		p += LinkListPtr[i].size;
	}
	return (void *)q;
}
Esempio n. 5
0
void *IPC_BufferDataPointer(IPC_Buffer Buffer)
{
	IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer);
	IPC_SmPtr DataOffset = 0;

	if (BufferPtr == 0) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferDataPointer",
			  "Invalid Buffer %d", Buffer, 0, 0, 0);
		return 0;
	}
	DataOffset = BufferPtr->DataOffset;

	IPC_TRACE(IPC_Channel_Data, "IPC_BufferDataPointer",
		  "Buffer %08X, Ptr %08X", Buffer, DataOffset, 0, 0);

	if (DataOffset >= ((IPC_SmControl) SmBase)->Size) {
		IPC_TRACE(IPC_Channel_Error, "IPC_BufferDataPointer",
			  "Invalid Pointer %08X", DataOffset, 0, 0, 0);
		return 0;
	}

	return IPC_SmAddress(DataOffset);
}