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

Reply via email to