summaryrefslogblamecommitdiffstats
path: root/private/ntos/nthals/halppc/ppc/pxenviro.c
blob: 92a3f2aa2e00b0a4aed12c6234c62e125139d4ee (plain) (tree)









































































































































































                                                                             
/*++

Copyright (c) 1991-1993  Microsoft Corporation

Module Name:

    pxenviro.c

Abstract:

    This module implements the interface to the HAL get and set
    environment variable routines for a Power PC system.


Author:

    Jim Wooldridge Ported to PowerPC


Environment:

    Kernel mode

Revision History:

--*/


#include "halp.h"
#include "arccodes.h"

#include "prepnvr.h"
#include "fwstatus.h"
#include "fwnvr.h"



KSPIN_LOCK NVRAM_Spinlock;



ARC_STATUS
HalGetEnvironmentVariable (
    IN PCHAR Variable,
    IN USHORT Length,
    OUT PCHAR Buffer
    )

/*++

Routine Description:

    This function locates an environment variable and returns its value.

Arguments:

    Variable - Supplies a pointer to a zero terminated environment variable
        name.

    Length - Supplies the length of the value buffer in bytes.

    Buffer - Supplies a pointer to a buffer that receives the variable value.

Return Value:

    ESUCCESS is returned if the enviroment variable is located. Otherwise,
    ENOENT is returned.

--*/


{

KIRQL Irql;
PUCHAR tmpbuffer;


  //
  // Check input parameters
  //
  if (Variable == NULL ||
     *Variable == 0 ||
     Length < 1 ||
     Buffer == NULL)
    return(ENOENT);

  //
  // Grab control of NVRAM
  //

  KeAcquireSpinLock(&NVRAM_Spinlock, &Irql);

  (VOID)nvr_initialize_object(0, 0);

  if ((tmpbuffer = nvr_get_GE_variable(Variable)) == NULL) {
     KeReleaseSpinLock(&NVRAM_Spinlock, Irql);
     return(ENOENT);
  }

  //
  // Copy the environment variable's value to Buffer
  //

  do {
    *Buffer = *tmpbuffer++;
    if (*Buffer++ == 0) {

      nvr_delete_object();
      KeReleaseSpinLock(&NVRAM_Spinlock, Irql);
      return(ESUCCESS);
    }
  } while (--Length);

  //
  // Truncate the returned string.  The buffer was too short.
  //
  *--Buffer = 0;

  nvr_delete_object();
  KeReleaseSpinLock(&NVRAM_Spinlock, Irql);
  return(ENOMEM);
}

ARC_STATUS
HalSetEnvironmentVariable (
    IN PCHAR Variable,
    IN PCHAR Value
    )

/*++

Routine Description:

    This function creates an environment variable with the specified value.

Arguments:

    Variable - Supplies a pointer to an environment variable name.

    Value - Supplies a pointer to the environment variable value.

Return Value:

    ESUCCESS is returned if the environment variable is created. Otherwise,
    ENOMEM is returned.

--*/


{
 ARC_STATUS ReturnValue;
 KIRQL Irql;



 if (Value == NULL) return(ENOENT);

 KeAcquireSpinLock(&NVRAM_Spinlock, &Irql);     // Grab control of NVRAM

 (VOID)nvr_initialize_object(0, 0);
// (VOID)nvr_initialize_object(nvr_system_type);

 ReturnValue = nvr_set_GE_variable(Variable,Value);

 nvr_delete_object();  // free object created by nvr_init_object

 KeReleaseSpinLock(&NVRAM_Spinlock, Irql);

 return(ReturnValue);
}