29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/* $Id$ */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/** @file
84840f0453774d03890d53ed2276b7b5f979f616vboxsync * IPRT - Initialization & Termination, Ring-0 Driver, Solaris.
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync */
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync
29bdc01040c07a3dd482a94a2cb8f0a90f8587a7vboxsync/*
f1492175092f39a6c7706bf6b99c3386ee37dca8vboxsync * Copyright (C) 2006-2015 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. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncRTDBGKRNLINFO 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. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncbool g_frtSolSplSetsEIF = false;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** timeout_generic address. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncPFNSOL_timeout_generic g_pfnrtR0Sol_timeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** untimeout_generic address. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncPFNSOL_untimeout_generic g_pfnrtR0Sol_untimeout_generic = NULL;
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync/** cyclic_reprogram address. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncPFNSOL_cyclic_reprogram g_pfnrtR0Sol_cyclic_reprogram = NULL;
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsync/** page_noreloc_supported address. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncPFNSOL_page_noreloc_supported g_pfnrtR0Sol_page_noreloc_supported = NULL;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use the kernel page freelist. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncbool g_frtSolUseKflt = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether we've completed R0 initialization. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncbool g_frtSolInitDone = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use old-style xc_call interface. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncbool g_frtSolOldIPI = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Whether to use old-style xc_call interface using one ulong_t as the CPU set
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * representation. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncbool g_frtSolOldIPIUlong = false;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** The xc_call callout table structure. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncRTR0FNSOLXCCALL g_rtSolXcCall;
c5449ea6098150847430f53f59c341c2891879c5vboxsync/** Whether to use the old-style installctx()/removectx() routines. */
c5449ea6098150847430f53f59c341c2891879c5vboxsyncbool g_frtSolOldThreadCtx = false;
c5449ea6098150847430f53f59c341c2891879c5vboxsync/** The thread-context hooks callout table structure. */
c5449ea6098150847430f53f59c341c2891879c5vboxsyncRTR0FNSOLTHREADCTX g_rtSolThreadCtx;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync/** Thread preemption offset in the thread structure. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncsize_t g_offrtSolThreadPreempt;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync/** Thread ID offset in the thread structure. */
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsyncsize_t g_offrtSolThreadId;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync/** The interrupt (pinned) thread pointer offset in the thread structure. */
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsyncsize_t g_offrtSolThreadIntrThread;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync/** The dispatcher lock pointer offset in the thread structure. */
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsyncsize_t g_offrtSolThreadLock;
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync/** The process pointer offset in the thread structure. */
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsyncsize_t g_offrtSolThreadProc;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Host scheduler preemption offset. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncsize_t g_offrtSolCpuPreempt;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync/** Host scheduler force preemption offset. */
f501453cf67686ca4fda06cf74efac980cfbd9cfvboxsyncsize_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. */
182e3162c4be0a0016be4e7c5912a9158042ddf8vboxsyncPFNSOL_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
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 }
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "kthread_t", "t_did", &g_offrtSolThreadId);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync if (RT_FAILURE(rc))
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync {
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_NOTE, "Failed to find kthread_t::t_did!\n");
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync goto errorbail;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync }
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "kthread_t", "t_intr", &g_offrtSolThreadIntrThread);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync if (RT_FAILURE(rc))
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync {
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_NOTE, "Failed to find kthread_t::t_intr!\n");
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync goto errorbail;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync }
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "kthread_t", "t_lockp", &g_offrtSolThreadLock);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync if (RT_FAILURE(rc))
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync {
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_NOTE, "Failed to find kthread_t::t_lockp!\n");
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync goto errorbail;
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync }
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync rc = RTR0DbgKrnlInfoQueryMember(g_hKrnlDbgInfo, "kthread_t", "t_procp", &g_offrtSolThreadProc);
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync if (RT_FAILURE(rc))
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync {
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync cmn_err(CE_NOTE, "Failed to find kthread_t::t_procp!\n");
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync goto errorbail;
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync }
c5449ea6098150847430f53f59c341c2891879c5vboxsync cmn_err(CE_CONT, "!cpu_t::cpu_runrun @ 0x%lx (%ld)\n", g_offrtSolCpuPreempt, g_offrtSolCpuPreempt);
c5449ea6098150847430f53f59c341c2891879c5vboxsync cmn_err(CE_CONT, "!cpu_t::cpu_kprunrun @ 0x%lx (%ld)\n", g_offrtSolCpuForceKernelPreempt, g_offrtSolCpuForceKernelPreempt);
c5449ea6098150847430f53f59c341c2891879c5vboxsync cmn_err(CE_CONT, "!kthread_t::t_preempt @ 0x%lx (%ld)\n", g_offrtSolThreadPreempt, g_offrtSolThreadPreempt);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_CONT, "!kthread_t::t_did @ 0x%lx (%ld)\n", g_offrtSolThreadId, g_offrtSolThreadId);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_CONT, "!kthread_t::t_intr @ 0x%lx (%ld)\n", g_offrtSolThreadIntrThread, g_offrtSolThreadIntrThread);
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync cmn_err(CE_CONT, "!kthread_t::t_lockp @ 0x%lx (%ld)\n", g_offrtSolThreadLock, g_offrtSolThreadLock);
a2a8ef5a1abe9aba849c089cbf15755ab8c17a2dvboxsync cmn_err(CE_CONT, "!kthread_t::t_procp @ 0x%lx (%ld)\n", g_offrtSolThreadProc, g_offrtSolThreadProc);
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 {
9381abcade24c6a95881714b45565af3c18a9390vboxsync cmn_err(CE_NOTE, "rtR0InitNative: cpuset_t size mismatch! max_cpuid=%d IPRT_SOL_NCPUS=%d\n", max_cpuid,
9381abcade24c6a95881714b45565af3c18a9390vboxsync IPRT_SOL_NCPUS);
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync rc = VERR_NOT_SUPPORTED;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync goto errorbail;
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync }
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync
c5449ea6098150847430f53f59c341c2891879c5vboxsync /*
c5449ea6098150847430f53f59c341c2891879c5vboxsync * Mandatory: Thread-context hooks.
c5449ea6098150847430f53f59c341c2891879c5vboxsync */
c5449ea6098150847430f53f59c341c2891879c5vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "exitctx", NULL /* ppvSymbol */);
c5449ea6098150847430f53f59c341c2891879c5vboxsync if (RT_SUCCESS(rc))
c5449ea6098150847430f53f59c341c2891879c5vboxsync {
c5449ea6098150847430f53f59c341c2891879c5vboxsync g_rtSolThreadCtx.Install.pfnSol_installctx = (void *)installctx;
2172c1e243e563a748346e3b1dbd3d7fd13086bevboxsync g_rtSolThreadCtx.Remove.pfnSol_removectx = (void *)removectx;
c5449ea6098150847430f53f59c341c2891879c5vboxsync }
c5449ea6098150847430f53f59c341c2891879c5vboxsync else
c5449ea6098150847430f53f59c341c2891879c5vboxsync {
c5449ea6098150847430f53f59c341c2891879c5vboxsync g_frtSolOldThreadCtx = true;
c5449ea6098150847430f53f59c341c2891879c5vboxsync g_rtSolThreadCtx.Install.pfnSol_installctx_old = (void *)installctx;
c5449ea6098150847430f53f59c341c2891879c5vboxsync g_rtSolThreadCtx.Remove.pfnSol_removectx_old = (void *)removectx;
c5449ea6098150847430f53f59c341c2891879c5vboxsync }
c5449ea6098150847430f53f59c341c2891879c5vboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Optional: Timeout hooks.
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
9381abcade24c6a95881714b45565af3c18a9390vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "timeout_generic",
9381abcade24c6a95881714b45565af3c18a9390vboxsync (void **)&g_pfnrtR0Sol_timeout_generic);
9381abcade24c6a95881714b45565af3c18a9390vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "untimeout_generic",
9381abcade24c6a95881714b45565af3c18a9390vboxsync (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 }
9381abcade24c6a95881714b45565af3c18a9390vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "cyclic_reprogram",
9381abcade24c6a95881714b45565af3c18a9390vboxsync (void **)&g_pfnrtR0Sol_cyclic_reprogram);
9381abcade24c6a95881714b45565af3c18a9390vboxsync
9381abcade24c6a95881714b45565af3c18a9390vboxsync /*
9381abcade24c6a95881714b45565af3c18a9390vboxsync * Optional: Querying page no-relocation support.
9381abcade24c6a95881714b45565af3c18a9390vboxsync */
9381abcade24c6a95881714b45565af3c18a9390vboxsync RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /*pszModule */, "page_noreloc_supported",
9381abcade24c6a95881714b45565af3c18a9390vboxsync (void **)&g_pfnrtR0Sol_page_noreloc_supported);
5eb8c49f193655f19bb89b653df8643091fa987bvboxsync
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync /*
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync * Weak binding failures: contig_free
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync */
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync if (g_pfnrtR0Sol_contig_free == NULL)
8750aef1556280f62aac28c3d97598db154b1ba6vboxsync {
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync rc = RTR0DbgKrnlInfoQuerySymbol(g_hKrnlDbgInfo, NULL /* pszModule */, "contig_free",
48f43c5b6dd4cb9f5edfc0ec82720e0954b29d29vboxsync (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