diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SigComp/SigCompEngine/inc/Udvm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SigComp/SigCompEngine/inc/Udvm.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,880 @@ +/* +* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Name : Udvm.h +* Part of : SigComp / UDVM +* Interface : +* UDVM core +* Version : 1.0 +* +*/ + + + + +/** + @internalComponent +*/ + + +#ifndef UDVM_H +#define UDVM_H + +// INCLUDES +#include +#include + +class CUdvmMemory; +class CMessageReader; + +//consts +static const TUint KMaxUdvmMemorySize = 65536; +static const TUint KMaxUdvmMemoryMask = 0xffff; +static const TUint KSigCompHeaderMask = 0xF8; +static const TInt KSigCompHeaderTBit = 2; +static const TInt KSigCompHeaderTMask = (1 << KSigCompHeaderTBit); +static const TInt KSigCompHeaderLenMask = 0x03; +static const TInt KReturnedFeedbackFieldBit = 7; +static const TInt KReturnedFeedbackFieldMask = + (1 << KReturnedFeedbackFieldBit); +static const TInt KReturnedFeedbackLengthMask = 0x7f; +static const TUint KMax8BitValueMask = 0xff; +static const TUint KMax16BitValueMask = 0xffff; +static const TUint KMaxStateOperations = 4; +static const TInt KMaxOutputSize = 65536; + +// CLASS DECLARATION + +/* UDVM memory and registers map + + 0 7 8 15 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | UDVM_memory_size | 0 - 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | cycles_per_bit | 2 - 3 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | SigComp_version | 4 - 5 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | partial_state_ID_length | 6 - 7 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | state_length | 8 - 9 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + : reserved : 10 - 31 + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + : zeroed scratch-pad memory : 32 - 63 + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + registers + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | byte_copy_left | 64 - 65 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | byte_copy_right | 66 - 67 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | input_bit_order | 68 - 69 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | stack_location | 70 - 71 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +*/ + + +/** +* Class for holding state create/free operation requestes +* +* +* @lib sigcomp +*/ + +class TStateOperationRequest + { + + public: + TUint iOperation; + + /** state create parameters */ + TUint16 iStateLength; + TUint16 iStateAddress; + TUint16 iStateInstruction; + TUint16 iMinimumAccessLength; + TUint16 iStateRetentionPriority; + CArrayFixFlat* iStateValue; + + /** state free parameters */ + TUint16 iPartialIdentifierStart; + TUint16 iPartialIdentifierLength; + }; + +/** +* Universal decompression virtual machine core class. +* +* +* @lib sigcomp +*/ + +class CSigCompCompartment; +class CStateMgr; +class TStateItem; + +class CUdvm : public CBase + { + + public: // enumerators + + /** memory and registers map + * as defined in RFC3220 chapter 7.2. + **/ + enum TMemMap + { + EMem_UDVM_memory_size = 0, + EMem_cycles_per_bit = 2, + EMem_SigComp_version = 4, + EMem_partial_state_ID_length = 6, + EMem_state_length = 8, + EMem_reserved = 10, + EMem_scratch_pad = 32, + EMem_registers = 64, + //register block definition starts here + EReg_byte_copy_left = 64, + EReg_byte_copy_right = 66, + EReg_input_bit_order = 68, + EReg_stack_location = 70, + EMem_user_area = 72 + }; + + /** input_bit_order flags */ + enum TIBOFlags + { + EIBOFlag_P = 1, + EIBOFlag_H = 2, + EIBOFlag_F = 4 + }; + + /** requested feedback flags */ + enum TRFFlags + { + ERFFlag_I = 1, + ERFFlag_S = 2, + ERFFlag_Q = 4 + }; + + /** UDVM bytecodes */ + enum TOpcode + { + EOpcode_DECOMPRESSION_FAILURE = 0, + EOpcode_AND = 1, + EOpcode_OR = 2, + EOpcode_NOT = 3, + EOpcode_LSHIFT = 4, + EOpcode_RSHIFT = 5, + EOpcode_ADD = 6, + EOpcode_SUBTRACT = 7, + EOpcode_MULTIPLY = 8, + EOpcode_DIVIDE = 9, + EOpcode_REMAINDER = 10, + EOpcode_SORT_ASCENDING = 11, + EOpcode_SORT_DESCENDING = 12, + EOpcode_SHA_1 = 13, + EOpcode_LOAD = 14, + EOpcode_MULTILOAD = 15, + EOpcode_PUSH = 16, + EOpcode_POP = 17, + EOpcode_COPY = 18, + EOpcode_COPY_LITERAL = 19, + EOpcode_COPY_OFFSET = 20, + EOpcode_MEMSET = 21, + EOpcode_JUMP = 22, + EOpcode_COMPARE = 23, + EOpcode_CALL = 24, + EOpcode_RETURN = 25, + EOpcode_SWITCH = 26, + EOpcode_CRC = 27, + EOpcode_INPUT_BYTES = 28, + EOpcode_INPUT_BITS = 29, + EOpcode_INPUT_HUFFMAN = 30, + EOpcode_STATE_ACCESS = 31, + EOpcode_STATE_CREATE = 32, + EOpcode_STATE_FREE = 33, + EOpcode_OUTPUT = 34, + EOpcode_END_MESSAGE = 35, + EOpcodesNumber = 36 + }; + + + public: // Constructors and destructor + + /** + * @param aStateMgr state manager + * @param aMemSize UDVM memory size in bytes + * @param aCyclesPerBit the amount of "UDVM cycles" available + * to decompress each bit in SigComp message + */ + + static CUdvm* NewL(CStateMgr* aStateMgr, + TUint aMemSize, + TUint aCyclesPerBit); + + static CUdvm* NewLC(CStateMgr* aStateMgr, + TUint aMemSize, + TUint aCyclesPerBit); + + /** + * Destructor. + */ + + virtual ~CUdvm(); + + + public: // New functions + + /** + * Decompress message. + * + * @param aMessage message to decompression + * @param aBytesConsumed on return will contain the number of bytes + * consumed by the decompression from the + * original message + * + * @returns decompressed message, the ownership is transferred + */ + + CBufBase* DecompressL(const TDesC8& aMessage, TUint& aBytesConsumed, + TBool aStreamBasedProtocol); + + + /** + * Execute UDVM code. + * + * @param aMsgReader message reader. + * + */ + + void ExecuteCodeL(CMessageReader* aMsgReader); + + /** + * Allow for state operations. + * + * @param aCompartment compartment + * + * @returns number of completed state operations + */ + + TInt AllowStateOperationsL(CSigCompCompartment* aCompartment); + + /** + * Deny state operations. + * + */ + + void DenyStateOperations(); + + /** + * Resolve "byte copying". Find continuous block in bcl/bcr range from + * given address. Leave if out of memory bounds. + * + * @param aAddress address of area + * @param aLength length of area + * @param aBcl UDVM bcl register value + * @param aBcr UDVM bcr register value + * + * @returns number of bytes to copy continuous block + * + * @post aAddress and aLength is updated to next block address and + * length + */ + + TUint ByteCopyingFragmentL(TUint& aAddress, + TUint& aLength, + TUint aBcl, TUint aBcr) const; + + + /** + * Compare MinmumStateAccessLength with AccessLength + * Leave if AccessLength too small. + * + * @param aStateItem state item + * @param aAccessLen candidate access length + * + */ + + void TestStateAccessLenL(const TStateItem* aStateItem, + TUint aAccessLen) const; + + + /** + * Get a portion of bits from input stream. + * + * @param aSize number of bits to get + * @param aP P flag of input_bit_order UDVM register + * @param aF F flag of input_bit_order UDVM register + * + * @returns value + */ + + TUint InputMessageBitsL(TUint aSize, TUint aP, TUint aF); + + + /** + * Decode literal bytecode operand. + * + * @param aAddress address in UDVM memory + * + * @returns value + * + * @post aAddress is updated + */ + + TUint DecodeLiteralOperandL(TUint& aAddress) const; + + + /** + * Decode reference bytecode operand. + * + * @param aAddress address in UDVM memory + * + * @returns address of value in UDVM memory + * + * @post aAddress is updated + */ + + TUint DecodeReferenceOperandL(TUint& aAddress) const; + + + /** + * Decode multitype bytecode operand. + * + * @param aAddress address in UDVM memory + * + * @returns operand value + * + * @post aAddress is updated + */ + + TUint DecodeMultitypeOperandL(TUint& aAddress) const; + + + /** + * Decode address bytecode operand. + * + * @param aPc current value of UDVM PC "register" + * @param aAddress address in UDVM memory + * + * @returns operand value + * + * @post aAddress is updated + */ + + TUint DecodeAddressOperandL(TUint aPC, TUint& aAddress) const; + + + /** + * Upload bytecode, initialize UDVM memory and registers. + * + * @param aDest destination address in UDVM memory + * @param aLen code length + * @param aMsgReader message reader. + * + */ + + void UploadCodeL(TUint aDest, TUint aLen, CMessageReader* aMsgReader); + + + /** + * Upload state, initialize UDVM memory and registers. + * + * @param aStateLen partial state identifier length + * @param aState partial state identifier + * + */ + + void UploadStateL(TUint aStateLen, const TUint8* aState); + + + /** + * Set returned feedback + * + * @param aT T flag. + * @param aMsgReader message reader. + * + */ + + void SetReturnedFeedbackL(TBool aT, CMessageReader* aMsgReader); + + /** + * Upload state in message + * + * @param aLen length + * @param aMsgReader message reader. + * + */ + + void UploadStateInMessageL(TUint aLen, CMessageReader* aMsgReader); + + /** + * Upload bytecode in message + * + * @param aMsgReader message reader. + * + */ + void UploadBytecodeInMessageL(CMessageReader* aMsgReader); + +#if defined(SIGCOMP_DEBUG) + /** + * Get consumed cycles number + * + * @returns consumed cycles number. + * + */ + TUint CyclesConsumed() const; +#endif + + private: + CUdvm(); + + /** + * execute opcode "Decompression failure". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeDecompressionFailureL(TUint& aPc2); + + /** + * execute opcode "AND + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeAndL(TUint& aPc2); + + /** + * execute opcode "OR + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeOrL(TUint& aPc2); + + /** + * execute opcode "NOT + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeNotL(TUint& aPc2); + + /** + * execute opcode "LSHIFT + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeLShiftL(TUint& aPc2); + + /** + * execute opcode "RSHIFT + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeRShiftL(TUint& aPc2); + + /** + * execute opcode "ADD + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeAddL(TUint& aPc2); + + /** + * execute opcode "SUBTRACT" + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeSubtractL(TUint& aPc2); + + /** + * execute opcode "MULTIPLY" + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeMultiplyL(TUint& aPc2); + + /** + * execute opcode "DIVIDE". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeDivideL(TUint& aPc2); + + /** + * execute opcode "REMAINDER". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeRemainderL(TUint& aPc2); + + /** + * execute opcode "ascending". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeAscendingL(TUint& aPc2); + + /** + * execute opcode "DESCENDING". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeDescendingL(TUint& aPc2); + + /** + * execute opcode "SHA1". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeSha1L(TUint& aPc2); + + /** + * execute opcode "LOAD". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeLoadL(TUint& aPc2); + + /** + * execute opcode "MULTILOAD". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeMultiloadL(TUint& aPc2); + + /** + * execute opcode "PUSH". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodePushL(TUint& aPc2); + + /** + * execute opcode "POP". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodePopL(TUint& aPc2); + + /** + * execute opcode "COPY". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCopyL(TUint& aPc2); + + /** + * execute opcode "COPYLITERAL". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCopyLiteralL(TUint& aPc2); + + /** + * execute opcode "COPY OFFSET". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCopyOffsetL(TUint& aPc2); + + /** + * execute opcode "MEMSET". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeMemsetL(TUint& aPc2); + + /** + * execute opcode "COMPARE". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCompareL(TUint& pc2); + + /** + * execute opcode "CALL". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCallL(TUint& pc2); + + /** + * execute opcode "RETURN". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeReturnL(TUint& pc2); + + /** + * execute opcode "SWITCH". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeSwitchL(TUint& pc2); + + /** + * execute opcode "CRC". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeCrcL(TUint& aPc2); + + /** + * execute opcode "INPUT BYTES". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeInputBytesL(TUint& aPc2); + + /** + * execute opcode "INPUT BITS". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeInputBitsL(TUint& aPc2); + + /** + * execute opcode "INPUT HUFFMAN". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeInputHuffmanL(TUint& aPc2); + + /** + * execute opcode "STATE ACCESS". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeStateAccessL(TUint& aPc2); + + /** + * execute opcode "STATE CREATE". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeStateCreateL(TUint& aPc2); + + /** + * execute opcode "STATE FREE". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeStateFreeL(TUint& aPc2); + + /** + * execute opcode "ENDMESSAGE". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeEndMessageL(TUint& aPc2); + + /** + * execute opcode "OUTPUT". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeOutputL(TUint& aPc2); + + /** + * execute opcode "JUMP". + * + * @param aPc2 program counter + * + * @returns ETrue if opcode causes termination of UDVM program + * + */ + TBool ExecuteOpcodeJumpL(TUint& aPc2); + + protected: + void ConstructL(CStateMgr* aStateMgr, + TUint aMemSize, + TUint aCyclesPerBit); + + + private: // Data + + /** start instruction */ + TUint iCodeStart; + + /** cycles per bit */ + TUint iCyclesPerBit; + + /** cycles available for decompression */ + TUint iAvailableCycles; + + /** output (decompressed) message buffer */ + CBufFlat* iOutputBuffer; // Not owned + + /** UDVM memory */ + CUdvmMemory* iUdvmMemory; + + /** input message reader */ + CMessageReader* iInputMessageReader; + + /** last message input byte value */ + TUint iLastInputByte; + + /** used bits from last input byte */ + TUint iLastUsedInputBit; + + /** input bit order */ + TUint iLastIBO; + + /** SHA-1 instance */ + CSHA1* iSHA1; + + /** state manager */ + CStateMgr* iStateMgr; + + /** state operation requests */ + TStateOperationRequest iStateOperationRequests[8]; + + /** current number of state create requests*/ + TUint iStateCreateRequestsNumber; + + /** current number of state free requests */ + TUint iStateFreeRequestsNumber; + + /** returned feedback */ + TPtr8 iReturnedFeedback; + + /** requested feedback */ + TPtr8 iRequestedFeedback; + + /** returned parameters */ + TPtr8 iReturnedParameters; + + /** current used cycles */ + TUint iCycles; + + /** UDVM instruction lookup table */ + TBool (CUdvm:: * iExecuteOpcode[EOpcodesNumber])(TUint& aPc2); + + }; + +#endif + +// End of File