1*8d67ca89SAndroid Build Coastguard Worker /* 2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project 3*8d67ca89SAndroid Build Coastguard Worker * All rights reserved. 4*8d67ca89SAndroid Build Coastguard Worker * 5*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*8d67ca89SAndroid Build Coastguard Worker * are met: 8*8d67ca89SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright 9*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*8d67ca89SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright 11*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in 12*8d67ca89SAndroid Build Coastguard Worker * the documentation and/or other materials provided with the 13*8d67ca89SAndroid Build Coastguard Worker * distribution. 14*8d67ca89SAndroid Build Coastguard Worker * 15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16*8d67ca89SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17*8d67ca89SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18*8d67ca89SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19*8d67ca89SAndroid Build Coastguard Worker * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20*8d67ca89SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21*8d67ca89SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22*8d67ca89SAndroid Build Coastguard Worker * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23*8d67ca89SAndroid Build Coastguard Worker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*8d67ca89SAndroid Build Coastguard Worker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25*8d67ca89SAndroid Build Coastguard Worker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE. 27*8d67ca89SAndroid Build Coastguard Worker */ 28*8d67ca89SAndroid Build Coastguard Worker 29*8d67ca89SAndroid Build Coastguard Worker #pragma once 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h> 32*8d67ca89SAndroid Build Coastguard Worker #include <stddef.h> /* For size_t. */ 33*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h> 34*8d67ca89SAndroid Build Coastguard Worker 35*8d67ca89SAndroid Build Coastguard Worker #include <bits/page_size.h> 36*8d67ca89SAndroid Build Coastguard Worker 37*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS 38*8d67ca89SAndroid Build Coastguard Worker 39*8d67ca89SAndroid Build Coastguard Worker #if defined(__i386__) 40*8d67ca89SAndroid Build Coastguard Worker 41*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct { 42*8d67ca89SAndroid Build Coastguard Worker long cwd; 43*8d67ca89SAndroid Build Coastguard Worker long swd; 44*8d67ca89SAndroid Build Coastguard Worker long twd; 45*8d67ca89SAndroid Build Coastguard Worker long fip; 46*8d67ca89SAndroid Build Coastguard Worker long fcs; 47*8d67ca89SAndroid Build Coastguard Worker long foo; 48*8d67ca89SAndroid Build Coastguard Worker long fos; 49*8d67ca89SAndroid Build Coastguard Worker long st_space[20]; 50*8d67ca89SAndroid Build Coastguard Worker }; 51*8d67ca89SAndroid Build Coastguard Worker struct user_fpxregs_struct { 52*8d67ca89SAndroid Build Coastguard Worker unsigned short cwd; 53*8d67ca89SAndroid Build Coastguard Worker unsigned short swd; 54*8d67ca89SAndroid Build Coastguard Worker unsigned short twd; 55*8d67ca89SAndroid Build Coastguard Worker unsigned short fop; 56*8d67ca89SAndroid Build Coastguard Worker long fip; 57*8d67ca89SAndroid Build Coastguard Worker long fcs; 58*8d67ca89SAndroid Build Coastguard Worker long foo; 59*8d67ca89SAndroid Build Coastguard Worker long fos; 60*8d67ca89SAndroid Build Coastguard Worker long mxcsr; 61*8d67ca89SAndroid Build Coastguard Worker long reserved; 62*8d67ca89SAndroid Build Coastguard Worker long st_space[32]; 63*8d67ca89SAndroid Build Coastguard Worker long xmm_space[32]; 64*8d67ca89SAndroid Build Coastguard Worker long padding[56]; 65*8d67ca89SAndroid Build Coastguard Worker }; 66*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct { 67*8d67ca89SAndroid Build Coastguard Worker long ebx; 68*8d67ca89SAndroid Build Coastguard Worker long ecx; 69*8d67ca89SAndroid Build Coastguard Worker long edx; 70*8d67ca89SAndroid Build Coastguard Worker long esi; 71*8d67ca89SAndroid Build Coastguard Worker long edi; 72*8d67ca89SAndroid Build Coastguard Worker long ebp; 73*8d67ca89SAndroid Build Coastguard Worker long eax; 74*8d67ca89SAndroid Build Coastguard Worker long xds; 75*8d67ca89SAndroid Build Coastguard Worker long xes; 76*8d67ca89SAndroid Build Coastguard Worker long xfs; 77*8d67ca89SAndroid Build Coastguard Worker long xgs; 78*8d67ca89SAndroid Build Coastguard Worker long orig_eax; 79*8d67ca89SAndroid Build Coastguard Worker long eip; 80*8d67ca89SAndroid Build Coastguard Worker long xcs; 81*8d67ca89SAndroid Build Coastguard Worker long eflags; 82*8d67ca89SAndroid Build Coastguard Worker long esp; 83*8d67ca89SAndroid Build Coastguard Worker long xss; 84*8d67ca89SAndroid Build Coastguard Worker }; 85*8d67ca89SAndroid Build Coastguard Worker struct user { 86*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct regs; 87*8d67ca89SAndroid Build Coastguard Worker int u_fpvalid; 88*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct i387; 89*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_tsize; 90*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_dsize; 91*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_ssize; 92*8d67ca89SAndroid Build Coastguard Worker unsigned long start_code; 93*8d67ca89SAndroid Build Coastguard Worker unsigned long start_stack; 94*8d67ca89SAndroid Build Coastguard Worker long int signal; 95*8d67ca89SAndroid Build Coastguard Worker int reserved; 96*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct* u_ar0; 97*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct* u_fpstate; 98*8d67ca89SAndroid Build Coastguard Worker unsigned long magic; 99*8d67ca89SAndroid Build Coastguard Worker char u_comm[32]; 100*8d67ca89SAndroid Build Coastguard Worker int u_debugreg[8]; 101*8d67ca89SAndroid Build Coastguard Worker }; 102*8d67ca89SAndroid Build Coastguard Worker 103*8d67ca89SAndroid Build Coastguard Worker #define UPAGES 1 104*8d67ca89SAndroid Build Coastguard Worker #define HOST_TEXT_START_ADDR (u.start_code) 105*8d67ca89SAndroid Build Coastguard Worker #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * PAGE_SIZE) 106*8d67ca89SAndroid Build Coastguard Worker 107*8d67ca89SAndroid Build Coastguard Worker #elif defined(__x86_64__) 108*8d67ca89SAndroid Build Coastguard Worker 109*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct { 110*8d67ca89SAndroid Build Coastguard Worker unsigned short cwd; 111*8d67ca89SAndroid Build Coastguard Worker unsigned short swd; 112*8d67ca89SAndroid Build Coastguard Worker unsigned short ftw; 113*8d67ca89SAndroid Build Coastguard Worker unsigned short fop; 114*8d67ca89SAndroid Build Coastguard Worker unsigned long rip; 115*8d67ca89SAndroid Build Coastguard Worker unsigned long rdp; 116*8d67ca89SAndroid Build Coastguard Worker unsigned int mxcsr; 117*8d67ca89SAndroid Build Coastguard Worker unsigned int mxcr_mask; 118*8d67ca89SAndroid Build Coastguard Worker unsigned int st_space[32]; 119*8d67ca89SAndroid Build Coastguard Worker unsigned int xmm_space[64]; 120*8d67ca89SAndroid Build Coastguard Worker unsigned int padding[24]; 121*8d67ca89SAndroid Build Coastguard Worker }; 122*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct { 123*8d67ca89SAndroid Build Coastguard Worker unsigned long r15; 124*8d67ca89SAndroid Build Coastguard Worker unsigned long r14; 125*8d67ca89SAndroid Build Coastguard Worker unsigned long r13; 126*8d67ca89SAndroid Build Coastguard Worker unsigned long r12; 127*8d67ca89SAndroid Build Coastguard Worker unsigned long rbp; 128*8d67ca89SAndroid Build Coastguard Worker unsigned long rbx; 129*8d67ca89SAndroid Build Coastguard Worker unsigned long r11; 130*8d67ca89SAndroid Build Coastguard Worker unsigned long r10; 131*8d67ca89SAndroid Build Coastguard Worker unsigned long r9; 132*8d67ca89SAndroid Build Coastguard Worker unsigned long r8; 133*8d67ca89SAndroid Build Coastguard Worker unsigned long rax; 134*8d67ca89SAndroid Build Coastguard Worker unsigned long rcx; 135*8d67ca89SAndroid Build Coastguard Worker unsigned long rdx; 136*8d67ca89SAndroid Build Coastguard Worker unsigned long rsi; 137*8d67ca89SAndroid Build Coastguard Worker unsigned long rdi; 138*8d67ca89SAndroid Build Coastguard Worker unsigned long orig_rax; 139*8d67ca89SAndroid Build Coastguard Worker unsigned long rip; 140*8d67ca89SAndroid Build Coastguard Worker unsigned long cs; 141*8d67ca89SAndroid Build Coastguard Worker unsigned long eflags; 142*8d67ca89SAndroid Build Coastguard Worker unsigned long rsp; 143*8d67ca89SAndroid Build Coastguard Worker unsigned long ss; 144*8d67ca89SAndroid Build Coastguard Worker unsigned long fs_base; 145*8d67ca89SAndroid Build Coastguard Worker unsigned long gs_base; 146*8d67ca89SAndroid Build Coastguard Worker unsigned long ds; 147*8d67ca89SAndroid Build Coastguard Worker unsigned long es; 148*8d67ca89SAndroid Build Coastguard Worker unsigned long fs; 149*8d67ca89SAndroid Build Coastguard Worker unsigned long gs; 150*8d67ca89SAndroid Build Coastguard Worker }; 151*8d67ca89SAndroid Build Coastguard Worker struct user { 152*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct regs; 153*8d67ca89SAndroid Build Coastguard Worker int u_fpvalid; 154*8d67ca89SAndroid Build Coastguard Worker int pad0; 155*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct i387; 156*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_tsize; 157*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_dsize; 158*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_ssize; 159*8d67ca89SAndroid Build Coastguard Worker unsigned long start_code; 160*8d67ca89SAndroid Build Coastguard Worker unsigned long start_stack; 161*8d67ca89SAndroid Build Coastguard Worker long int signal; 162*8d67ca89SAndroid Build Coastguard Worker int reserved; 163*8d67ca89SAndroid Build Coastguard Worker int pad1; 164*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct* u_ar0; 165*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs_struct* u_fpstate; 166*8d67ca89SAndroid Build Coastguard Worker unsigned long magic; 167*8d67ca89SAndroid Build Coastguard Worker char u_comm[32]; 168*8d67ca89SAndroid Build Coastguard Worker unsigned long u_debugreg[8]; 169*8d67ca89SAndroid Build Coastguard Worker unsigned long error_code; 170*8d67ca89SAndroid Build Coastguard Worker unsigned long fault_address; 171*8d67ca89SAndroid Build Coastguard Worker }; 172*8d67ca89SAndroid Build Coastguard Worker 173*8d67ca89SAndroid Build Coastguard Worker #elif defined(__arm__) 174*8d67ca89SAndroid Build Coastguard Worker 175*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs { 176*8d67ca89SAndroid Build Coastguard Worker struct fp_reg { 177*8d67ca89SAndroid Build Coastguard Worker unsigned int sign1:1; 178*8d67ca89SAndroid Build Coastguard Worker unsigned int unused:15; 179*8d67ca89SAndroid Build Coastguard Worker unsigned int sign2:1; 180*8d67ca89SAndroid Build Coastguard Worker unsigned int exponent:14; 181*8d67ca89SAndroid Build Coastguard Worker unsigned int j:1; 182*8d67ca89SAndroid Build Coastguard Worker unsigned int mantissa1:31; 183*8d67ca89SAndroid Build Coastguard Worker unsigned int mantissa0:32; 184*8d67ca89SAndroid Build Coastguard Worker } fpregs[8]; 185*8d67ca89SAndroid Build Coastguard Worker unsigned int fpsr:32; 186*8d67ca89SAndroid Build Coastguard Worker unsigned int fpcr:32; 187*8d67ca89SAndroid Build Coastguard Worker unsigned char ftype[8]; 188*8d67ca89SAndroid Build Coastguard Worker unsigned int init_flag; 189*8d67ca89SAndroid Build Coastguard Worker }; 190*8d67ca89SAndroid Build Coastguard Worker struct user_regs { 191*8d67ca89SAndroid Build Coastguard Worker unsigned long uregs[18]; 192*8d67ca89SAndroid Build Coastguard Worker }; 193*8d67ca89SAndroid Build Coastguard Worker struct user_vfp { 194*8d67ca89SAndroid Build Coastguard Worker unsigned long long fpregs[32]; 195*8d67ca89SAndroid Build Coastguard Worker unsigned long fpscr; 196*8d67ca89SAndroid Build Coastguard Worker }; 197*8d67ca89SAndroid Build Coastguard Worker struct user_vfp_exc { 198*8d67ca89SAndroid Build Coastguard Worker unsigned long fpexc; 199*8d67ca89SAndroid Build Coastguard Worker unsigned long fpinst; 200*8d67ca89SAndroid Build Coastguard Worker unsigned long fpinst2; 201*8d67ca89SAndroid Build Coastguard Worker }; 202*8d67ca89SAndroid Build Coastguard Worker struct user { 203*8d67ca89SAndroid Build Coastguard Worker struct user_regs regs; 204*8d67ca89SAndroid Build Coastguard Worker int u_fpvalid; 205*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_tsize; 206*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_dsize; 207*8d67ca89SAndroid Build Coastguard Worker unsigned long int u_ssize; 208*8d67ca89SAndroid Build Coastguard Worker unsigned long start_code; 209*8d67ca89SAndroid Build Coastguard Worker unsigned long start_stack; 210*8d67ca89SAndroid Build Coastguard Worker long int signal; 211*8d67ca89SAndroid Build Coastguard Worker int reserved; 212*8d67ca89SAndroid Build Coastguard Worker struct user_regs* u_ar0; 213*8d67ca89SAndroid Build Coastguard Worker unsigned long magic; 214*8d67ca89SAndroid Build Coastguard Worker char u_comm[32]; 215*8d67ca89SAndroid Build Coastguard Worker int u_debugreg[8]; 216*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs u_fp; 217*8d67ca89SAndroid Build Coastguard Worker struct user_fpregs* u_fp0; 218*8d67ca89SAndroid Build Coastguard Worker }; 219*8d67ca89SAndroid Build Coastguard Worker 220*8d67ca89SAndroid Build Coastguard Worker #elif defined(__aarch64__) 221*8d67ca89SAndroid Build Coastguard Worker 222*8d67ca89SAndroid Build Coastguard Worker struct user_regs_struct { 223*8d67ca89SAndroid Build Coastguard Worker uint64_t regs[31]; 224*8d67ca89SAndroid Build Coastguard Worker uint64_t sp; 225*8d67ca89SAndroid Build Coastguard Worker uint64_t pc; 226*8d67ca89SAndroid Build Coastguard Worker uint64_t pstate; 227*8d67ca89SAndroid Build Coastguard Worker }; 228*8d67ca89SAndroid Build Coastguard Worker struct user_fpsimd_struct { 229*8d67ca89SAndroid Build Coastguard Worker __uint128_t vregs[32]; 230*8d67ca89SAndroid Build Coastguard Worker uint32_t fpsr; 231*8d67ca89SAndroid Build Coastguard Worker uint32_t fpcr; 232*8d67ca89SAndroid Build Coastguard Worker }; 233*8d67ca89SAndroid Build Coastguard Worker 234*8d67ca89SAndroid Build Coastguard Worker #elif defined(__riscv) 235*8d67ca89SAndroid Build Coastguard Worker 236*8d67ca89SAndroid Build Coastguard Worker // This space deliberately left blank for now. 237*8d67ca89SAndroid Build Coastguard Worker // No other libcs have any riscv64-specific structs. 238*8d67ca89SAndroid Build Coastguard Worker 239*8d67ca89SAndroid Build Coastguard Worker #else 240*8d67ca89SAndroid Build Coastguard Worker 241*8d67ca89SAndroid Build Coastguard Worker #error "Unsupported architecture." 242*8d67ca89SAndroid Build Coastguard Worker 243*8d67ca89SAndroid Build Coastguard Worker #endif 244*8d67ca89SAndroid Build Coastguard Worker 245*8d67ca89SAndroid Build Coastguard Worker __END_DECLS 246