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