1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org> 5 * Copyright (c) Peter Wemm <peter@netplex.com.au> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * from: src/sys/alpha/include/pcpu.h,v 1.15 2004/11/05 19:16:44 jhb 30 * $FreeBSD$ 31 */ 32 33#ifndef _MACHINE_PCPU_H_ 34#define _MACHINE_PCPU_H_ 35 36#include <machine/cpufunc.h> 37#include <machine/pte.h> 38 39#define PCPU_MD_COMMON_FIELDS \ 40 pd_entry_t *pc_segbase; /* curthread segbase */ \ 41 struct pmap *pc_curpmap; /* pmap of curthread */ \ 42 u_int32_t pc_next_asid; /* next ASID to alloc */ \ 43 u_int32_t pc_asid_generation; /* current ASID generation */ \ 44 u_int pc_pending_ipis; /* IPIs pending to this CPU */ \ 45 struct pcpu *pc_self; /* globally-uniqe self pointer */ 46 47#ifdef __mips_n64 48#define PCPU_MD_MIPS64_FIELDS \ 49 PCPU_MD_COMMON_FIELDS \ 50 char __pad[245] 51#else 52#define PCPU_MD_MIPS32_FIELDS \ 53 PCPU_MD_COMMON_FIELDS \ 54 char __pad[125] 55#endif 56 57#ifdef __mips_n64 58#define PCPU_MD_FIELDS PCPU_MD_MIPS64_FIELDS 59#else 60#define PCPU_MD_FIELDS PCPU_MD_MIPS32_FIELDS 61#endif 62 63#ifdef _KERNEL 64 65extern char pcpu_space[MAXCPU][PAGE_SIZE * 2]; 66#define PCPU_ADDR(cpu) (struct pcpu *)(pcpu_space[(cpu)]) 67 68extern struct pcpu *pcpup; 69#define PCPUP pcpup 70 71/* 72 * Since we use a wired TLB entry to map the same VA to a different 73 * physical page for each CPU, get_pcpu() must use the pc_self 74 * field to obtain a globally-unique pointer. 75 */ 76#define get_pcpu() (PCPUP->pc_self) 77 78#define PCPU_ADD(member, value) (PCPUP->pc_ ## member += (value)) 79#define PCPU_GET(member) (PCPUP->pc_ ## member) 80#define PCPU_INC(member) PCPU_ADD(member, 1) 81#define PCPU_PTR(member) (&PCPUP->pc_ ## member) 82#define PCPU_SET(member,value) (PCPUP->pc_ ## member = (value)) 83#define PCPU_LAZY_INC(member) (++PCPUP->pc_ ## member) 84 85#ifdef SMP 86/* 87 * Instantiate the wired TLB entry at PCPU_TLB_ENTRY to map 'pcpu' at 'pcpup'. 88 */ 89void mips_pcpu_tlb_init(struct pcpu *pcpu); 90#endif 91 92#endif /* _KERNEL */ 93 94#endif /* !_MACHINE_PCPU_H_ */ 95