initterm-r0drv-solaris.c revision 5eda82e218d35ae0691febd531e1bfc0324cc4a6
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/* $Id$ */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * IPRT - Initialization & Termination, R0 Driver, Solaris.
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/*
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync * Copyright (C) 2006-2010 Oracle Corporation
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync *
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * available from http://www.virtualbox.org. This file is free software;
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync *
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * terms and conditions of either the GPL or the CDDL or both.
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/*******************************************************************************
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync* Header Files *
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync*******************************************************************************/
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync#include "the-solaris-kernel.h"
9c11b89c71ca727d975c39f2719063501ddcd03dvboxsync#include "internal/iprt.h"
9c11b89c71ca727d975c39f2719063501ddcd03dvboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync#include <iprt/err.h>
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync# include <iprt/asm-amd64-x86.h>
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#endif
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync#include "internal/initterm.h"
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync/*******************************************************************************
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync* Global Variables *
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync*******************************************************************************/
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync/** Indicates that the spl routines (and therefore a bunch of other ones too)
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync * will set EFLAGS::IF and break code that disables interrupts. */
938b940adaf22f70c928744152e2d49d8b103f0dvboxsyncbool g_frtSolarisSplSetsEIF = false;
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** timeout_generic address. */
5eb8c49f193655f19bb89b653df8643091fa987bvboxsyncPFNSOL_timeout_generic g_pfnrtR0Sol_timeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** untimeout_generic address. */
5eb8c49f193655f19bb89b653df8643091fa987bvboxsyncPFNSOL_untimeout_generic g_pfnrtR0Sol_untimeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** cyclic_reprogram address. */
5eb8c49f193655f19bb89b653df8643091fa987bvboxsyncPFNSOL_cyclic_reprogram g_pfnrtR0Sol_cyclic_reprogram = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
5eda82e218d35ae0691febd531e1bfc0324cc4a6vboxsyncDECLHIDDEN(int) rtR0InitNative(void)
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync{
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync /*
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync * Initialize vbi (keeping it separate for now)
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync */
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync int rc = vbi_init();
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync if (!rc)
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync {
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync /*
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Detect whether spl*() is preserving the interrupt flag or not.
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync * This is a problem on S10.
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync */
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync RTCCUINTREG uOldFlags = ASMIntDisableFlags();
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync int iOld = splr(DISP_LEVEL);
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync if (ASMIntAreEnabled())
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync g_frtSolarisSplSetsEIF = true;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync splx(iOld);
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync if (ASMIntAreEnabled())
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync g_frtSolarisSplSetsEIF = true;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync ASMSetFlags(uOldFlags);
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#else
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync /* PORTME: See if the amd64/x86 problem applies to this architecture. */
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#endif
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync /*
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync * Dynamically resolve new symbols we want to use.
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync */
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync g_pfnrtR0Sol_timeout_generic = (PFNSOL_timeout_generic )kobj_getsymvalue("timeout_generic", 1);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync g_pfnrtR0Sol_untimeout_generic = (PFNSOL_untimeout_generic)kobj_getsymvalue("untimeout_generic", 1);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync if ((g_pfnrtR0Sol_timeout_generic == NULL) != (g_pfnrtR0Sol_untimeout_generic == NULL))
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync {
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync static const char *s_apszFn[2] = { "timeout_generic", "untimeout_generic" };
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync bool iMissingFn = g_pfnrtR0Sol_timeout_generic == NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync cmn_err(CE_NOTE, "rtR0InitNative: Weird! Found %s but not %s!\n", s_apszFn[!iMissingFn], s_apszFn[iMissingFn]);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync g_pfnrtR0Sol_timeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync g_pfnrtR0Sol_untimeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync }
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync g_pfnrtR0Sol_cyclic_reprogram = (PFNSOL_cyclic_reprogram )kobj_getsymvalue("cyclic_reprogram", 1);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync return VINF_SUCCESS;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync }
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync cmn_err(CE_NOTE, "vbi_init failed. rc=%d\n", rc);
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync return VERR_GENERAL_FAILURE;
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync}
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
5eda82e218d35ae0691febd531e1bfc0324cc4a6vboxsyncDECLHIDDEN(void) rtR0TermNative(void)
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync{
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync}
9c11b89c71ca727d975c39f2719063501ddcd03dvboxsync