1 /* $NetBSD: cpuvar.h,v 1.8 2018/05/28 21:05:10 chs Exp $ */ 2 3 /* 4 * CDDL HEADER START 5 * 6 * The contents of this file are subject to the terms of the 7 * Common Development and Distribution License (the "License"). 8 * You may not use this file except in compliance with the License. 9 * 10 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11 * or http://www.opensolaris.org/os/licensing. 12 * See the License for the specific language governing permissions 13 * and limitations under the License. 14 * 15 * When distributing Covered Code, include this CDDL HEADER in each 16 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17 * If applicable, add the following below this CDDL HEADER, with the 18 * fields enclosed by brackets "[]" replaced with your own identifying 19 * information: Portions Copyright [yyyy] [name of copyright owner] 20 * 21 * CDDL HEADER END 22 */ 23 24 /* 25 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29 #ifndef _COMPAT_OPENSOLARIS_SYS_CPUVAR_H 30 #define _COMPAT_OPENSOLARIS_SYS_CPUVAR_H 31 32 #include <sys/processor.h> 33 #include <sys/mutex.h> 34 #include <sys/cpuvar_defs.h> 35 36 #ifdef _KERNEL 37 38 typedef struct { 39 int cpuid; 40 struct cyc_cpu *cpu_cyclic; 41 uint32_t cpu_flags; 42 uint_t cpu_intr_actv; 43 uintptr_t cpu_profile_pc; 44 uintptr_t cpu_profile_upc; 45 uintptr_t cpu_dtrace_caller; /* DTrace: caller, if any */ 46 hrtime_t cpu_dtrace_chillmark; /* DTrace: chill mark time */ 47 hrtime_t cpu_dtrace_chilled; /* DTrace: total chill time */ 48 } solaris_cpu_t; 49 50 /* Some code may choose to redefine this if pcpu_t would be more useful. */ 51 #define cpu_t solaris_cpu_t 52 #define cpu_id cpuid 53 54 extern solaris_cpu_t solaris_cpu[]; 55 56 #define CPU_CACHE_COHERENCE_SIZE 64 57 58 /* 59 * The cpu_core structure consists of per-CPU state available in any context. 60 * On some architectures, this may mean that the page(s) containing the 61 * NCPU-sized array of cpu_core structures must be locked in the TLB -- it 62 * is up to the platform to assure that this is performed properly. Note that 63 * the structure is sized to avoid false sharing. 64 */ 65 #define CPUC_SIZE (sizeof (uint16_t) + sizeof (uintptr_t) + \ 66 sizeof (kmutex_t)) 67 #define CPUC_PADSIZE CPU_CACHE_COHERENCE_SIZE - CPUC_SIZE 68 69 typedef struct cpu_core { 70 uint16_t cpuc_dtrace_flags; /* DTrace flags */ 71 uint8_t cpuc_pad[CPUC_PADSIZE]; /* padding */ 72 uintptr_t cpuc_dtrace_illval; /* DTrace illegal value */ 73 kmutex_t cpuc_pid_lock; /* DTrace pid provider lock */ 74 } cpu_core_t; 75 76 extern cpu_core_t cpu_core[]; 77 #endif /* _KERNEL */ 78 79 /* 80 * DTrace flags. 81 */ 82 #define CPU_DTRACE_NOFAULT 0x0001 /* Don't fault */ 83 #define CPU_DTRACE_DROP 0x0002 /* Drop this ECB */ 84 #define CPU_DTRACE_BADADDR 0x0004 /* DTrace fault: bad address */ 85 #define CPU_DTRACE_BADALIGN 0x0008 /* DTrace fault: bad alignment */ 86 #define CPU_DTRACE_DIVZERO 0x0010 /* DTrace fault: divide by zero */ 87 #define CPU_DTRACE_ILLOP 0x0020 /* DTrace fault: illegal operation */ 88 #define CPU_DTRACE_NOSCRATCH 0x0040 /* DTrace fault: out of scratch */ 89 #define CPU_DTRACE_KPRIV 0x0080 /* DTrace fault: bad kernel access */ 90 #define CPU_DTRACE_UPRIV 0x0100 /* DTrace fault: bad user access */ 91 #define CPU_DTRACE_TUPOFLOW 0x0200 /* DTrace fault: tuple stack overflow */ 92 #if defined(__sparc) 93 #define CPU_DTRACE_FAKERESTORE 0x0400 /* pid provider hint to getreg */ 94 #endif 95 #define CPU_DTRACE_ENTRY 0x0800 /* pid provider hint to ustack() */ 96 #define CPU_DTRACE_BADSTACK 0x1000 /* DTrace fault: bad stack */ 97 98 #define CPU_DTRACE_FAULT (CPU_DTRACE_BADADDR | CPU_DTRACE_BADALIGN | \ 99 CPU_DTRACE_DIVZERO | CPU_DTRACE_ILLOP | \ 100 CPU_DTRACE_NOSCRATCH | CPU_DTRACE_KPRIV | \ 101 CPU_DTRACE_UPRIV | CPU_DTRACE_TUPOFLOW | \ 102 CPU_DTRACE_BADSTACK) 103 #define CPU_DTRACE_ERROR (CPU_DTRACE_FAULT | CPU_DTRACE_DROP) 104 105 /* 106 * Flags in the CPU structure. 107 * 108 * These are protected by cpu_lock (except during creation). 109 * 110 * Offlined-CPUs have three stages of being offline: 111 * 112 * CPU_ENABLE indicates that the CPU is participating in I/O interrupts 113 * that can be directed at a number of different CPUs. If CPU_ENABLE 114 * is off, the CPU will not be given interrupts that can be sent elsewhere, 115 * but will still get interrupts from devices associated with that CPU only, 116 * and from other CPUs. 117 * 118 * CPU_OFFLINE indicates that the dispatcher should not allow any threads 119 * other than interrupt threads to run on that CPU. A CPU will not have 120 * CPU_OFFLINE set if there are any bound threads (besides interrupts). 121 * 122 * CPU_QUIESCED is set if p_offline was able to completely turn idle the 123 * CPU and it will not have to run interrupt threads. In this case it'll 124 * stay in the idle loop until CPU_QUIESCED is turned off. 125 * 126 * CPU_FROZEN is used only by CPR to mark CPUs that have been successfully 127 * suspended (in the suspend path), or have yet to be resumed (in the resume 128 * case). 129 * 130 * On some platforms CPUs can be individually powered off. 131 * The following flags are set for powered off CPUs: CPU_QUIESCED, 132 * CPU_OFFLINE, and CPU_POWEROFF. The following flags are cleared: 133 * CPU_RUNNING, CPU_READY, CPU_EXISTS, and CPU_ENABLE. 134 */ 135 #define CPU_RUNNING 0x001 /* CPU running */ 136 #define CPU_READY 0x002 /* CPU ready for cross-calls */ 137 #define CPU_QUIESCED 0x004 /* CPU will stay in idle */ 138 #define CPU_EXISTS 0x008 /* CPU is configured */ 139 #define CPU_ENABLE 0x010 /* CPU enabled for interrupts */ 140 #define CPU_OFFLINE 0x020 /* CPU offline via p_online */ 141 #define CPU_POWEROFF 0x040 /* CPU is powered off */ 142 #define CPU_FROZEN 0x080 /* CPU is frozen via CPR suspend */ 143 #define CPU_SPARE 0x100 /* CPU offline available for use */ 144 #define CPU_FAULTED 0x200 /* CPU offline diagnosed faulty */ 145 146 typedef enum { 147 CPU_INIT, 148 CPU_CONFIG, 149 CPU_UNCONFIG, 150 CPU_ON, 151 CPU_OFF, 152 CPU_CPUPART_IN, 153 CPU_CPUPART_OUT 154 } cpu_setup_t; 155 156 typedef int cpu_setup_func_t(cpu_setup_t, int, void *); 157 #define mp_maxid ncpu 158 159 160 #endif /* _COMPAT_OPENSOLARIS_SYS_CPUVAR_H */ 161