summaryrefslogtreecommitdiffstats
path: root/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
commitf215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch)
tree6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor
parentInitial commit. (diff)
downloadvirtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz
virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor')
-rw-r--r--src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c206
-rw-r--r--src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/Makefile18
-rwxr-xr-xsrc/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py37
3 files changed, 261 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c
new file mode 100644
index 00000000..4c9ce442
--- /dev/null
+++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/EfiCompressor.c
@@ -0,0 +1,206 @@
+/** @file
+Efi Compressor
+
+Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Python.h>
+#include <Decompress.h>
+
+/*
+ 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/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/Makefile b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/Makefile
new file mode 100644
index 00000000..46322b8d
--- /dev/null
+++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/Makefile
@@ -0,0 +1,18 @@
+## @file
+# Makefile
+#
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+
+!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/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py
new file mode 100755
index 00000000..7ccc6d8c
--- /dev/null
+++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py
@@ -0,0 +1,37 @@
+## @file
+# package and install PyEfiCompressor extension
+#
+# Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+##
+# 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')
+ ],
+ )
+ ],
+ )
+