On Sat, Jan 26, 2013 at 12:45 PM, David Woodhouse <dw...@infradead.org> wrote: > I'm looking at adding support for writeable files to qemu's fw_cfg, and > this would be necessary to write them.
fw_cfg already supports writes. They just serve little purpose today. So I think it is fine to commit this change regardless of other potential changes to qemu. I will change the commit message on this patch too. Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com> > 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 ------------------------------------------------------------------------------ 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