]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/ia64/include/pcpu.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / ia64 / include / pcpu.h
1 /*-
2  * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
3  * Copyright (c) Peter Wemm <peter@netplex.com.au>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29
30 #ifndef _MACHINE_PCPU_H_
31 #define _MACHINE_PCPU_H_
32
33 #include <sys/sysctl.h>
34 #include <machine/pcb.h>
35
36 struct pcpu_stats {
37         u_long          pcs_nasts;              /* IPI_AST counter. */
38         u_long          pcs_nclks;              /* Clock interrupt counter. */
39         u_long          pcs_nextints;           /* ExtINT counter. */
40         u_long          pcs_nhardclocks;        /* IPI_HARDCLOCK counter. */
41         u_long          pcs_nhighfps;           /* IPI_HIGH_FP counter. */
42         u_long          pcs_nhwints;            /* Hardware int. counter. */
43         u_long          pcs_npreempts;          /* IPI_PREEMPT counter. */
44         u_long          pcs_nrdvs;              /* IPI_RENDEZVOUS counter. */
45         u_long          pcs_nstops;             /* IPI_STOP counter. */
46         u_long          pcs_nstrays;            /* Stray interrupt counter. */
47 };
48
49 struct pcpu_md {
50         struct pcb      pcb;                    /* Used by IPI_STOP */
51         struct pmap     *current_pmap;          /* active pmap */
52         vm_offset_t     vhpt;                   /* Address of VHPT */
53         uint64_t        lid;                    /* local CPU ID */
54         uint64_t        clock;                  /* Clock counter. */
55         uint64_t        clock_load;             /* Clock reload value. */
56         uint32_t        clock_mode;             /* Clock ET mode */
57         uint32_t        awake:1;                /* CPU is awake? */
58         struct pcpu_stats stats;                /* Interrupt stats. */
59 #ifdef _KERNEL
60         struct sysctl_ctx_list sysctl_ctx;
61         struct sysctl_oid *sysctl_tree;
62 #endif
63 };
64
65 #define PCPU_MD_FIELDS                                                  \
66         uint32_t        pc_acpi_id;             /* ACPI CPU id. */      \
67         struct pcpu_md  pc_md                   /* MD fields. */
68
69 #ifdef _KERNEL
70
71 struct pcpu;
72
73 register struct pcpu * volatile pcpup __asm__("r13");
74
75 static __inline __pure2 struct thread *
76 __curthread(void)
77 {
78         struct thread *td;
79
80         __asm("ld8.acq %0=[r13]" : "=r"(td));
81         return (td);
82 }
83 #define curthread       (__curthread())
84
85 #define PCPU_GET(member)        (pcpup->pc_ ## member)
86
87 /*
88  * XXX The implementation of this operation should be made atomic
89  * with respect to preemption.
90  */
91 #define PCPU_ADD(member, value) (pcpup->pc_ ## member += (value))
92 #define PCPU_INC(member)        PCPU_ADD(member, 1)
93 #define PCPU_PTR(member)        (&pcpup->pc_ ## member)
94 #define PCPU_SET(member,value)  (pcpup->pc_ ## member = (value))
95
96 #endif  /* _KERNEL */
97
98 #endif  /* !_MACHINE_PCPU_H_ */