summaryrefslogtreecommitdiffstats
path: root/private/ntos/boot/veneer/vrrstart.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/boot/veneer/vrrstart.c')
-rw-r--r--private/ntos/boot/veneer/vrrstart.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/private/ntos/boot/veneer/vrrstart.c b/private/ntos/boot/veneer/vrrstart.c
new file mode 100644
index 000000000..7d4ebc3f6
--- /dev/null
+++ b/private/ntos/boot/veneer/vrrstart.c
@@ -0,0 +1,274 @@
+/*
+ *
+ * Copyright (c) 1994 FirePower Systems Inc.
+ * Copyright (c) 1995 FirePower Systems, Inc.
+ *
+ * $RCSfile: vrrstart.c $
+ * $Revision: 1.7 $
+ * $Date: 1996/04/15 02:55:36 $
+ * $Locker: $
+ *
+ *
+ * Module Name:
+ * vrrstart.c
+ *
+ * Author:
+ * Shin Iwamoto at FirePower Systems Inc.
+ *
+ * History:
+ * 16-Jun-94 Shin Iwamoto at FirePower Systems Inc.
+ * Changed the property getting code using get_str_prop()
+ * in VrGetSystemId().
+ * 14-Jun-94 Shin Iwamoto at FirePower Systems Inc.
+ * Added the pointer to SystemId because type mismatch happened.
+ * 19-May-94 Shin Iwamoto at FirePower Systems Inc.
+ * Added some comments.
+ * 13-May-94 Shin Iwamoto at FirePower Systems Inc.
+ * Added jump-logic to the restart address in VrRestart().
+ * Added VrRestartInitialize().
+ * 12-May-94 Shin Iwamoto at FirePower Systems Inc.
+ * Created.
+ *
+ */
+
+
+
+#include "veneer.h"
+
+
+//
+// Static data.
+//
+STATIC SYSTEM_ID SystemId;
+
+
+/*
+ * Name: VrEnterInteractiveMode
+ *
+ * Description:
+ * This function terminates the executing program and enters
+ * interactive mode.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrEnterInteractiveMode(
+ VOID
+ )
+{
+ (VOID)OFEnter();
+}
+
+
+/*
+ * Name: VrGetSystemId
+ *
+ * Description:
+ * This function returns a pointer to a system identification
+ * structure that contains information used to uniquely identify
+ * each system.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * The 16-byte system identification structure is returned.
+ *
+ */
+PSYSTEM_ID
+VrGetSystemId(
+ VOID
+ )
+{
+ phandle PHandle;
+ PCHAR Property;
+ PSYSTEM_ID PSystemId = &SystemId;
+
+ if ((LONG)(PHandle = OFFinddevice("/")) == -1) {
+ fatal("Veneer: cannot find the root node in Open Firmware.\n");
+ }
+
+ if ((Property = get_str_prop(PHandle, "name", NOALLOC)) == (PCHAR)NULL) {
+ fatal("Veneer: cannot get the name property for the root node.\n");
+ }
+ bcopy(Property, SystemId.VendorId, 8);
+
+ if ((Property = get_str_prop(PHandle, "id", NOALLOC)) == (PCHAR)NULL) {
+ fatal("Veneer: cannot get the name property for the root node.\n");
+ }
+ bcopy(Property, SystemId.ProductId, 8);
+
+ return PSystemId;
+}
+
+
+/*
+ * Name: VrPowerDown
+ *
+ * Description:
+ * This function is identical to the VrHalt() with the additional
+ * feature that, the power to a system is removed if the system is
+ * equipped so.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrPowerDown(VOID)
+{
+ // XXX - This must use the HALT interface; see the PPC binding.
+ OFExit();
+}
+
+
+/*
+ * Name: VrReboot
+ *
+ * Description:
+ * This function reboots the system with the same parameters used
+ * for the previous system load sequence. If the parameters cannot
+ * be reproduced, then the default system load sequence is performed.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrReboot(
+ VOID
+ )
+{
+ // XXXX
+ // Make sure that this funciton reboots the system with the same
+ // parameters used for the previous system load sequence. If the
+ // parameters cannot be reporduced, then the default system load
+ // sequence is performed.
+ (VOID)OFBoot((PCHAR)NULL);
+}
+
+
+/*
+ * Name: VrRestart
+ *
+ * Description:
+ * This function performs the equivalent of a power-on reset.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrRestart(
+ VOID
+ )
+{
+
+ PRESTART_BLOCK PRestartBlock;
+
+ //
+ // Detect the presence of a valid Restart Block
+ //
+ PRestartBlock = SYSTEM_BLOCK->RestartBlock;
+ while (PRestartBlock != (PRESTART_BLOCK)NULL) {
+ if (PRestartBlock->Signature == RSTB_SIGNATURE &&
+ (PRestartBlock->Version == ARC_VERSION) &&
+ (PRestartBlock->Revision == ARC_REVISION)) {
+
+ break;
+ }
+ PRestartBlock = PRestartBlock->NextRestartBlock;
+ }
+
+ //
+ // Perform a normal power-on sequence if a valid RestartBlock
+ // is not found.
+ //
+ if (PRestartBlock == (PRESTART_BLOCK)NULL) {
+ (VOID)OFBoot((PCHAR)NULL);
+ }
+ //
+ // Reboot the system.
+ //
+
+ //
+ // Goto the RestartAddress, not return;
+ //
+ (VOID)(*(VOID (*)())(PRestartBlock->RestartAddress))();
+}
+
+
+/*
+ * Name: VrHalt
+ *
+ * Description:
+ * This function exits the program.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrHalt(
+ VOID
+ )
+{
+ (VOID)OFExit();
+}
+
+
+/*
+ * Name: VrRestartInitialize
+ *
+ * Description:
+ * This function initializes restart routine addresses in the firmware
+ * transfer vector.
+ *
+ * Arguments:
+ * None.
+ *
+ * Return Value:
+ * None.
+ *
+ */
+VOID
+VrRestartInitialize(
+ VOID
+ )
+{
+ debug(VRDBG_ENTRY, "VrRestartInitialize BEGIN....\n");
+ //
+ // Initialize Restart routine addresses in the firmware transfer vector.
+ //
+ (PARC_INTERACTIVE_MODE_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[InteractiveModeRoutine] =
+ VrEnterInteractiveMode;
+ (PARC_GET_SYSTEM_ID_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[GetSystemIdRoutine] = VrGetSystemId;
+ (PARC_POWERDOWN_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[PowerDownRoutine] = VrPowerDown;
+ (PARC_REBOOT_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[RebootRoutine] = VrReboot;
+ (PARC_RESTART_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[RestartRoutine] = VrRestart;
+ (PARC_HALT_ROUTINE)
+ SYSTEM_BLOCK->FirmwareVector[HaltRoutine] = VrHalt;
+ debug(VRDBG_ENTRY, "VrRestartInitialize ....END\n");
+}