1/*-
2 * Copyright (c) 2001 Jake Burkholder.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28
29#ifndef	_MACHINE_PCB_H_
30#define	_MACHINE_PCB_H_
31
32#ifndef LOCORE
33
34#include <machine/debug_monitor.h>
35#include <machine/vfp.h>
36
37struct trapframe;
38
39struct pcb {
40	uint64_t	pcb_x[30];
41	uint64_t	pcb_lr;
42	uint64_t	_reserved;	/* Was pcb_pc */
43	/* These two need to be in order as we access them together */
44	uint64_t	pcb_sp;
45	uint64_t	pcb_tpidr_el0;
46	uint64_t	pcb_tpidrro_el0;
47
48	/* Fault handler, the error value is passed in x0 */
49	vm_offset_t	pcb_onfault;
50
51	u_int		pcb_flags;
52#define	PCB_SINGLE_STEP_SHIFT	0
53#define	PCB_SINGLE_STEP		(1 << PCB_SINGLE_STEP_SHIFT)
54
55	struct vfpstate	*pcb_fpusaved;
56	int		pcb_fpflags;
57#define	PCB_FP_STARTED	0x01
58#define	PCB_FP_KERN	0x02
59#define	PCB_FP_NOSAVE	0x04
60/* The bits passed to userspace in get_fpcontext */
61#define	PCB_FP_USERMASK	(PCB_FP_STARTED)
62	u_int		pcb_vfpcpu;	/* Last cpu this thread ran VFP code */
63
64	/*
65	 * The userspace VFP state. The pcb_fpusaved pointer will point to
66	 * this unless the kernel has allocated a VFP context.
67	 * Place last to simplify the asm to access the rest if the struct.
68	 */
69	struct vfpstate	pcb_fpustate;
70
71	struct debug_monitor_state pcb_dbg_regs;
72};
73
74#ifdef _KERNEL
75void	makectx(struct trapframe *tf, struct pcb *pcb);
76int	savectx(struct pcb *pcb) __returns_twice;
77#endif
78
79#endif /* !LOCORE */
80
81#endif /* !_MACHINE_PCB_H_ */
82