mp-solaris.cpp revision f6aff34d987eb8063700c4c26456df4e70f3721c
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * IPRT - Multiprocessor, Solaris.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2008 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * The contents of this file may alternatively be used under the terms
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * of the Common Development and Distribution License Version 1.0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution, in which case the provisions of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * CDDL are applicable instead of those of the GPL.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * You may elect to license modified versions of this file under the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * terms and conditions of either the GPL or the CDDL or both.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*******************************************************************************
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync* Header Files *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync*******************************************************************************/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define LOG_GROUP RTLOGGROUP_DEFAULT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <unistd.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <stdio.h>
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include <errno.h>
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#include <kstat.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <sys/processor.h>
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync#include <iprt/mp.h>
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync#include <iprt/cpuset.h>
384478d3896257fbce9ceb8c01e74040b969e6d7vboxsync#include <iprt/assert.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/string.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/alloc.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/log.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/once.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/critsect.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*******************************************************************************
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync* Global Variables *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync*******************************************************************************/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** Initialization serializing (rtMpSolarisOnce). */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic RTONCE g_MpSolarisOnce = RTONCE_INITIALIZER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** Critical section serializing access to kstat. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic RTCRITSECT g_MpSolarisCritSect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** The kstat handle. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic kstat_ctl_t *g_pKsCtl;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** Array pointing to the cpu_info instances. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic kstat_t **g_papCpuInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** The number of entries in g_papCpuInfo */
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsyncstatic RTCPUID g_capCpuInfo;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync/**
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * Run once function that initializes the kstats we need here.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync *
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @returns IPRT status code.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param pvUser1 Unused.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param pvUser2 Unused.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync */
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsyncstatic DECLCALLBACK(int) rtMpSolarisOnce(void *pvUser1, void *pvUser2)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync{
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync int rc = VINF_SUCCESS;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync NOREF(pvUser1); NOREF(pvUser2);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync /*
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * Open kstat and find the cpu_info entries for each of the CPUs.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync */
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync g_pKsCtl = kstat_open();
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (g_pKsCtl)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync g_capCpuInfo = RTMpGetCount();
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync g_papCpuInfo = (kstat_t **)RTMemAllocZ(g_capCpuInfo * sizeof(kstat_t *));
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (g_papCpuInfo)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync rc = RTCritSectInit(&g_MpSolarisCritSect);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (RT_SUCCESS(rc))
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync RTCPUID i = 0;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync for (kstat_t *pKsp = g_pKsCtl->kc_chain; pKsp != NULL; pKsp = pKsp->ks_next)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (!strcmp(pKsp->ks_module, "cpu_info"))
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync AssertBreak(i < g_capCpuInfo);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync g_papCpuInfo[i++] = pKsp;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync /** @todo ks_instance == cpu_id (/usr/src/uts/common/os/cpu.c)? Check this and fix it ASAP. */
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync return VINF_SUCCESS;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync /* bail out, we failed. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTMemFree(g_papCpuInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_NO_MEMORY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync kstat_close(g_pKsCtl);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync g_pKsCtl = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = RTErrConvertFromErrno(errno);
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync if (RT_SUCCESS(rc))
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync rc = VERR_INTERNAL_ERROR;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log(("kstat_open() -> %d (%Rrc)\n", errno, rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/**
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Worker for RTMpGetCurFrequency and RTMpGetMaxFrequency.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @returns The desired frequency on success, 0 on failure.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync * @param idCpu The CPU ID.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param pszStatName The cpu_info stat name.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic uint64_t rtMpSolarisGetFrequency(RTCPUID idCpu, char *pszStatName)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint64_t u64 = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = RTOnce(&g_MpSolarisOnce, rtMpSolarisOnce, NULL, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ( idCpu < g_capCpuInfo
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && g_papCpuInfo[idCpu])
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = RTCritSectEnter(&g_MpSolarisCritSect);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync if (kstat_read(g_pKsCtl, g_papCpuInfo[idCpu], 0) != -1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync kstat_named_t *pStat = (kstat_named_t *)kstat_data_lookup(g_papCpuInfo[idCpu], pszStatName);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pStat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pStat->data_type == KSTAT_DATA_UINT64 || pStat->data_type == KSTAT_DATA_LONG);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (pStat->data_type)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case KSTAT_DATA_UINT64: u64 = pStat->value.ui64; break; /* current_clock_Hz */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case KSTAT_DATA_INT32: u64 = pStat->value.i32; break; /* clock_MHz */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* just in case... */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case KSTAT_DATA_UINT32: u64 = pStat->value.ui32; break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case KSTAT_DATA_INT64: u64 = pStat->value.i64; break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertMsgFailed(("%d\n", pStat->data_type));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log(("kstat_data_lookup(%s) -> %d\n", pszStatName, errno));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log(("kstat_read() -> %d\n", errno));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCritSectLeave(&g_MpSolarisCritSect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Log(("invalid idCpu: %d (g_capCpuInfo=%d)\n", (int)idCpu, (int)g_capCpuInfo));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
6902a98267d5180fb081cb5273751d0a628bf04dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return u64;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync}
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsyncRTDECL(uint32_t) RTMpGetCurFrequency(RTCPUID idCpu)
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync{
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync return rtMpSolarisGetFrequency(idCpu, "current_clock_Hz") / 1000000;
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync}
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsyncRTDECL(uint32_t) RTMpGetMaxFrequency(RTCPUID idCpu)
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync{
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync return rtMpSolarisGetFrequency(idCpu, "clock_MHz");
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync}
7b4ea63789001468ec3662bdfcd6432bf89095dfvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#if defined(RT_ARCH_SPARC) || defined(RT_ARCH_SPARC64)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(RTCPUID) RTMpCpuId(void)
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync{
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync /** @todo implement RTMpCpuId on solaris/r3! */
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync return NIL_RTCPUID;
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync}
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync#endif
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
3fa7a7e633f46a212052b510cdb8cee41f279a67vboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncRTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync return idCpu < RTCPUSET_MAX_CPUS ? (int)idCpu : -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(RTCPUID) RTMpCpuIdFromSetIndex(int iCpu)
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (unsigned)iCpu < RTCPUSET_MAX_CPUS ? iCpu : NIL_RTCPUID;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(RTCPUID) RTMpGetMaxCpuId(void)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return RTMpGetCount() - 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(bool) RTMpIsCpuPossible(RTCPUID idCpu)
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return idCpu != NIL_RTCPUID
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && idCpu < (RTCPUID)RTMpGetCount();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int iStatus = p_online(idCpu, P_STATUS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return iStatus == P_ONLINE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || iStatus == P_NOINTR;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
6902a98267d5180fb081cb5273751d0a628bf04dvboxsyncRTDECL(bool) RTMpIsCpuPresent(RTCPUID idCpu)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int iStatus = p_online(idCpu, P_STATUS);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync return iStatus != -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsyncRTDECL(RTCPUID) RTMpGetCount(void)
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync{
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync /*
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync * Solaris has sysconf.
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync */
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync int cCpus = sysconf(_SC_NPROCESSORS_MAX);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync if (cCpus < 0)
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync cCpus = sysconf(_SC_NPROCESSORS_CONF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return cCpus;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync}
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(PRTCPUSET) RTMpGetSet(PRTCPUSET pSet)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCpuSetEmpty(pSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int idCpu = RTMpGetCount();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (idCpu-- > 0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCpuSetAdd(pSet, idCpu);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(RTCPUID) RTMpGetOnlineCount(void)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Solaris has sysconf.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return sysconf(_SC_NPROCESSORS_ONLN);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
0593640ab087e5bf747a2576b1752a2046be83aavboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCpuSetEmpty(pSet);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCPUID cCpus = RTMpGetCount();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (RTCPUID idCpu = 0; idCpu < cCpus; idCpu++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RTMpIsCpuOnline(idCpu))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCpuSetAdd(pSet, idCpu);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync return pSet;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRTDECL(PRTCPUSET) RTMpGetPresentSet(PRTCPUSET pSet)
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef RT_STRICT
329df9696e709dc71611f504a4774f323545be0avboxsync long cCpusPresent = 0;
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTCpuSetEmpty(pSet);
329df9696e709dc71611f504a4774f323545be0avboxsync RTCPUID cCpus = RTMpGetCount();
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync for (RTCPUID idCpu = 0; idCpu < cCpus; idCpu++)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RTMpIsCpuPresent(idCpu))
329df9696e709dc71611f504a4774f323545be0avboxsync {
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync RTCpuSetAdd(pSet, idCpu);
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync#ifdef RT_STRICT
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync cCpusPresent++;
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync#endif
3ea1dbf096240fc221aea99352a74c17a367a9b6vboxsync }
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync Assert(cCpusPresent == RTMpGetPresentCount());
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync return pSet;
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync}
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync
9c21eebec4d70f1e638002c8dfc6ea9d534d8710vboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsyncRTDECL(RTCPUID) RTMpGetPresentCount(void)
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync{
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync /*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Solaris has sysconf.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync return sysconf(_SC_NPROCESSORS_CONF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
41fcf8465b641c7083d3b440451f17c1210fce33vboxsync