1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
5699897cfc22a71e1441854892e3659f179ee0bcHaik Aftandilian * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Use is subject to license terms.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/promif_impl.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/uadmin.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/machsystm.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/hypervisor_api.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef _KMDB
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern int kmdb_dpi_get_master_cpuid(void);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern void kmdb_dpi_kernpanic(int cpuid);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern void prom_reboot(char *bootstr);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_DECL(p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_SET7(p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_REST(p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#else
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern int vx_handler(cell_t *argument_array);
5699897cfc22a71e1441854892e3659f179ee0bcHaik Aftandilianextern void kldc_debug_enter(void);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_DECL(p) int p
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_SET7(p) (p = spl7())
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PIL_REST(p) (splx(p))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define PROMIF_ISPRINT(c) (((c) >= ' ') && ((c) <= '~'))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajmstatic int promif_ask_before_reset =
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef _KMDB
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm 1;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#else
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm 0;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*ARGSUSED*/
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoint
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppopromif_exit_to_mon(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo PIL_DECL(pil);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo PIL_SET7(pil);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo prom_printf("Program terminated\n");
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm if (promif_ask_before_reset) {
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm prom_printf("Press any key to reboot.");
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm (void) prom_getchar();
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm }
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm (void) hv_mach_sir();
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm /* should not return */
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm ASSERT(0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo PIL_REST(pil);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm/*ARGSUSED*/
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajmint
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajmpromif_enter_mon(void *p)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo{
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo char cmd;
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm static char *prompt = "c)ontinue, s)ync, r)eset? ";
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm PIL_DECL(pil);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm PIL_SET7(pil);
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm#ifndef _KMDB
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm idle_other_cpus();
5699897cfc22a71e1441854892e3659f179ee0bcHaik Aftandilian kldc_debug_enter();
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo for (;;) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo prom_printf("%s", prompt);
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm cmd = promif_getchar();
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo prom_printf("%c\n", cmd);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo switch (cmd) {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case 'r':
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm prom_printf("Resetting...\n");
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm (void) hv_mach_sir();
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm /* should not return */
20046e4c1cecc35fec6e8881900a6a4fc194ac2ajm ASSERT(0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case '\r':
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case 's':
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef _KMDB
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo kmdb_dpi_kernpanic(kmdb_dpi_get_master_cpuid());
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#else
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo cell_t arg = p1275_ptr2cell("sync");
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (void) vx_handler(&arg);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm /* should not return */
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm ASSERT(0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo case 'c':
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm#ifndef _KMDB
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm resume_other_cpus();
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm#endif
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm PIL_REST(pil);
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm return (0);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo default:
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm if (PROMIF_ISPRINT(cmd))
1b83305cfc332b1e19ad6a194b73b2975e6bf79ajm prom_printf("invalid option (%c)\n", cmd);
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo break;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo }
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo _NOTE(NOTREACHED)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}