text: // Copyright 2009 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  // +build ignore
  
  /*
  Input to godefs.  See also mkerrors.sh and mkall.sh
  */
  
  typedef unsigned short ushort;
  typedef unsigned char uchar;
  typedef unsigned long ulong;
  typedef unsigned int uint;
  typedef long long vlong;
  typedef unsigned long long uvlong;
  
  typedef int $_C_int;
  
  enum {
  	OREAD	= 0,	// open for read
  	OWRITE	= 1,	// write
  	ORDWR	= 2,	// read and write
  	OEXEC	= 3,	// execute, == read but check execute permission
  	OTRUNC	= 16,	// or'ed in (except for exec), truncate file first
  	OCEXEC	= 32,	// or'ed in, close on exec
  	ORCLOSE	= 64,		// or'ed in, remove on close
  	OEXCL	= 0x1000,	// or'ed in, exclusive use (create only)
  
  	$O_RDONLY	= OREAD,
  	$O_WRONLY	= OWRITE,
  	$O_RDWR		= ORDWR,
  	$O_TRUNC	= OTRUNC,
  	$O_CLOEXEC	= OCEXEC,
  	$O_EXCL		= OEXCL,
  
  	$STATMAX	= 65535U,
  	$ERRMAX		= 128,
  
  	$MORDER		= 0x0003,	// mask for bits defining order of mounting
  	$MREPL		= 0x0000,	// mount replaces object
  	$MBEFORE	= 0x0001,	// mount goes before others in union directory
  	$MAFTER		= 0x0002,	// mount goes after others in union directory
  	$MCREATE	= 0x0004,	// permit creation in mounted directory
  	$MCACHE		= 0x0010,	// cache some data
  	$MMASK		= 0x0017,	// all bits on
  
  	$RFNAMEG	= (1<<0),
  	$RFENVG		= (1<<1),
  	$RFFDG		= (1<<2),
  	$RFNOTEG	= (1<<3),
  	$RFPROC		= (1<<4),
  	$RFMEM		= (1<<5),
  	$RFNOWAIT	= (1<<6),
  	$RFCNAMEG	= (1<<10),
  	$RFCENVG	= (1<<11),
  	$RFCFDG		= (1<<12),
  	$RFREND		= (1<<13),
  	$RFNOMNT	= (1<<14),
  
  	// bits in Qid.type
  	$QTDIR		= 0x80,		// type bit for directories
  	$QTAPPEND	= 0x40,		// type bit for append only files
  	$QTEXCL		= 0x20,		// type bit for exclusive use files
  	$QTMOUNT	= 0x10,		// type bit for mounted channel
  	$QTAUTH		= 0x08,		// type bit for authentication file
  	$QTTMP		= 0x04,		// type bit for not-backed-up file
  	$QTFILE		= 0x00,		// plain file
  
  
  	// bits in Dir.mode
  	$DMDIR		= 0x80000000,	// mode bit for directories
  	$DMAPPEND	= 0x40000000,	// mode bit for append only files
  	$DMEXCL		= 0x20000000,	// mode bit for exclusive use files
  	$DMMOUNT	= 0x10000000,	// mode bit for mounted channel
  	$DMAUTH		= 0x08000000,	// mode bit for authentication file
  	$DMTMP		= 0x04000000,	// mode bit for non-backed-up files
  	$DMREAD		= 0x4,		// mode bit for read permission
  	$DMWRITE	= 0x2,		// mode bit for write permission
  	$DMEXEC		= 0x1,		// mode bit for execute permission
  
  	BIT8SZ	= 1,
  	BIT16SZ	= 2,
  	BIT32SZ	= 4,
  	BIT64SZ	= 8,
  	QIDSZ = BIT8SZ+BIT32SZ+BIT64SZ,
  
  	// STATFIXLEN includes leading 16-bit count
  	// The count, however, excludes itself; total size is BIT16SZ+count
  	$STATFIXLEN = BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ,	// amount of fixed length data in a stat buffer
  };
  
  
  struct Prof			// Per process profiling
  {
  	struct Plink	*pp;	// known to be 0(ptr)
  	struct Plink	*next;	// known to be 4(ptr)
  	struct Plink	*last;
  	struct Plink	*first;
  	ulong		pid;
  	ulong		what;
  };
  
  struct Tos {
  	struct Prof	prof;
  	uvlong		cyclefreq;	// cycle clock frequency if there is one, 0 otherwise
  	vlong		kcycles;	// cycles spent in kernel
  	vlong		pcycles;	// cycles spent in process (kernel + user)
  	ulong		pid;		// might as well put the pid here
  	ulong		clock;
  	// top of stack is here
  };
  
  typedef struct Prof $Prof;
  typedef struct Tos $Tos;
  