xref: /freebsd/sys/arm64/include/pcb.h (revision a7c5c88cb29ff512467a6599f1b4d8e2b8817480)
1412042e2SAndrew Turner /*-
2412042e2SAndrew Turner  * Copyright (c) 2001 Jake Burkholder.
3412042e2SAndrew Turner  * All rights reserved.
4412042e2SAndrew Turner  *
5412042e2SAndrew Turner  * Redistribution and use in source and binary forms, with or without
6412042e2SAndrew Turner  * modification, are permitted provided that the following conditions
7412042e2SAndrew Turner  * are met:
8412042e2SAndrew Turner  * 1. Redistributions of source code must retain the above copyright
9412042e2SAndrew Turner  *    notice, this list of conditions and the following disclaimer.
10412042e2SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
11412042e2SAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
12412042e2SAndrew Turner  *    documentation and/or other materials provided with the distribution.
13412042e2SAndrew Turner  *
14412042e2SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15412042e2SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16412042e2SAndrew Turner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17412042e2SAndrew Turner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18412042e2SAndrew Turner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19412042e2SAndrew Turner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20412042e2SAndrew Turner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21412042e2SAndrew Turner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22412042e2SAndrew Turner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23412042e2SAndrew Turner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24412042e2SAndrew Turner  * SUCH DAMAGE.
25412042e2SAndrew Turner  */
26412042e2SAndrew Turner 
27d5d97bedSMike Karels #ifdef __arm__
28d5d97bedSMike Karels #include <arm/pcb.h>
29d5d97bedSMike Karels #else /* !__arm__ */
30d5d97bedSMike Karels 
31412042e2SAndrew Turner #ifndef	_MACHINE_PCB_H_
32412042e2SAndrew Turner #define	_MACHINE_PCB_H_
33412042e2SAndrew Turner 
34412042e2SAndrew Turner #ifndef LOCORE
35412042e2SAndrew Turner 
3605f39d1aSAndrew Turner #include <machine/debug_monitor.h>
378ff00301SAndrew Turner #include <machine/vfp.h>
388ff00301SAndrew Turner 
39412042e2SAndrew Turner struct trapframe;
40412042e2SAndrew Turner 
411c1f31a5SAndrew Turner /* The first register in pcb_x is x19 */
421c1f31a5SAndrew Turner #define	PCB_X_START	19
431c1f31a5SAndrew Turner 
441c1f31a5SAndrew Turner #define	PCB_X19		0
451c1f31a5SAndrew Turner #define	PCB_X20		1
461c1f31a5SAndrew Turner #define	PCB_FP		10
471c1f31a5SAndrew Turner #define	PCB_LR		11
481c33a94aSAndrew Turner 
49412042e2SAndrew Turner struct pcb {
501c1f31a5SAndrew Turner 	uint64_t	pcb_x[12];
51412042e2SAndrew Turner 	/* These two need to be in order as we access them together */
52412042e2SAndrew Turner 	uint64_t	pcb_sp;
53412042e2SAndrew Turner 	uint64_t	pcb_tpidr_el0;
549a19869aSAndrew Turner 	uint64_t	pcb_tpidrro_el0;
55412042e2SAndrew Turner 
56412042e2SAndrew Turner 	/* Fault handler, the error value is passed in x0 */
57412042e2SAndrew Turner 	vm_offset_t	pcb_onfault;
58412042e2SAndrew Turner 
5987e19994SAndrew Turner 	u_int		pcb_flags;
6087e19994SAndrew Turner #define	PCB_SINGLE_STEP_SHIFT	0
6187e19994SAndrew Turner #define	PCB_SINGLE_STEP		(1 << PCB_SINGLE_STEP_SHIFT)
62332c4263SAndrew Turner 	u_int		pcb_sve_len;	/* The SVE vector length */
6387e19994SAndrew Turner 
648ff00301SAndrew Turner 	struct vfpstate	*pcb_fpusaved;
65144aa0b7SAndrew Turner 	int		pcb_fpflags;
66376025cfSAndrew Turner #define	PCB_FP_STARTED	0x00000001
67332c4263SAndrew Turner #define	PCB_FP_SVEVALID	0x00000002
68376025cfSAndrew Turner #define	PCB_FP_KERN	0x40000000
69376025cfSAndrew Turner #define	PCB_FP_NOSAVE	0x80000000
704c247b97SAndrew Turner /* The bits passed to userspace in get_fpcontext */
71332c4263SAndrew Turner #define	PCB_FP_USERMASK	(PCB_FP_STARTED | PCB_FP_SVEVALID)
72412042e2SAndrew Turner 	u_int		pcb_vfpcpu;	/* Last cpu this thread ran VFP code */
73332c4263SAndrew Turner 	void		*pcb_svesaved;
74332c4263SAndrew Turner 	uint64_t	pcb_reserved[4];
758ff00301SAndrew Turner 
768ff00301SAndrew Turner 	/*
778ff00301SAndrew Turner 	 * The userspace VFP state. The pcb_fpusaved pointer will point to
788ff00301SAndrew Turner 	 * this unless the kernel has allocated a VFP context.
798ff00301SAndrew Turner 	 * Place last to simplify the asm to access the rest if the struct.
808ff00301SAndrew Turner 	 */
818ff00301SAndrew Turner 	struct vfpstate	pcb_fpustate;
8205f39d1aSAndrew Turner 
8305f39d1aSAndrew Turner 	struct debug_monitor_state pcb_dbg_regs;
84412042e2SAndrew Turner };
85412042e2SAndrew Turner 
86412042e2SAndrew Turner #ifdef _KERNEL
87412042e2SAndrew Turner void	makectx(struct trapframe *tf, struct pcb *pcb);
88*a7c5c88cSAndrew Turner void	savectx(struct pcb *pcb) __returns_twice;
89412042e2SAndrew Turner #endif
90412042e2SAndrew Turner 
91412042e2SAndrew Turner #endif /* !LOCORE */
92412042e2SAndrew Turner 
93412042e2SAndrew Turner #endif /* !_MACHINE_PCB_H_ */
94d5d97bedSMike Karels 
95d5d97bedSMike Karels #endif /* !__arm__ */
96