Centralize __pcpu definitions.
Many extern struct pcpu <something>__pcpu declarations were copied/pasted in sources. The issue is that the definition is MD, but it cannot be provided by machine/pcpu.h due to actual struct pcpu defined in sys/pcpu.h later than the inclusion of machine/pcpu.h. This forced the copying when other code needed direct access to __pcpu. There is no way around it, due to machine/pcpu.h supplying part of struct pcpu fields. To work around the problem, add a new machine/pcpu_aux.h header, which should fill any needed MD definitions after struct pcpu definition is completed. This allows to remove copies of __pcpu spread around the source. Also on x86 it makes it possible to remove work arounds like OFFSETOF_CURTHREAD or clang specific warnings supressions. Reported and tested by: lwhsu, bcran Reviewed by: imp, markj (previous version) Discussed with: jhb Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D21418
This commit is contained in:
parent
3dd6b8e5c7
commit
d33fdaeb7e
@ -94,8 +94,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#define AP_BOOTPT_SZ (PAGE_SIZE * 3)
|
||||
|
||||
extern struct pcpu *__pcpu;
|
||||
|
||||
/* Temporary variables for init_secondary() */
|
||||
char *doublefault_stack;
|
||||
char *mce_stack;
|
||||
|
@ -443,10 +443,6 @@ static pml4_entry_t *pti_pml4;
|
||||
static vm_pindex_t pti_pg_idx;
|
||||
static bool pti_finalized;
|
||||
|
||||
extern struct pcpu *__pcpu;
|
||||
extern struct pcpu temp_bsp_pcpu;
|
||||
extern pt_entry_t *pcpu_pte;
|
||||
|
||||
struct pmap_pkru_range {
|
||||
struct rs_el pkru_rs_el;
|
||||
u_int pkru_keyidx;
|
||||
|
@ -84,10 +84,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/vm_map.h>
|
||||
#include <vm/vm_param.h>
|
||||
|
||||
_Static_assert(OFFSETOF_CURTHREAD == offsetof(struct pcpu, pc_curthread),
|
||||
"OFFSETOF_CURTHREAD does not correspond with offset of pc_curthread.");
|
||||
_Static_assert(OFFSETOF_CURPCB == offsetof(struct pcpu, pc_curpcb),
|
||||
"OFFSETOF_CURPCB does not correspond with offset of pc_curpcb.");
|
||||
_Static_assert(OFFSETOF_MONITORBUF == offsetof(struct pcpu, pc_monitorbuf),
|
||||
"OFFSETOF_MONITORBUF does not correspond with offset of pc_monitorbuf.");
|
||||
|
||||
|
@ -33,9 +33,6 @@
|
||||
|
||||
#include <sys/pcpu.h>
|
||||
|
||||
extern struct pcpu *__pcpu;
|
||||
extern struct pcpu temp_bsp_pcpu;
|
||||
|
||||
#define EARLY_COUNTER &temp_bsp_pcpu.pc_early_dummy_counter
|
||||
|
||||
#define counter_enter() do {} while (0)
|
||||
|
@ -233,35 +233,6 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
|
||||
#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member)
|
||||
#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val)
|
||||
|
||||
#define OFFSETOF_CURTHREAD 0
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wnull-dereference"
|
||||
#endif
|
||||
static __inline __pure2 struct thread *
|
||||
__curthread(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
__asm("movq %%gs:%P1,%0" : "=r" (td) : "n" (OFFSETOF_CURTHREAD));
|
||||
return (td);
|
||||
}
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#define curthread (__curthread())
|
||||
|
||||
#define OFFSETOF_CURPCB 32
|
||||
static __inline __pure2 struct pcb *
|
||||
__curpcb(void)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
__asm("movq %%gs:%P1,%0" : "=r" (pcb) : "n" (OFFSETOF_CURPCB));
|
||||
return (pcb);
|
||||
}
|
||||
#define curpcb (__curpcb())
|
||||
|
||||
#define IS_BSP() (PCPU_GET(cpuid) == 0)
|
||||
|
||||
#else /* !__GNUCLIKE_ASM || !__GNUCLIKE___TYPEOF */
|
||||
|
72
sys/amd64/include/pcpu_aux.h
Normal file
72
sys/amd64/include/pcpu_aux.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/* Required for counters(9) to work on x86. */
|
||||
_Static_assert(sizeof(struct pcpu) == UMA_PCPU_ALLOC_SIZE, "fix pcpu size");
|
||||
|
||||
extern struct pcpu *__pcpu;
|
||||
extern struct pcpu temp_bsp_pcpu;
|
||||
|
||||
static __inline __pure2 struct thread *
|
||||
__curthread(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
__asm("movq %%gs:%P1,%0" : "=r" (td) : "n" (offsetof(struct pcpu,
|
||||
pc_curthread)));
|
||||
return (td);
|
||||
}
|
||||
#define curthread (__curthread())
|
||||
|
||||
static __inline __pure2 struct pcb *
|
||||
__curpcb(void)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
__asm("movq %%gs:%P1,%0" : "=r" (pcb) : "n" (offsetof(struct pcpu,
|
||||
pc_curpcb)));
|
||||
return (pcb);
|
||||
}
|
||||
#define curpcb (__curpcb())
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -63,7 +63,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <arm/mv/mvwin.h>
|
||||
#endif
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
/* used to hold the AP's until we are ready to release them */
|
||||
struct mtx ap_boot_mtx;
|
||||
struct pcb stoppcbs[MAXCPU];
|
||||
|
@ -34,8 +34,6 @@
|
||||
#include <sys/pcpu.h>
|
||||
#include <machine/atomic.h>
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
|
||||
|
||||
#define counter_enter() do {} while (0)
|
||||
|
52
sys/arm/include/pcpu_aux.h
Normal file
52
sys/arm/include/pcpu_aux.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/pcpu.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/sched.h>
|
||||
#include <sys/smp.h>
|
||||
@ -112,8 +113,6 @@ static struct intr_ipi *intr_ipi_lookup(u_int);
|
||||
static void intr_pic_ipi_setup(u_int, const char *, intr_ipi_handler_t *,
|
||||
void *);
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
static void ipi_ast(void *);
|
||||
static void ipi_hardclock(void *);
|
||||
static void ipi_preempt(void *);
|
||||
|
@ -32,8 +32,6 @@
|
||||
#include <sys/pcpu.h>
|
||||
#include <machine/atomic.h>
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
|
||||
|
||||
#define counter_enter() do {} while (0)
|
||||
|
52
sys/arm64/include/pcpu_aux.h
Normal file
52
sys/arm64/include/pcpu_aux.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -130,8 +130,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#endif /* CHECK_POINTS */
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
/*
|
||||
* Local data and functions.
|
||||
*/
|
||||
|
@ -90,10 +90,6 @@ __FBSDID("$FreeBSD$");
|
||||
#define NSFBUFS (512 + maxusers * 16)
|
||||
#endif
|
||||
|
||||
_Static_assert(OFFSETOF_CURTHREAD == offsetof(struct pcpu, pc_curthread),
|
||||
"OFFSETOF_CURTHREAD does not correspond with offset of pc_curthread.");
|
||||
_Static_assert(OFFSETOF_CURPCB == offsetof(struct pcpu, pc_curpcb),
|
||||
"OFFSETOF_CURPCB does not correspond with offset of pc_curpcb.");
|
||||
_Static_assert(__OFFSETOF_MONITORBUF == offsetof(struct pcpu, pc_monitorbuf),
|
||||
"__OFFSETOF_MONITORBUF does not correspond with offset of pc_monitorbuf.");
|
||||
|
||||
|
@ -38,8 +38,6 @@
|
||||
#include <machine/md_var.h>
|
||||
#include <machine/specialreg.h>
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
|
||||
|
||||
#define counter_enter() do { \
|
||||
|
@ -228,36 +228,6 @@ _Static_assert(sizeof(struct monitorbuf) == 128, "2x cache line");
|
||||
#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member)
|
||||
#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val)
|
||||
|
||||
#define OFFSETOF_CURTHREAD 0
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wnull-dereference"
|
||||
#endif
|
||||
static __inline __pure2 struct thread *
|
||||
__curthread(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
__asm("movl %%fs:%1,%0" : "=r" (td)
|
||||
: "m" (*(char *)OFFSETOF_CURTHREAD));
|
||||
return (td);
|
||||
}
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#define curthread (__curthread())
|
||||
|
||||
#define OFFSETOF_CURPCB 16
|
||||
static __inline __pure2 struct pcb *
|
||||
__curpcb(void)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
__asm("movl %%fs:%1,%0" : "=r" (pcb) : "m" (*(char *)OFFSETOF_CURPCB));
|
||||
return (pcb);
|
||||
}
|
||||
#define curpcb (__curpcb())
|
||||
|
||||
#define IS_BSP() (PCPU_GET(cpuid) == 0)
|
||||
|
||||
#else /* defined(__GNUCLIKE_ASM) && defined(__GNUCLIKE___TYPEOF) */
|
||||
|
71
sys/i386/include/pcpu_aux.h
Normal file
71
sys/i386/include/pcpu_aux.h
Normal file
@ -0,0 +1,71 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/* Required for counters(9) to work on x86. */
|
||||
_Static_assert(sizeof(struct pcpu) == UMA_PCPU_ALLOC_SIZE, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
static __inline __pure2 struct thread *
|
||||
__curthread(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
__asm("movl %%fs:%1,%0" : "=r" (td)
|
||||
: "m" (*(char *)offsetof(struct pcpu, pc_curthread)));
|
||||
return (td);
|
||||
}
|
||||
#define curthread (__curthread())
|
||||
|
||||
static __inline __pure2 struct pcb *
|
||||
__curpcb(void)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
__asm("movl %%fs:%1,%0" : "=r" (pcb)
|
||||
: "m" (*(char *)offsetof(struct pcpu, pc_curpcb)));
|
||||
return (pcb);
|
||||
}
|
||||
#define curpcb (__curpcb())
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
52
sys/mips/include/pcpu_aux.h
Normal file
52
sys/mips/include/pcpu_aux.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -36,8 +36,6 @@
|
||||
#include <sys/proc.h>
|
||||
#endif
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
|
||||
|
||||
#ifdef __powerpc64__
|
||||
|
52
sys/powerpc/include/pcpu_aux.h
Normal file
52
sys/powerpc/include/pcpu_aux.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -61,8 +61,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include "pic_if.h"
|
||||
|
||||
extern struct pcpu __pcpu[MAXCPU];
|
||||
|
||||
volatile static int ap_awake;
|
||||
volatile static u_int ap_letgo;
|
||||
volatile static u_quad_t ap_timebase;
|
||||
|
@ -34,8 +34,6 @@
|
||||
#include <sys/proc.h>
|
||||
#endif
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
|
||||
|
||||
#define counter_enter() critical_enter()
|
||||
|
52
sys/riscv/include/pcpu_aux.h
Normal file
52
sys/riscv/include/pcpu_aux.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -72,8 +72,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
boolean_t ofw_cpu_reg(phandle_t node, u_int, cell_t *);
|
||||
|
||||
extern struct pcpu __pcpu[];
|
||||
|
||||
uint32_t __riscv_boot_ap[MAXCPU];
|
||||
|
||||
static enum {
|
||||
|
50
sys/sparc64/include/pcpu_aux.h
Normal file
50
sys/sparc64/include/pcpu_aux.h
Normal file
@ -0,0 +1,50 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2019 The FreeBSD Foundation
|
||||
*
|
||||
* This software was developed by Konstantin Belousov <kib@FreeBSD.org>
|
||||
* under sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_PCPU_AUX_H_
|
||||
#define _MACHINE_PCPU_AUX_H_
|
||||
|
||||
#ifndef _KERNEL
|
||||
#error "Not for userspace"
|
||||
#endif
|
||||
|
||||
#ifndef _SYS_PCPU_H_
|
||||
#error "Do not include machine/pcpu_aux.h directly"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, the page size should
|
||||
* be a multiple of the size of struct pcpu.
|
||||
*/
|
||||
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
|
||||
|
||||
#endif /* _MACHINE_PCPU_AUX_H_ */
|
@ -216,26 +216,16 @@ extern struct cpuhead cpuhead;
|
||||
extern struct pcpu *cpuid_to_pcpu[];
|
||||
|
||||
#define curcpu PCPU_GET(cpuid)
|
||||
#define curproc (curthread->td_proc)
|
||||
#ifndef curthread
|
||||
#define curthread PCPU_GET(curthread)
|
||||
#endif
|
||||
#define curvidata PCPU_GET(vidata)
|
||||
|
||||
#define UMA_PCPU_ALLOC_SIZE PAGE_SIZE
|
||||
|
||||
#ifdef CTASSERT
|
||||
#if defined(__i386__) || defined(__amd64__)
|
||||
/* Required for counters(9) to work on x86. */
|
||||
CTASSERT(sizeof(struct pcpu) == UMA_PCPU_ALLOC_SIZE);
|
||||
#else
|
||||
/*
|
||||
* To minimize memory waste in per-cpu UMA zones, size of struct pcpu
|
||||
* should be denominator of PAGE_SIZE.
|
||||
*/
|
||||
CTASSERT((PAGE_SIZE / sizeof(struct pcpu)) * sizeof(struct pcpu) == PAGE_SIZE);
|
||||
#endif /* UMA_PCPU_ALLOC_SIZE && x86 */
|
||||
#endif /* CTASSERT */
|
||||
#include <machine/pcpu_aux.h>
|
||||
|
||||
#ifndef curthread
|
||||
#define curthread PCPU_GET(curthread)
|
||||
#endif
|
||||
#define curproc (curthread->td_proc)
|
||||
|
||||
/* Accessor to elements allocated via UMA_ZONE_PCPU zone. */
|
||||
static inline void *
|
||||
|
Loading…
x
Reference in New Issue
Block a user