I'm looking at adding support for writeable files to qemu's fw_cfg, and this would be necessary to write them.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: David Woodhouse <david.woodho...@intel.com> --- OvmfPkg/Include/Library/QemuFwCfgLib.h | 19 +++++++++ OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.S | 20 ++++++++++ OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.asm | 22 +++++++++++ OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c | 49 ++++++++++++++++++++++++ OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.S | 17 ++++++++ OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.asm | 20 ++++++++++ 6 files changed, 147 insertions(+) diff --git a/OvmfPkg/Include/Library/QemuFwCfgLib.h b/OvmfPkg/Include/Library/QemuFwCfgLib.h index 3776d79..bbe3fd7 100644 --- a/OvmfPkg/Include/Library/QemuFwCfgLib.h +++ b/OvmfPkg/Include/Library/QemuFwCfgLib.h @@ -103,6 +103,25 @@ QemuFwCfgReadBytes ( /** + Writes firmware configuration bytes from a buffer + + If called multiple times, then the data written will + continue at the offset of the firmware configuration + item where the previous write ended. + + @param[in] Size - Size in bytes to write + @param[in] Buffer - Buffer to read data from + +**/ +VOID +EFIAPI +QemuFwCfgWriteBytes ( + IN UINTN Size, + IN VOID *Buffer + ); + + +/** Reads a UINT8 firmware configuration value @return Value of Firmware Configuration item read diff --git a/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.S b/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.S index a32b2c6..286c28f 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.S +++ b/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.S @@ -30,3 +30,23 @@ rep insb popl %edi ret + +#------------------------------------------------------------------------------ +# VOID +# EFIAPI +# IoWriteFifo8 ( +# IN UINTN Port, +# IN UINTN Size, +# IN VOID *Buffer +# ); +#------------------------------------------------------------------------------ +ASM_GLOBAL ASM_PFX(IoWriteFifo8) +ASM_PFX(IoWriteFifo8): + movw 4(%esp), %dx + movl 8(%esp), %ecx + pushl %esi + movl 16(%esp), %esi +rep outsb + popl %esi + ret + diff --git a/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.asm b/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.asm index 248d522..e02fa04 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.asm +++ b/OvmfPkg/Library/QemuFwCfgLib/Ia32/IoLibExAsm.asm @@ -36,5 +36,27 @@ rep insb IoReadFifo8 ENDP + +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; IoWriteFifo8 ( +; IN UINTN Port, +; IN UINTN Size, +; IN VOID *Buffer +; ); +;------------------------------------------------------------------------------ +IoWriteFifo8 PROC + + mov dx, [esp + 4] + mov ecx, [esp + 8] + push esi + mov esi, [esp + 16] +rep outsb + pop esi + ret + +IoWriteFifo8 ENDP + END diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c index 8caab42..c567fc9 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c @@ -50,6 +50,32 @@ IoReadFifo8 ( OUT VOID *Buffer ); +/** + Writes an 8-bit I/O port fifo from a block of memory. + + Writes the 8-bit I/O fifo port specified by Port. + + The port is written Count times, and the data are obtained + from the provided Buffer. + + This function must guarantee that all I/O read and write operations are + serialized. + + If 8-bit I/O port operations are not supported, then ASSERT(). + + @param Port The I/O port to read. + @param Count The number of times to read I/O port. + @param Buffer The buffer to store the read data into. + +**/ +VOID +EFIAPI +IoWriteFifo8 ( + IN UINTN Port, + IN UINTN Count, + OUT VOID *Buffer + ); + /** Returns a boolean indicating if the firmware configuration interface @@ -132,6 +158,29 @@ QemuFwCfgReadBytes ( } } +/** + Write firmware configuration bytes from a buffer + + If called multiple times, then the data written will + continue at the offset of the firmware configuration + item where the previous write ended. + + @param[in] Size - Size in bytes to write + @param[in] Buffer - Buffer to read data from + +**/ +VOID +EFIAPI +QemuFwCfgWriteBytes ( + IN UINTN Size, + IN VOID *Buffer + ) +{ + if (mQemuFwCfgSupported) { + IoWriteFifo8 (0x511, Size, Buffer); + } +} + /** Reads a UINT8 firmware configuration value diff --git a/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.S b/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.S index b1125ed..a02323f 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.S +++ b/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.S @@ -28,3 +28,20 @@ rep insb mov %r8, %rdi # restore rdi ret +#------------------------------------------------------------------------------ +# VOID +# EFIAPI +# IoWriteFifo8 ( +# IN UINTN Port, // rcx +# IN UINTN Size, // rdx +# IN VOID *Buffer // r8 +# ); +#------------------------------------------------------------------------------ +ASM_GLOBAL ASM_PFX(IoWriteFifo8) +ASM_PFX(IoWriteFifo8): + xchg %rcx, %rdx + xchg %r8, %rsi # rdi: buffer address; r8: save rsi +rep outsb + mov %r8, %rsi # restore rsi + ret + diff --git a/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.asm b/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.asm index c60ad2c..e7af499 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.asm +++ b/OvmfPkg/Library/QemuFwCfgLib/X64/IoLibExAsm.asm @@ -32,5 +32,25 @@ rep insb IoReadFifo8 ENDP + +;------------------------------------------------------------------------------ +; VOID +; EFIAPI +; IoWriteFifo8 ( +; IN UINTN Port, // rcx +; IN UINTN Size, // rdx +; IN VOID *Buffer // r8 +; ); +;------------------------------------------------------------------------------ +IoWriteFifo8 PROC + + xchg rcx, rdx + xchg rsi, r8 ; rdi: buffer address; r8: save rdi +rep outsb + mov rsi, r8 ; restore rdi + ret + +IoWriteFifo8 ENDP + END -- 1.8.0.2 -- dwmw2
smime.p7s
Description: S/MIME cryptographic signature
------------------------------------------------------------------------------ Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. ON SALE this month only -- learn more at: http://p.sf.net/sfu/learnnow-d2d
_______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel