193 lines
4.2 KiB
C
193 lines
4.2 KiB
C
//#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;
|
||
}
|
||
|