diff options
Diffstat (limited to 'private/ntos/nthals/halsnip/mips/jxenvirv.c')
-rw-r--r-- | private/ntos/nthals/halsnip/mips/jxenvirv.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/private/ntos/nthals/halsnip/mips/jxenvirv.c b/private/ntos/nthals/halsnip/mips/jxenvirv.c new file mode 100644 index 000000000..6584e3a56 --- /dev/null +++ b/private/ntos/nthals/halsnip/mips/jxenvirv.c @@ -0,0 +1,192 @@ +//#pragma comment(exestr, "$Header: /usr4/winnt/SOURCES/halpcims/src/hal/halsnipm/mips/RCS/jxenvirv.c,v 1.2 1995/11/02 11:04:33 flo Exp $") + +/*++ + +Copyright (c) 1991 Microsoft Corporation +Copyright (c) 1993 Siemens Nixdorf Informationssyteme AG + +Module Name: + + jxenvirv.c + +Abstract: + + This module implements the HAL get and set environment variable routines + for a MIPS system. + +Environment: + + Kernel mode + +NOTES: + --- Preliminary using ARC function calls --- + +--*/ + + +#include "halp.h" +#include "arccodes.h" +#include "arc.h" + + // preliminary calls to the ARC functions (function vector call) + + /* NOTE: + This is strongly discouraged by the ARC specifications. + Only "reset"/return calls to the prom are recommended. + All other system access to the NVRAM should be handled + by operating systems functions directly. For that the + operating system has to know the algorithms for handling + those data structures (e.g. the checksum calculations). + Though is a drawback in terms of HW/FW-independance NT + seems to avoid side effects of ARC function code that way, + e.g. via register/stack manipulations. + */ + +// +// The following addresses are defined by ARC and handed over to the osloader. +// For now we assume that the osloader will leave this memory part unchanged +// for the operating system (NT), which itself also doesn't overwrite that +// data structure. +// We don't (yet) know yet know whether the firmware copies or maps/banks +// runnable code into the physical memory (or if it just sets up a vector +// into the prom). We also do not know whether the NVRAM variables are copied +// into physical memory or mapped/banked by the (ARC) firmware. +// + +// +// Therefore we preliminary use the ARC entry vectors from ARC.H +// + + +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. + +NOTE: + This implementation returns the error code ENOMEM if the output buffer + is too small. + +--*/ + +{ + + PUCHAR Environment_var; + ULONG Index; + ARC_STATUS Status; + + // + // retrieve the variable + // + + Environment_var = (PUCHAR)ArcGetEnvironmentVariable(Variable); + + if (Environment_var == (PUCHAR)NULL) { + + Status = ENOENT; + + } else { + + // + // Copy the specified value to the output buffer. + // + + for (Index = 0; Index < Length; Index += 1) { + *Buffer = READ_REGISTER_UCHAR(Environment_var); + if (*Buffer == 0) { + break; + } + + Buffer += 1; + Environment_var += 1; + } + + // + // If the length terminated the loop, then return not enough memory. + // Otherwise, return success. + // + + if (Index == Length) { + Status = ENOMEM; + + } else { + Status = ESUCCESS; + } + } + + return Status; +} + +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. + +NOTES: + This preliminary implementation always returns ESUCCESS even in case of + error. + +--*/ + +{ + + ARC_STATUS Status; + + Status = ArcSetEnvironmentVariable(Variable, Value); + + switch (Status) { + + case ESUCCESS: + break; + + case ENOSPC: + break; // until further we assume NT can handle that + + case ENOMEM: + default: + Status = ENOMEM; + break; + } + return Status; +} + |