From 30fdf1140b8d1ce93f3821d986fa165552023440 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Fri, 17 Jul 2009 09:10:31 +0000 Subject: Check In tool source code based on Build tool project revision r1655. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8964 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c | 198 +++++++++++++++++++++ BaseTools/Source/C/PyEfiCompressor/Makefile | 12 ++ BaseTools/Source/C/PyEfiCompressor/setup.py | 43 +++++ 3 files changed, 253 insertions(+) create mode 100644 BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c create mode 100644 BaseTools/Source/C/PyEfiCompressor/Makefile create mode 100644 BaseTools/Source/C/PyEfiCompressor/setup.py (limited to 'BaseTools/Source/C/PyEfiCompressor') diff --git a/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c b/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c new file mode 100644 index 0000000000..38a81c3c27 --- /dev/null +++ b/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c @@ -0,0 +1,198 @@ +#include +#include + +/* + UefiDecompress(data_buffer, size, original_size) +*/ +STATIC +PyObject* +UefiDecompress( + PyObject *Self, + PyObject *Args + ) +{ + PyObject *SrcData; + UINT32 SrcDataSize; + UINT32 DstDataSize; + UINTN Status; + UINT8 *SrcBuf; + UINT8 *DstBuf; + UINT8 *TmpBuf; + Py_ssize_t SegNum; + Py_ssize_t Index; + + Status = PyArg_ParseTuple( + Args, + "Oi", + &SrcData, + &SrcDataSize + ); + if (Status == 0) { + return NULL; + } + + if (SrcData->ob_type->tp_as_buffer == NULL + || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL + || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) { + PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n"); + return NULL; + } + + // Because some Python objects which support "buffer" protocol have more than one + // memory segment, we have to copy them into a contiguous memory. + SrcBuf = PyMem_Malloc(SrcDataSize); + if (SrcBuf == NULL) { + PyErr_SetString(PyExc_Exception, "Not enough memory\n"); + goto ERROR; + } + + SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL); + TmpBuf = SrcBuf; + for (Index = 0; Index < SegNum; ++Index) { + VOID *BufSeg; + Py_ssize_t Len; + + Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg); + if (Len < 0) { + PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n"); + goto ERROR; + } + memcpy(TmpBuf, BufSeg, Len); + TmpBuf += Len; + } + + Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 1); + if (Status != EFI_SUCCESS) { + PyErr_SetString(PyExc_Exception, "Failed to decompress\n"); + goto ERROR; + } + + return PyBuffer_FromMemory(DstBuf, (Py_ssize_t)DstDataSize); + +ERROR: + if (SrcBuf != NULL) { + free(SrcBuf); + } + + if (DstBuf != NULL) { + free(DstBuf); + } + return NULL; +} + + +STATIC +PyObject* +FrameworkDecompress( + PyObject *Self, + PyObject *Args + ) +{ + PyObject *SrcData; + UINT32 SrcDataSize; + UINT32 DstDataSize; + UINTN Status; + UINT8 *SrcBuf; + UINT8 *DstBuf; + UINT8 *TmpBuf; + Py_ssize_t SegNum; + Py_ssize_t Index; + + Status = PyArg_ParseTuple( + Args, + "Oi", + &SrcData, + &SrcDataSize + ); + if (Status == 0) { + return NULL; + } + + if (SrcData->ob_type->tp_as_buffer == NULL + || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL + || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) { + PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n"); + return NULL; + } + + // Because some Python objects which support "buffer" protocol have more than one + // memory segment, we have to copy them into a contiguous memory. + SrcBuf = PyMem_Malloc(SrcDataSize); + if (SrcBuf == NULL) { + PyErr_SetString(PyExc_Exception, "Not enough memory\n"); + goto ERROR; + } + + SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL); + TmpBuf = SrcBuf; + for (Index = 0; Index < SegNum; ++Index) { + VOID *BufSeg; + Py_ssize_t Len; + + Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg); + if (Len < 0) { + PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n"); + goto ERROR; + } + memcpy(TmpBuf, BufSeg, Len); + TmpBuf += Len; + } + + Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 2); + if (Status != EFI_SUCCESS) { + PyErr_SetString(PyExc_Exception, "Failed to decompress\n"); + goto ERROR; + } + + return PyString_FromStringAndSize((CONST INT8*)DstBuf, (Py_ssize_t)DstDataSize); + +ERROR: + if (SrcBuf != NULL) { + free(SrcBuf); + } + + if (DstBuf != NULL) { + free(DstBuf); + } + return NULL; +} + + +STATIC +PyObject* +UefiCompress( + PyObject *Self, + PyObject *Args + ) +{ + return NULL; +} + + +STATIC +PyObject* +FrameworkCompress( + PyObject *Self, + PyObject *Args + ) +{ + return NULL; +} + +STATIC INT8 DecompressDocs[] = "Decompress(): Decompress data using UEFI standard algorithm\n"; +STATIC INT8 CompressDocs[] = "Compress(): Compress data using UEFI standard algorithm\n"; + +STATIC PyMethodDef EfiCompressor_Funcs[] = { + {"UefiDecompress", (PyCFunction)UefiDecompress, METH_VARARGS, DecompressDocs}, + {"UefiCompress", (PyCFunction)UefiCompress, METH_VARARGS, DecompressDocs}, + {"FrameworkDecompress", (PyCFunction)FrameworkDecompress, METH_VARARGS, DecompressDocs}, + {"FrameworkCompress", (PyCFunction)FrameworkCompress, METH_VARARGS, DecompressDocs}, + {NULL, NULL, 0, NULL} +}; + +PyMODINIT_FUNC +initEfiCompressor(VOID) { + Py_InitModule3("EfiCompressor", EfiCompressor_Funcs, "EFI Compression Algorithm Extension Module"); +} + + diff --git a/BaseTools/Source/C/PyEfiCompressor/Makefile b/BaseTools/Source/C/PyEfiCompressor/Makefile new file mode 100644 index 0000000000..502735bfea --- /dev/null +++ b/BaseTools/Source/C/PyEfiCompressor/Makefile @@ -0,0 +1,12 @@ +!INCLUDE ..\Makefiles\ms.common + +APPNAME = GenSec + +LIBS = $(LIB_PATH)\Common.lib + +OBJECTS = GenSec.obj + +#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib + +!INCLUDE ..\Makefiles\ms.app + diff --git a/BaseTools/Source/C/PyEfiCompressor/setup.py b/BaseTools/Source/C/PyEfiCompressor/setup.py new file mode 100644 index 0000000000..508ac83516 --- /dev/null +++ b/BaseTools/Source/C/PyEfiCompressor/setup.py @@ -0,0 +1,43 @@ +## @file +# package and install PyEfiCompressor extension +# +# Copyright (c) 2008, Intel Corporation +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +from distutils.core import setup, Extension +import os + +if 'BASE_TOOLS_PATH' not in os.environ: + raise "Please define BASE_TOOLS_PATH to the root of base tools tree" + +BaseToolsDir = os.environ['BASE_TOOLS_PATH'] +setup( + name="EfiCompressor", + version="0.01", + ext_modules=[ + Extension( + 'EfiCompressor', + sources=[ + os.path.join(BaseToolsDir, 'Source', 'C', 'Common', 'Decompress.c'), + 'EfiCompressor.c' + ], + include_dirs=[ + os.path.join(BaseToolsDir, 'Source', 'C', 'Include'), + os.path.join(BaseToolsDir, 'Source', 'C', 'Include', 'Ia32'), + os.path.join(BaseToolsDir, 'Source', 'C', 'Common') + ], + ) + ], + ) + -- cgit v1.2.3