summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halsnip/mips/jxenvirv.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nthals/halsnip/mips/jxenvirv.c')
-rw-r--r--private/ntos/nthals/halsnip/mips/jxenvirv.c192
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;
+}
+