This commit causes compilation errors(ARM, gcc 5.2.0):

StdLib/LibC/Uefi/Devices/Console/daConsole.c: In function 'da_ConFlush':
StdLib/LibC/Uefi/Devices/Console/daConsole.c:144:15: error: 'OutBuf'
undeclared (first use in this function)
NumProc = OutBuf->Read(OutBuf, gMD->UString, UNICODE_STRING_MAX-1);
^
StdLib/LibC/Uefi/Devices/Console/daConsole.c:144:15: note: each undeclared
identifier is reported only once for each function it appears in
StdLib/LibC/Uefi/Devices/Console/daConsole.c:132:9: error: unused variable
'MbcsPtr' [-Werror=unused-variable]
char       *MbcsPtr;
^
cc1: all warnings being treated as errors

On Mon, Jan 4, 2016 at 6:03 PM, Bjorge, Erik C <[email protected]>
wrote:

> Reviewed-by: Erik Bjorge <[email protected]>
>
> > -----Original Message-----
> > From: Daryl McDaniel [mailto:[email protected]]
> > Sent: Sunday, January 3, 2016 2:45 PM
> > To: [email protected]; Carsey, Jaben <[email protected]>;
> Bjorge, Erik C
> > <[email protected]>
> > Subject: [PATCH] StdLib: Implement da_ConFlush() and flush I/O buffers
> when closing a
> > console device.
> >
> > StdLib: Implement da_ConFlush() and flush I/O buffers when closing a
> console device.
> >
> > Add header file Efi/SysEfi.h
> > Implement function da_ConFlush()
> > Modify da_ConClose() to flush its buffers and clean up better upon close.
> > Construct the console instance using the new da_ConFlush() instead of
> the nullop function.
> > Remove da_ConFlush() from the "Not implemented (yet?)" place holder.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Daryl McDaniel <[email protected]>
> >
> > ---
> > diff U3 a/StdLib/LibC/Uefi/Devices/Console/daConsole.c
> > b/StdLib/LibC/Uefi/Devices/Console/daConsole.c
> > --- a/StdLib/LibC/Uefi/Devices/Console/daConsole.c  Tue Nov 11 14:56:58
> 2014
> > +++ b/StdLib/LibC/Uefi/Devices/Console/daConsole.c  Sun Jan 03 12:16:39
> 2016
> > @@ -10,6 +10,7 @@
> >    The devices status as a wide device is indicatd by _S_IWTTY being set
> in
> >    f_iflags.
> >
> > +  Copyright (c) 2016, Daryl McDaniel. All rights reserved.<BR>
> >    Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
> >    This program and the accompanying materials are licensed and made
> available under
> >    the terms and conditions of the BSD License that accompanies this
> distribution.
> > @@ -37,6 +38,7 @@
> >  #include  <sys/fcntl.h>
> >  #include  <unistd.h>
> >  #include  <sys/termios.h>
> > +#include  <Efi/SysEfi.h>
> >  #include  <kfile.h>
> >  #include  <Device/Device.h>
> >  #include  <Device/IIO.h>
> > @@ -104,6 +106,65 @@
> >    return i;
> >  }
> >
> > +/** Flush the console's IIO buffers.
> > +
> > +    Flush the IIO Input or Output buffers depending upon the mode
> > +    of the specified file.
> > +
> > +    If the console is open for output, write any unwritten data in the
> output
> > +    buffer to the console.
> > +
> > +    If the console is open for input or output, discard any remaining
> data
> > +    in the associated buffers.
> > +
> > +    @param[in]    filp    Pointer to the target file's descriptor
> structure.
> > +
> > +    @retval     0     Always succeeds
> > +**/
> > +static
> > +int
> > +EFIAPI
> > +da_ConFlush(
> > +  struct __filedes *filp
> > +)
> > +{
> > +  cIIO       *This;
> > +  char       *MbcsPtr;
> > +  ssize_t     NumProc;
> > +  void       *OutPtr;
> > +
> > +  This = filp->devdata;
> > +
> > +  if (filp->f_iflags & S_ACC_READ)  {     // Readable so flush the
> input buffer
> > +    This->InBuf->Flush(This->InBuf, UNICODE_STRING_MAX);
> > +  }
> > +  if (filp->f_iflags & S_ACC_WRITE)  {    // Writable so flush the
> output buffer
> > +    // At this point, the characters to write are in OutBuf
> > +    // First, linearize and consume the buffer
> > +    NumProc = OutBuf->Read(OutBuf, gMD->UString, UNICODE_STRING_MAX-1);
> > +    if (NumProc > 0) {  // Optimization -- Nothing to do if no
> characters
> > +      gMD->UString[NumProc] = 0;   // Ensure that the buffer is
> terminated
> > +
> > +      if(filp->f_iflags & _S_IWTTY) {
> > +        // Output device expects wide characters, Output what we have
> > +        OutPtr = gMD->UString;
> > +      }
> > +      else {
> > +        // Output device expects narrow characters, convert to MBCS
> > +        OutPtr = gMD->UString2;
> > +        // Translate the wide buffer, gMD->UString into MBCS
> > +        // in the buffer pointed to by OutPtr.
> > +        // The returned value, NumProc, is the resulting number of
> bytes.
> > +        NumProc = wcstombs((char *)OutPtr, (const wchar_t
> *)gMD->UString, NumProc);
> > +        ((char *)OutPtr)[NumProc] = 0;   // Ensure the buffer is
> terminated
> > +      }
> > +      // Do the actual write of the data
> > +      (void) filp->f_ops->fo_write(filp, NULL, NumProc, OutPtr);
> > +    }
> > +  }
> > +  return 0;
> > +}
> > +
> >  /** Close an open file.
> >
> >      @param[in]  filp    Pointer to the file descriptor structure for
> this file.
> > @@ -127,6 +188,13 @@
> >      EFIerrno = RETURN_INVALID_PARAMETER;
> >      return -1;    // Looks like a bad File Descriptor pointer
> >    }
> > +  // Stream and filp look OK, so continue.
> > +  // Flush the I/O buffers
> > +  (void) da_ConFlush(filp);
> > +
> > +  // Break the connection to IIO
> > +  filp->devdata = NULL;
> > +
> >    gMD->StdIo[Stream->InstanceNum] = NULL;   // Mark the stream as closed
> >    return 0;
> >  }
> > @@ -188,10 +256,10 @@
> >          by da_ConWrite are WIDE characters.  It is the responsibility
> of the
> >          higher-level function(s) to perform any necessary conversions.
> >
> > -    @param[in,out]  BufferSize  Number of characters in Buffer.
> > +  @param[in,out]  BufferSize  Number of characters in Buffer.
> >    @param[in]      Buffer      The WCS string to be displayed
> >
> > -    @return   The number of Characters written.
> > +  @return   The number of Characters written.
> >  */
> >  static
> >  ssize_t
> > @@ -525,7 +593,7 @@
> >    wchar_t            *MPath           // Not used for console devices
> >    )
> >  {
> > -  ConInstance                      *Stream;
> > +  ConInstance    *Stream;
> >    UINT32          Instance;
> >    int             RetVal = -1;
> >
> > @@ -646,68 +714,68 @@
> >      IIO = New_cIIO();
> >      if(IIO == NULL) {
> >        FreePool(ConInstanceList);
> > -  }
> > +    }
> >      else {
> >        Status = RETURN_SUCCESS;
> > -  for( i = 0; i < NUM_SPECIAL; ++i) {
> > -    // Get pointer to instance.
> > -    Stream = &ConInstanceList[i];
> > -
> > -    Stream->Cookie      = CON_COOKIE;
> > -    Stream->InstanceNum = i;
> > -    Stream->CharState.A = 0;    // Start in the initial state
> > -
> > -    switch(i) {
> > -      case STDIN_FILENO:
> > -        Stream->Dev = SystemTable->ConIn;
> > -        break;
> > -      case STDOUT_FILENO:
> > -        Stream->Dev = SystemTable->ConOut;
> > -        break;
> > -      case STDERR_FILENO:
> > -        if(SystemTable->StdErr == NULL) {
> > -          Stream->Dev = SystemTable->ConOut;
> > -        }
> > -        else {
> > -          Stream->Dev = SystemTable->StdErr;
> > +      for( i = 0; i < NUM_SPECIAL; ++i) {
> > +        // Get pointer to instance.
> > +        Stream = &ConInstanceList[i];
> > +
> > +        Stream->Cookie      = CON_COOKIE;
> > +        Stream->InstanceNum = i;
> > +        Stream->CharState.A = 0;    // Start in the initial state
> > +
> > +        switch(i) {
> > +          case STDIN_FILENO:
> > +            Stream->Dev = SystemTable->ConIn;
> > +            break;
> > +          case STDOUT_FILENO:
> > +            Stream->Dev = SystemTable->ConOut;
> > +            break;
> > +          case STDERR_FILENO:
> > +            if(SystemTable->StdErr == NULL) {
> > +              Stream->Dev = SystemTable->ConOut;
> > +            }
> > +            else {
> > +              Stream->Dev = SystemTable->StdErr;
> > +            }
> > +            break;
> > +          default:
> > +            return RETURN_VOLUME_CORRUPTED;     // This is a "should
> never happen" case.
> >          }
> > -        break;
> > -      default:
> > -        return RETURN_VOLUME_CORRUPTED;     // This is a "should never
> happen" case.
> > -    }
> > -
> > -    Stream->Abstraction.fo_close    = &da_ConClose;
> > -    Stream->Abstraction.fo_read     = &da_ConRead;
> > -    Stream->Abstraction.fo_write    = &da_ConWrite;
> > -    Stream->Abstraction.fo_stat     = &da_ConStat;
> > -    Stream->Abstraction.fo_lseek    = &da_ConSeek;
> > -    Stream->Abstraction.fo_fcntl    = &fnullop_fcntl;
> > -    Stream->Abstraction.fo_ioctl    = &da_ConIoctl;
> > -    Stream->Abstraction.fo_poll     = &da_ConPoll;
> > -    Stream->Abstraction.fo_flush    = &fnullop_flush;
> > -    Stream->Abstraction.fo_delete   = &fbadop_delete;
> > -    Stream->Abstraction.fo_mkdir    = &fbadop_mkdir;
> > -    Stream->Abstraction.fo_rmdir    = &fbadop_rmdir;
> > -    Stream->Abstraction.fo_rename   = &fbadop_rename;
> >
> > -    Stream->NumRead     = 0;
> > -    Stream->NumWritten  = 0;
> > -    Stream->UnGetKey    = CHAR_NULL;
> > +        Stream->Abstraction.fo_close    = &da_ConClose;
> > +        Stream->Abstraction.fo_read     = &da_ConRead;
> > +        Stream->Abstraction.fo_write    = &da_ConWrite;
> > +        Stream->Abstraction.fo_stat     = &da_ConStat;
> > +        Stream->Abstraction.fo_lseek    = &da_ConSeek;
> > +        Stream->Abstraction.fo_fcntl    = &fnullop_fcntl;
> > +        Stream->Abstraction.fo_ioctl    = &da_ConIoctl;
> > +        Stream->Abstraction.fo_poll     = &da_ConPoll;
> > +        Stream->Abstraction.fo_flush    = &da_ConFlush;
> > +        Stream->Abstraction.fo_delete   = &fbadop_delete;
> > +        Stream->Abstraction.fo_mkdir    = &fbadop_mkdir;
> > +        Stream->Abstraction.fo_rmdir    = &fbadop_rmdir;
> > +        Stream->Abstraction.fo_rename   = &fbadop_rename;
> > +
> > +        Stream->NumRead     = 0;
> > +        Stream->NumWritten  = 0;
> > +        Stream->UnGetKey    = CHAR_NULL;
> >
> > -    if(Stream->Dev == NULL) {
> > -      continue;                 // No device for this stream.
> > -    }
> > -        ConNode[i] = __DevRegister(stdioNames[i], NULL, &da_ConOpen,
> Stream,
> > -                                   1, sizeof(ConInstance),
> stdioFlags[i]);
> > -    if(ConNode[i] == NULL) {
> > -          Status = EFIerrno;    // Grab error code that DevRegister
> produced.
> > -      break;
> > -    }
> > -    Stream->Parent = ConNode[i];
> > -  }
> > -  /* Initialize Ioctl flags until Ioctl is really implemented. */
> > -  TtyCooked = TRUE;
> > -  TtyEcho   = TRUE;
> > +        if(Stream->Dev == NULL) {
> > +          continue;                 // No device for this stream.
> > +        }
> > +            ConNode[i] = __DevRegister(stdioNames[i], NULL,
> &da_ConOpen, Stream,
> > +                                       1, sizeof(ConInstance),
> stdioFlags[i]);
> > +        if(ConNode[i] == NULL) {
> > +              Status = EFIerrno;    // Grab error code that DevRegister
> produced.
> > +          break;
> > +        }
> > +        Stream->Parent = ConNode[i];
> > +      }
> > +      /* Initialize Ioctl flags until Ioctl is really implemented. */
> > +      TtyCooked = TRUE;
> > +      TtyEcho   = TRUE;
> >      }
> >    }
> >    return  Status;
> > @@ -751,15 +819,5 @@
> >    void *
> >    )
> >  {
> > -}
> > -
> > -static
> > -int
> > -EFIAPI
> > -da_ConFlush(
> > -  struct __filedes *filp
> > -  )
> > -{
> > -  return 0;
> >  }
> >  #endif  /* Not implemented for Console */
> > --
> > Daryl McDaniel
> >
>
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to