initterm-r0drv-solaris.c revision 8750aef1556280f62aac28c3d97598db154b1ba6
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/* $Id$ */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/** @file
84840f0453774d03890d53ed2276b7b5f979f616vboxsync * 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
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync#include <iprt/assert.h>
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*******************************************************************************/
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Kernel debug info handle. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncRTDBGKRNLINFO g_hKrnlDbgInfo;
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. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncbool g_frtSolSplSetsEIF = false;
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;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use the kernel page freelist. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncbool g_frtSolUseKflt = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether we've completed R0 initialization. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncbool g_frtSolInitDone = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use old-style xc_call interface. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncbool g_frtSolOldIPI = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use old-style xc_call interface using one ulong_t as the CPU set
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * representation. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncbool g_frtSolOldIPIUlong = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** The xc_call callout table structure. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncRTR0FNSOLXCCALL g_rtSolXcCall;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Thread preemption offset. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncsize_t g_offrtSolThreadPreempt;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Host scheduler preemption offset. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncsize_t g_offrtSolCpuPreempt;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Host scheduler force preemption offset. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncsize_t g_offrtSolCpuForceKernelPreempt;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/* Resolve using dl_lookup (remove if no longer relevant for supported S10 versions) */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncextern void contig_free(void *addr, size_t size);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync#pragma weak contig_free
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** contig_free address. */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncPFNSOL_contig_free g_pfnrtR0Sol_contig_free = contig_free;
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
5eda82e218d35ae0691febd531e1bfc0324cc4a6vboxsyncDECLHIDDEN(int) rtR0InitNative(void)
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync{
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * IPRT has not yet been initialized at this point, so use Solaris' native cmn_err() for logging.
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync int rc = RTR0DbgKrnlInfoOpen(&g_hKrnlDbgInfo, 0 /* fFlags */);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_SUCCESS(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())
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolSplSetsEIF = true;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync splx(iOld);
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync if (ASMIntAreEnabled())
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolSplSetsEIF = true;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync ASMSetFlags(uOldFlags);
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#else
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync /* PORTME: See if the amd64/x86 problem applies to this architecture. */
3667b9956dd95cfba687d4dc23dabb9a49c1feadvboxsync#endif
938b940adaf22f70c928744152e2d49d8b103f0dvboxsync
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Mandatory: Preemption offsets.
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "cpu_t", "cpu_runrun", &g_offrtSolCpuPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_FAILURE(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "Failed to find cpu_t::cpu_runrun!\n");
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "cpu_t", "cpu_kprunrun", &g_offrtSolCpuForceKernelPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_FAILURE(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "Failed to find cpu_t::cpu_kprunrun!\n");
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "kthread_t", "t_preempt", &g_offrtSolThreadPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_FAILURE(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "Failed to find kthread_t::t_preempt!\n");
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_CONT, "!cpu_t::cpu_runrun @ 0x%lx\n", g_offrtSolCpuPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_CONT, "!cpu_t::cpu_kprunrun @ 0x%lx\n", g_offrtSolCpuForceKernelPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_CONT, "!kthread_t::t_preempt @ 0x%lx\n", g_offrtSolThreadPreempt);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Mandatory: CPU cross call infrastructure. Refer the-solaris-kernel.h for details.
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "xc_init_cpu", NULL /* ppvSymbol */);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_SUCCESS(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (ncpus > IPRT_SOL_NCPUS)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "rtR0InitNative: CPU count mismatch! ncpus=%d IPRT_SOL_NCPUS=%d\n", ncpus, IPRT_SOL_NCPUS);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = VERR_NOT_SUPPORTED;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_rtSolXcCall.u.pfnSol_xc_call = (void *)xc_call;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync else
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolOldIPI = true;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_rtSolXcCall.u.pfnSol_xc_call_old = (void *)xc_call;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (max_cpuid + 1 == sizeof(ulong_t) * 8)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolOldIPIUlong = true;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_rtSolXcCall.u.pfnSol_xc_call_old_ulong = (void *)xc_call;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync else if (max_cpuid + 1 != IPRT_SOL_NCPUS)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "rtR0InitNative: cpuset_t size mismatch! max_cpuid=%d IPRT_SOL_NCPUS=%d\n", max_cpuid, IPRT_SOL_NCPUS);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = VERR_NOT_SUPPORTED;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Optional: Timeout hooks.
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "timeout_generic", (void **)&g_pfnrtR0Sol_timeout_generic);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "untimeout_generic", (void **)&g_pfnrtR0Sol_untimeout_generic);
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 }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "cyclic_reprogram", (void **)&g_pfnrtR0Sol_cyclic_reprogram);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Optional: Kernel page freelist (kflt)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync *
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Only applicable to 64-bit Solaris kernels. Use kflt flags to get pages from kernel page freelists
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * while allocating physical pages, once the userpages are exhausted. snv_161+, see @bugref{5632}.
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "kflt_init", NULL /* ppvSymbol */);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_SUCCESS(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync int *pKfltDisable = NULL;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "kflt_disable", (void **)&pKfltDisable);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_SUCCESS(rc) && pKfltDisable && *pKfltDisable == 0)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolUseKflt = true;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Weak binding failures: contig_free
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (g_pfnrtR0Sol_contig_free == NULL)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "contig_free", (void **)&g_pfnrtR0Sol_contig_free);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (RT_FAILURE(rc))
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "rtR0InitNative: failed to find contig_free!\n");
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolInitDone = true;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync return VINF_SUCCESS;
11e871b2c3c4e5a506263fa376920a758dc62916vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync else
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync cmn_err(CE_NOTE, "RTR0DbgKrnlInfoOpen failed. rc=%d\n", rc);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync return rc;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsyncerrorbail:
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync RTR0DbgKrnlInfoRelease(g_hKrnlDbgInfo);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync return rc;
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync}
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
5eda82e218d35ae0691febd531e1bfc0324cc4a6vboxsyncDECLHIDDEN(void) rtR0TermNative(void)
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync{
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync RTR0DbgKrnlInfoRelease(g_hKrnlDbgInfo);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync g_frtSolInitDone = false;
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync}
9c11b89c71ca727d975c39f2719063501ddcd03dvboxsync