193 lines
4.1 KiB
C
193 lines
4.1 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
ixenvirv.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the HAL get and set environment variable routines
|
||
for a x86 system.
|
||
|
||
Note that this particular implementation only supports the LastKnownGood
|
||
environment variable. This is done by using the Daylight Savings Time
|
||
bit in the Real Time Clock NVRAM. (Not pretty, but it's all we've got)
|
||
|
||
Attempts to read or write any environment variable other than
|
||
LastKnownGood will fail.
|
||
|
||
Author:
|
||
|
||
John Vert (jvert) 22-Apr-1992
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "halp.h"
|
||
#include "arc.h"
|
||
#include "arccodes.h"
|
||
#include "string.h"
|
||
|
||
#define CMOS_CONTROL_PORT ((PUCHAR)0x70)
|
||
#define CMOS_DATA_PORT ((PUCHAR)0x71)
|
||
#define CMOS_STATUS_B 0x0B
|
||
#define CMOS_DAYLIGHT_BIT 1
|
||
|
||
const UCHAR LastKnownGood[] = "LastKnownGood";
|
||
const UCHAR True[] = "TRUE";
|
||
const UCHAR False[] = "FALSE";
|
||
|
||
|
||
ARC_STATUS
|
||
HalGetEnvironmentVariable (
|
||
IN PCHAR Variable,
|
||
IN USHORT Length,
|
||
OUT PCHAR Buffer
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function locates an environment variable and returns its value.
|
||
|
||
The only environment variable this implementation supports is
|
||
"LastKnownGood" It uses the Daylight Savings Time bit in the Real
|
||
TimeClock to indicate the state (TRUE/FALSE only) of this environment
|
||
variable.
|
||
|
||
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.
|
||
|
||
--*/
|
||
|
||
{
|
||
UCHAR StatusByte;
|
||
|
||
UNREFERENCED_PARAMETER( Length );
|
||
UNREFERENCED_PARAMETER( Buffer );
|
||
|
||
if (_stricmp(Variable, LastKnownGood) != 0) {
|
||
return ENOENT;
|
||
}
|
||
|
||
//
|
||
// Read the Daylight Savings Bit out of the RTC to determine whether
|
||
// the LastKnownGood environment variable is TRUE or FALSE.
|
||
//
|
||
|
||
HalpAcquireCmosSpinLock();
|
||
|
||
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, CMOS_STATUS_B);
|
||
StatusByte = READ_PORT_UCHAR(CMOS_DATA_PORT);
|
||
|
||
|
||
HalpReleaseCmosSpinLock ();
|
||
|
||
if (StatusByte & CMOS_DAYLIGHT_BIT) {
|
||
strncpy(Buffer, True, Length);
|
||
} else {
|
||
strncpy(Buffer, False, Length);
|
||
}
|
||
|
||
return ESUCCESS;
|
||
}
|
||
|
||
ARC_STATUS
|
||
HalSetEnvironmentVariable (
|
||
IN PCHAR Variable,
|
||
IN PCHAR Value
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function creates an environment variable with the specified value.
|
||
|
||
The only environment variable this implementation supports is
|
||
"LastKnownGood" It uses the Daylight Savings Time bit in the Real
|
||
TimeClock to indicate the state (TRUE/FALSE only) of this environment
|
||
variable.
|
||
|
||
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.
|
||
|
||
--*/
|
||
|
||
{
|
||
UCHAR StatusByte;
|
||
|
||
if (_stricmp(Variable, LastKnownGood) != 0) {
|
||
return ENOMEM;
|
||
}
|
||
|
||
if (_stricmp(Value, True) == 0) {
|
||
|
||
HalpAcquireCmosSpinLock();
|
||
|
||
//
|
||
// Turn Daylight Savings Bit on.
|
||
//
|
||
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, CMOS_STATUS_B);
|
||
StatusByte = READ_PORT_UCHAR(CMOS_DATA_PORT);
|
||
|
||
StatusByte |= CMOS_DAYLIGHT_BIT;
|
||
|
||
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, CMOS_STATUS_B);
|
||
WRITE_PORT_UCHAR(CMOS_DATA_PORT, StatusByte);
|
||
|
||
|
||
HalpReleaseCmosSpinLock();
|
||
|
||
} else if (_stricmp(Value, False) == 0) {
|
||
|
||
HalpAcquireCmosSpinLock();
|
||
|
||
//
|
||
// Turn Daylight Savings Bit off.
|
||
//
|
||
|
||
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, CMOS_STATUS_B);
|
||
StatusByte = READ_PORT_UCHAR(CMOS_DATA_PORT);
|
||
|
||
StatusByte &= ~CMOS_DAYLIGHT_BIT;
|
||
|
||
WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, CMOS_STATUS_B);
|
||
WRITE_PORT_UCHAR(CMOS_DATA_PORT, StatusByte);
|
||
|
||
HalpReleaseCmosSpinLock();
|
||
|
||
} else {
|
||
return(ENOMEM);
|
||
}
|
||
|
||
return ESUCCESS;
|
||
}
|