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

Attachment: 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

Reply via email to