
{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}


  {
   * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
   *
   * @APPLE_LICENSE_HEADER_START@
   * 
   * The contents of this file constitute Original Code as defined in and
   * are subject to the Apple Public Source License Version 1.1 (the
   * "License").  You may not use this file except in compliance with the
   * License.  Please obtain a copy of the License at
   * http://www.apple.com/publicsource and read it before using this file.
   * 
   * This Original Code and all software distributed under the License are
   * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
   * License for the specific language governing rights and limitations
   * under the License.
   * 
   * @APPLE_LICENSE_HEADER_END@
    }
  {
   * @OSF_COPYRIGHT@
    }
  { 
   * Mach Operating System
   * Copyright (c) 1991,1990,1989 Carnegie Mellon University
   * All Rights Reserved.
   * 
   * Permission to use, copy, modify and distribute this software and its
   * documentation is hereby granted, provided that both the copyright
   * notice and this permission notice appear in all copies of the
   * software, derivative works or modified versions, and any portions
   * thereof, and that both notices appear in supporting documentation.
   * 
   * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
   * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
   * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
   * 
   * Carnegie Mellon requests users of this software to return to
   * 
   *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
   *  School of Computer Science
   *  Carnegie Mellon University
   *  Pittsburgh PA 15213-3890
   * 
   * any improvements or extensions that they make and grant Carnegie Mellon
   * the rights to redistribute these changes.
    }
  {
    }
  {
   *	File:	thread_status.h
   *	Author:	Avadis Tevanian, Jr.
   *	Date:	1985
   *
   *	This file contains the structure definitions for the thread
   *	state as applied to I386 processors.
    }
  {
   *	i386_thread_state	this is the structure that is exported
   *				to user threads for use in status/mutate
   *				calls.  This structure should never
   *				change.
   *
   *	i386_float_state	exported to use threads for access to 
   *				floating point registers. Try not to 
   *				change this one, either.
   *
    }
  {     THREAD_STATE_FLAVOR_LIST 0  }

{
  const
     i386_THREAD_STATE = 1;     
     i386_FLOAT_STATE = 2;     
     i386_EXCEPTION_STATE = 3;     
     THREAD_STATE_NONE = 4;     
}
  {
   * Main thread state consists of
   * general registers, segment registers,
   * eip and eflags.
    }

  type
     i386_thread_state = record
          eax : cuint;
          ebx : cuint;
          ecx : cuint;
          edx : cuint;
          edi : cuint;
          esi : cuint;
          ebp : cuint;
          esp : cuint;
          ss : cuint;
          eflags : cuint;
          eip : cuint;
          cs : cuint;
          ds : cuint;
          es : cuint;
          fs : cuint;
          gs : cuint;
       end;
     i386_thread_state_t = i386_thread_state;


  type
     x86_64_thread_state = record
          rax : cuint64;
          rbx : cuint64;
          rcx : cuint64;
          rdx : cuint64;
          rdi : cuint64;
          rsi : cuint64;
          rbp : cuint64;
          rsp : cuint64;
          r8 : cuint64;
          r9 : cuint64;
          r10 : cuint64;
          r11 : cuint64;
          r12 : cuint64;
          r13 : cuint64;
          r14 : cuint64;
          r15 : cuint64;
          rip : cuint64;
          rflags : cuint64;
          cs : cuint64;
          fs : cuint64;
          gs : cuint64;
       end;
     x86_64_thread_state_t = x86_64_thread_state;

  {
   * Default segment register values.
    }

  const
     USER_CODE_SELECTOR = $0017;     
     USER_DATA_SELECTOR = $001f;     
     KERN_CODE_SELECTOR = $0008;     
     KERN_DATA_SELECTOR = $0010;     
     FP_PREC_24B = 0;     
     FP_PREC_53B = 2;     
     FP_PREC_64B = 3;     
     FP_RND_NEAR = 0;     
     FP_RND_DOWN = 1;     
     FP_RND_UP = 2;     
     FP_CHOP = 3;     

  type

     fp_control = record
          flag0 : cushort;
       end;
     fp_control_t = fp_control;

  const
     bm_fp_control_invalid = $1;
     bp_fp_control_invalid = 0;
     bm_fp_control_denorm = $2;
     bp_fp_control_denorm = 1;
     bm_fp_control_zdiv = $4;
     bp_fp_control_zdiv = 2;
     bm_fp_control_ovrfl = $8;
     bp_fp_control_ovrfl = 3;
     bm_fp_control_undfl = $10;
     bp_fp_control_undfl = 4;
     bm_fp_control_precis = $20;
     bp_fp_control_precis = 5;
     bm_fp_control_x = $C0;
     bp_fp_control_x = 6;
     bm_fp_control_pc = $300;
     bp_fp_control_pc = 8;
     bm_fp_control_rc = $C00;
     bp_fp_control_rc = 10;
     bm_fp_control_inf = $1000;
     bp_fp_control_inf = 12;
     bm_fp_control_y = $E000;
     bp_fp_control_y = 13;

(*
  function invalid(var a : fp_control) : word;
  procedure set_invalid(var a : fp_control; __invalid : word);
  function denorm(var a : fp_control) : word;
  procedure set_denorm(var a : fp_control; __denorm : word);
  function zdiv(var a : fp_control) : word;
  procedure set_zdiv(var a : fp_control; __zdiv : word);
  function ovrfl(var a : fp_control) : word;
  procedure set_ovrfl(var a : fp_control; __ovrfl : word);
  function undfl(var a : fp_control) : word;
  procedure set_undfl(var a : fp_control; __undfl : word);
  function precis(var a : fp_control) : word;
  procedure set_precis(var a : fp_control; __precis : word);
  function pc(var a : fp_control) : word;
  procedure set_pc(var a : fp_control; __pc : word);
  function rc(var a : fp_control) : word;
  procedure set_rc(var a : fp_control; __rc : word);
  function inf(var a : fp_control) : word;
  procedure set_inf(var a : fp_control; __inf : word);
*)
  {
   * Status word.
    }

  type

     fp_status = record
          flag0 : cushort;
       end;
     fp_status_t = fp_status;

  const
     bm_fp_status_invalid = $1;
     bp_fp_status_invalid = 0;
     bm_fp_status_denorm = $2;
     bp_fp_status_denorm = 1;
     bm_fp_status_zdiv = $4;
     bp_fp_status_zdiv = 2;
     bm_fp_status_ovrfl = $8;
     bp_fp_status_ovrfl = 3;
     bm_fp_status_undfl = $10;
     bp_fp_status_undfl = 4;
     bm_fp_status_precis = $20;
     bp_fp_status_precis = 5;
     bm_fp_status_stkflt = $40;
     bp_fp_status_stkflt = 6;
     bm_fp_status_errsumm = $80;
     bp_fp_status_errsumm = 7;
     bm_fp_status_c0 = $100;
     bp_fp_status_c0 = 8;
     bm_fp_status_c1 = $200;
     bp_fp_status_c1 = 9;
     bm_fp_status_c2 = $400;
     bp_fp_status_c2 = 10;
     bm_fp_status_tos = $3800;
     bp_fp_status_tos = 11;
     bm_fp_status_c3 = $4000;
     bp_fp_status_c3 = 14;
     bm_fp_status_busy = $8000;
     bp_fp_status_busy = 15;

{
  function invalid(var a : fp_status) : word;
  procedure set_invalid(var a : fp_status; __invalid : word);
  function denorm(var a : fp_status) : word;
  procedure set_denorm(var a : fp_status; __denorm : word);
  function zdiv(var a : fp_status) : word;
  procedure set_zdiv(var a : fp_status; __zdiv : word);
  function ovrfl(var a : fp_status) : word;
  procedure set_ovrfl(var a : fp_status; __ovrfl : word);
  function undfl(var a : fp_status) : word;
  procedure set_undfl(var a : fp_status; __undfl : word);
  function precis(var a : fp_status) : word;
  procedure set_precis(var a : fp_status; __precis : word);
  function stkflt(var a : fp_status) : word;
  procedure set_stkflt(var a : fp_status; __stkflt : word);
  function errsumm(var a : fp_status) : word;
  procedure set_errsumm(var a : fp_status; __errsumm : word);
  function c0(var a : fp_status) : word;
  procedure set_c0(var a : fp_status; __c0 : word);
  function c1(var a : fp_status) : word;
  procedure set_c1(var a : fp_status; __c1 : word);
  function c2(var a : fp_status) : word;
  procedure set_c2(var a : fp_status; __c2 : word);
  function tos(var a : fp_status) : word;
  procedure set_tos(var a : fp_status; __tos : word);
  function c3(var a : fp_status) : word;
  procedure set_c3(var a : fp_status; __c3 : word);
  function busy(var a : fp_status) : word;
  procedure set_busy(var a : fp_status; __busy : word);
}

  { defn of 80bit x87 FPU or MMX register   }

  type
     mmst_reg = record
          mmst_reg : array[0..9] of byte;
          mmst_rsrv : array[0..5] of byte;
       end;

  { defn of 128 bit XMM regs  }
     xmm_reg = record
          xmm_reg : array[0..15] of byte;
       end;

  { 
   * Floating point state.
    }
  { number of chars worth of data from fpu_fcw  }

  const
     FP_STATE_BYTES = 512;     
  { For legacy reasons we need to leave the hw_state as char bytes  }
  { x87 FPU control word  }
  { x87 FPU status word  }
  { x87 FPU tag word  }
  { reserved  }  { x87 FPU Opcode  }
  { x87 FPU Instruction Pointer offset  }
  { x87 FPU Instruction Pointer Selector  }
  { reserved  }
  { x87 FPU Instruction Operand(Data) Pointer offset  }
  { x87 FPU Instruction Operand(Data) Pointer Selector  }
  { reserved  }
  { MXCSR Register state  }
  { MXCSR mask  }
  { ST0/MM0    }
  { ST1/MM1   }
  { ST2/MM2   }
  { ST3/MM3   }
  { ST4/MM4   }
  { ST5/MM5   }
  { ST6/MM6   }
  { ST7/MM7   }
  { XMM 0   }
  { XMM 1   }
  { XMM 2   }
  { XMM 3   }
  { XMM 4   }
  { XMM 5   }
  { XMM 6   }
  { XMM 7   }
  { reserved  }

  type
     i386_float_state = record
          fpu_reserved : array[0..1] of cint;
          fpu_fcw : fp_control_t;
          fpu_fsw : fp_status_t;
          fpu_ftw : cuint8;
          fpu_rsrv1 : cuint8;
          fpu_fop : cuint16;
          fpu_ip : cuint32;
          fpu_cs : cuint16;
          fpu_rsrv2 : cuint16;
          fpu_dp : cuint32;
          fpu_ds : cuint16;
          fpu_rsrv3 : cuint16;
          fpu_mxcsr : cuint32;
          fpu_mxcsrmask : cuint32;
          fpu_stmm0 : mmst_reg;
          fpu_stmm1 : mmst_reg;
          fpu_stmm2 : mmst_reg;
          fpu_stmm3 : mmst_reg;
          fpu_stmm4 : mmst_reg;
          fpu_stmm5 : mmst_reg;
          fpu_stmm6 : mmst_reg;
          fpu_stmm7 : mmst_reg;
          fpu_xmm0 : xmm_reg;
          fpu_xmm1 : xmm_reg;
          fpu_xmm2 : xmm_reg;
          fpu_xmm3 : xmm_reg;
          fpu_xmm4 : xmm_reg;
          fpu_xmm5 : xmm_reg;
          fpu_xmm6 : xmm_reg;
          fpu_xmm7 : xmm_reg;
          fpu_rsrv4 : array[0..(14*16)-1] of byte;
          fpu_reserved1 : cint;
       end;

     i386_float_state_t = i386_float_state;

    {
     * Extra state that may be
     * useful to exception handlers.
      }
       i386_exception_state = record
            trapno : cuint;
            err : cuint;
            faultvaddr : cuint;
         end;

       i386_exception_state_t = i386_exception_state;


  type
     x86_64_float_state = record
          fpu_reserved : array[0..1] of cint;
          fpu_fcw : fp_control_t;
          fpu_fsw : fp_status_t;
          fpu_ftw : cuint8;
          fpu_rsrv1 : cuint8;
          fpu_fop : cuint16;
          fpu_ip : cuint32;
          fpu_cs : cuint16;
          fpu_rsrv2 : cuint16;
          fpu_dp : cuint32;
          fpu_ds : cuint16;
          fpu_rsrv3 : cuint16;
          fpu_mxcsr : cuint32;
          fpu_mxcsrmask : cuint32;
          fpu_stmm0 : mmst_reg;
          fpu_stmm1 : mmst_reg;
          fpu_stmm2 : mmst_reg;
          fpu_stmm3 : mmst_reg;
          fpu_stmm4 : mmst_reg;
          fpu_stmm5 : mmst_reg;
          fpu_stmm6 : mmst_reg;
          fpu_stmm7 : mmst_reg;
          fpu_xmm0 : xmm_reg;
          fpu_xmm1 : xmm_reg;
          fpu_xmm2 : xmm_reg;
          fpu_xmm3 : xmm_reg;
          fpu_xmm4 : xmm_reg;
          fpu_xmm5 : xmm_reg;
          fpu_xmm6 : xmm_reg;
          fpu_xmm7 : xmm_reg;
          fpu_xmm8 : xmm_reg;
          fpu_xmm9 : xmm_reg;
          fpu_xmm10 : xmm_reg;
          fpu_xmm11 : xmm_reg;
          fpu_xmm12 : xmm_reg;
          fpu_xmm13 : xmm_reg;
          fpu_xmm14 : xmm_reg;
          fpu_xmm15 : xmm_reg;
          fpu_rsrv4 : array[0..(6*16)-1] of byte;
          fpu_reserved1 : cint;
       end;

     x86_64_float_state_t = x86_64_float_state;
    {
     * Extra state that may be
     * useful to exception handlers.
      }
       x86_64_exception_state = record
            trapno : cuint;
            err : cuint;
            faultvaddr : cuint64;
         end;

       x86_64_exception_state_t = x86_64_exception_state;

(*
  function invalid(var a : fp_control) : word;
    begin
       invalid:=(a.flag0 and bm_fp_control_invalid) shr bp_fp_control_invalid;
    end;

  procedure set_invalid(var a : fp_control; __invalid : word);
    begin
       a.flag0:=a.flag0 or ((__invalid shl bp_fp_control_invalid) and bm_fp_control_invalid);
    end;

  function denorm(var a : fp_control) : word;
    begin
       denorm:=(a.flag0 and bm_fp_control_denorm) shr bp_fp_control_denorm;
    end;

  procedure set_denorm(var a : fp_control; __denorm : word);
    begin
       a.flag0:=a.flag0 or ((__denorm shl bp_fp_control_denorm) and bm_fp_control_denorm);
    end;

  function zdiv(var a : fp_control) : word;
    begin
       zdiv:=(a.flag0 and bm_fp_control_zdiv) shr bp_fp_control_zdiv;
    end;

  procedure set_zdiv(var a : fp_control; __zdiv : word);
    begin
       a.flag0:=a.flag0 or ((__zdiv shl bp_fp_control_zdiv) and bm_fp_control_zdiv);
    end;

  function ovrfl(var a : fp_control) : word;
    begin
       ovrfl:=(a.flag0 and bm_fp_control_ovrfl) shr bp_fp_control_ovrfl;
    end;

  procedure set_ovrfl(var a : fp_control; __ovrfl : word);
    begin
       a.flag0:=a.flag0 or ((__ovrfl shl bp_fp_control_ovrfl) and bm_fp_control_ovrfl);
    end;

  function undfl(var a : fp_control) : word;
    begin
       undfl:=(a.flag0 and bm_fp_control_undfl) shr bp_fp_control_undfl;
    end;

  procedure set_undfl(var a : fp_control; __undfl : word);
    begin
       a.flag0:=a.flag0 or ((__undfl shl bp_fp_control_undfl) and bm_fp_control_undfl);
    end;

  function precis(var a : fp_control) : word;
    begin
       precis:=(a.flag0 and bm_fp_control_precis) shr bp_fp_control_precis;
    end;

  procedure set_precis(var a : fp_control; __precis : word);
    begin
       a.flag0:=a.flag0 or ((__precis shl bp_fp_control_precis) and bm_fp_control_precis);
    end;

  function x(var a : fp_control) : word;
    begin
       x:=(a.flag0 and bm_fp_control_x) shr bp_fp_control_x;
    end;

  procedure set_x(var a : fp_control; __x : word);
    begin
       a.flag0:=a.flag0 or ((__x shl bp_fp_control_x) and bm_fp_control_x);
    end;

  function pc(var a : fp_control) : word;
    begin
       pc:=(a.flag0 and bm_fp_control_pc) shr bp_fp_control_pc;
    end;

  procedure set_pc(var a : fp_control; __pc : word);
    begin
       a.flag0:=a.flag0 or ((__pc shl bp_fp_control_pc) and bm_fp_control_pc);
    end;

  function rc(var a : fp_control) : word;
    begin
       rc:=(a.flag0 and bm_fp_control_rc) shr bp_fp_control_rc;
    end;

  procedure set_rc(var a : fp_control; __rc : word);
    begin
       a.flag0:=a.flag0 or ((__rc shl bp_fp_control_rc) and bm_fp_control_rc);
    end;

  function inf(var a : fp_control) : word;
    begin
       inf:=(a.flag0 and bm_fp_control_inf) shr bp_fp_control_inf;
    end;

  procedure set_inf(var a : fp_control; __inf : word);
    begin
       a.flag0:=a.flag0 or ((__inf shl bp_fp_control_inf) and bm_fp_control_inf);
    end;

  function y(var a : fp_control) : word;
    begin
       y:=(a.flag0 and bm_fp_control_y) shr bp_fp_control_y;
    end;

  procedure set_y(var a : fp_control; __y : word);
    begin
       a.flag0:=a.flag0 or ((__y shl bp_fp_control_y) and bm_fp_control_y);
    end;

  function invalid(var a : fp_status) : word;
    begin
       invalid:=(a.flag0 and bm_fp_status_invalid) shr bp_fp_status_invalid;
    end;

  procedure set_invalid(var a : fp_status; __invalid : word);
    begin
       a.flag0:=a.flag0 or ((__invalid shl bp_fp_status_invalid) and bm_fp_status_invalid);
    end;

  function denorm(var a : fp_status) : word;
    begin
       denorm:=(a.flag0 and bm_fp_status_denorm) shr bp_fp_status_denorm;
    end;

  procedure set_denorm(var a : fp_status; __denorm : word);
    begin
       a.flag0:=a.flag0 or ((__denorm shl bp_fp_status_denorm) and bm_fp_status_denorm);
    end;

  function zdiv(var a : fp_status) : word;
    begin
       zdiv:=(a.flag0 and bm_fp_status_zdiv) shr bp_fp_status_zdiv;
    end;

  procedure set_zdiv(var a : fp_status; __zdiv : word);
    begin
       a.flag0:=a.flag0 or ((__zdiv shl bp_fp_status_zdiv) and bm_fp_status_zdiv);
    end;

  function ovrfl(var a : fp_status) : word;
    begin
       ovrfl:=(a.flag0 and bm_fp_status_ovrfl) shr bp_fp_status_ovrfl;
    end;

  procedure set_ovrfl(var a : fp_status; __ovrfl : word);
    begin
       a.flag0:=a.flag0 or ((__ovrfl shl bp_fp_status_ovrfl) and bm_fp_status_ovrfl);
    end;

  function undfl(var a : fp_status) : word;
    begin
       undfl:=(a.flag0 and bm_fp_status_undfl) shr bp_fp_status_undfl;
    end;

  procedure set_undfl(var a : fp_status; __undfl : word);
    begin
       a.flag0:=a.flag0 or ((__undfl shl bp_fp_status_undfl) and bm_fp_status_undfl);
    end;

  function precis(var a : fp_status) : word;
    begin
       precis:=(a.flag0 and bm_fp_status_precis) shr bp_fp_status_precis;
    end;

  procedure set_precis(var a : fp_status; __precis : word);
    begin
       a.flag0:=a.flag0 or ((__precis shl bp_fp_status_precis) and bm_fp_status_precis);
    end;

  function stkflt(var a : fp_status) : word;
    begin
       stkflt:=(a.flag0 and bm_fp_status_stkflt) shr bp_fp_status_stkflt;
    end;

  procedure set_stkflt(var a : fp_status; __stkflt : word);
    begin
       a.flag0:=a.flag0 or ((__stkflt shl bp_fp_status_stkflt) and bm_fp_status_stkflt);
    end;

  function errsumm(var a : fp_status) : word;
    begin
       errsumm:=(a.flag0 and bm_fp_status_errsumm) shr bp_fp_status_errsumm;
    end;

  procedure set_errsumm(var a : fp_status; __errsumm : word);
    begin
       a.flag0:=a.flag0 or ((__errsumm shl bp_fp_status_errsumm) and bm_fp_status_errsumm);
    end;

  function c0(var a : fp_status) : word;
    begin
       c0:=(a.flag0 and bm_fp_status_c0) shr bp_fp_status_c0;
    end;

  procedure set_c0(var a : fp_status; __c0 : word);
    begin
       a.flag0:=a.flag0 or ((__c0 shl bp_fp_status_c0) and bm_fp_status_c0);
    end;

  function c1(var a : fp_status) : word;
    begin
       c1:=(a.flag0 and bm_fp_status_c1) shr bp_fp_status_c1;
    end;

  procedure set_c1(var a : fp_status; __c1 : word);
    begin
       a.flag0:=a.flag0 or ((__c1 shl bp_fp_status_c1) and bm_fp_status_c1);
    end;

  function c2(var a : fp_status) : word;
    begin
       c2:=(a.flag0 and bm_fp_status_c2) shr bp_fp_status_c2;
    end;

  procedure set_c2(var a : fp_status; __c2 : word);
    begin
       a.flag0:=a.flag0 or ((__c2 shl bp_fp_status_c2) and bm_fp_status_c2);
    end;

  function tos(var a : fp_status) : word;
    begin
       tos:=(a.flag0 and bm_fp_status_tos) shr bp_fp_status_tos;
    end;

  procedure set_tos(var a : fp_status; __tos : word);
    begin
       a.flag0:=a.flag0 or ((__tos shl bp_fp_status_tos) and bm_fp_status_tos);
    end;

  function c3(var a : fp_status) : word;
    begin
       c3:=(a.flag0 and bm_fp_status_c3) shr bp_fp_status_c3;
    end;

  procedure set_c3(var a : fp_status; __c3 : word);
    begin
       a.flag0:=a.flag0 or ((__c3 shl bp_fp_status_c3) and bm_fp_status_c3);
    end;

  function busy(var a : fp_status) : word;
    begin
       busy:=(a.flag0 and bm_fp_status_busy) shr bp_fp_status_busy;
    end;

  procedure set_busy(var a : fp_status; __busy : word);
    begin
       a.flag0:=a.flag0 or ((__busy shl bp_fp_status_busy) and bm_fp_status_busy);
    end;

*)

{$ifdef cpu64}
    mcontext_t = record
      es: x86_64_exception_state_t;
      ts: x86_64_thread_state_t;
      fs: x86_64_float_state_t;
    end;
{$else cpu64}
    mcontext_t = record
      es: i386_exception_state_t;
      ts: i386_thread_state_t;
      fs: i386_float_state_t;
    end;
{$endif cpu64}
