shithub: p9-stm32-example-os

ref: f801657f77f3923ec2388c25bdcb036c8019ba89
dir: /port/portdat.h/

View raw version
#include "libkern/fcall.h"

//typedef struct Alarms	Alarms;
//typedef struct Block	Block;
//typedef struct Bkpt Bkpt;
//typedef struct BkptCond BkptCond;
typedef struct Block	Block;
//typedef struct Chan	Chan;
typedef struct Cmdbuf	Cmdbuf;
typedef struct Cmdtab	Cmdtab;
//typedef struct Cname	Cname;
//typedef struct Crypt	Crypt;
//typedef struct Dev	Dev;
//typedef struct DevConf	DevConf;
//typedef struct Dirtab	Dirtab;
//typedef struct Edf	Edf;
typedef struct Egrp	Egrp;
typedef struct Evalue	Evalue;
//typedef struct Fgrp	Fgrp;
typedef struct List	List;

//typedef struct Log	Log;
//typedef struct Logflag	Logflag;
//typedef struct Mntcache Mntcache;
//typedef struct Mntparam Mntparam;
//typedef struct Mount	Mount;
//typedef struct Mntrpc	Mntrpc;
//typedef struct Mntwalk	Mntwalk;
//typedef struct Mnt	Mnt;
//typedef struct Mhead	Mhead;
typedef struct Osenv	Osenv;
//typedef struct Pgrp	Pgrp;
typedef struct Proc	Proc;
typedef struct QLock	QLock;
typedef struct Queue	Queue;
typedef struct Ref	Ref;
typedef struct Rendez	Rendez;
typedef struct Rept	Rept;
//typedef struct Rootdata	Rootdata;
typedef struct RWlock	RWlock;
//typedef struct Signerkey Signerkey;
//typedef struct Skeyset	Skeyset;
typedef struct Talarm	Talarm;
typedef struct Timer	Timer;
typedef struct Timers	Timers;
//typedef struct Uart	Uart;
//typedef struct Walkqid	Walkqid;
//typedef int    Devgen(Chan*, char*, Dirtab*, int, int, Dir*);

//#pragma incomplete DevConf
//#pragma incomplete Edf
//#pragma incomplete Mntcache
//#pragma incomplete Mntrpc
#pragma incomplete Queue
#pragma incomplete Timers

struct Ref
{
	Lock	l;
	long	ref;
};

struct Rendez
{
	Lock;
	Proc	*p;
};

struct Rept
{
	Lock	l;
	Rendez	r;
	void	*o;
	int	t;
	int	(*active)(void*);
	int	(*ck)(void*, int);
	void	(*f)(void*);	/* called with VM acquire()'d */
};

struct Osenv
{
	char	*syserrstr;	/* last error from a system call, errbuf0 or 1 */
	char	*errstr;	/* reason we're unwinding the error stack, errbuf1 or 0 */
	char	errbuf0[ERRMAX];
	char	errbuf1[ERRMAX];
//	Pgrp*	pgrp;		/* Ref to namespace, working dir and root */
//	Fgrp*	fgrp;		/* Ref to file descriptors */
	Egrp*	egrp;	/* Environment vars */
//	Skeyset*	sigs;		/* Signed module keys */
	Rendez*	rend;		/* Synchro point */
	Queue*	waitq;		/* Info about dead children */
	Queue*	childq;		/* Info about children for debuggers */
	void*	debug;		/* Debugging master */
//	int	uid;		/* Numeric user id for system */
//	int	gid;		/* Numeric group id for system */
//	char*	user;		/* Inferno user name */
//	FPenv	fpu;		/* Floating point thread state */
};

enum
{
	Nopin =	-1
};

struct QLock
{
	Lock	use;			/* to access Qlock structure */
	Proc	*head;			/* next process waiting for object */
	Proc	*tail;			/* last process waiting for object */
	int	locked;			/* flag */
};

struct RWlock
{
	Lock;				/* Lock modify lock */
	QLock	x;			/* Mutual exclusion lock */
	QLock	k;			/* Lock for waiting writers */
	int	readers;		/* Count of readers in lock */
};

struct Talarm
{
	Lock;
	Proc*	list;
};

//struct Alarms
//{
//	QLock;
//	Proc*	head;
//};

//struct Rootdata
//{
//	int	dotdot;
//	void	*ptr;
//	int	size;
//	int	*sizep;
//};

/*
 * Access types in namec & channel flags
 */
enum
{
	Aaccess,			/* as in stat, wstat */
	Abind,			/* for left-hand-side of bind */
	Atodir,				/* as in chdir */
	Aopen,				/* for i/o */
	Amount,				/* to be mounted or mounted upon */
	Acreate,			/* is to be created */
	Aremove,			/* will be removed by caller */

	COPEN	= 0x0001,		/* for i/o */
	CMSG	= 0x0002,		/* the message channel for a mount */
	CCEXEC	= 0x0008,		/* close on exec */
	CFREE	= 0x0010,		/* not in use */
	CRCLOSE	= 0x0020,		/* remove on close */
	CCACHE	= 0x0080,		/* client cache */
};

enum
{
	BINTR		=	(1<<0),
	BFREE		=	(1<<1),
	Bipck	=	(1<<2),		/* ip checksum */
	Budpck	=	(1<<3),		/* udp checksum */
	Btcpck	=	(1<<4),		/* tcp checksum */
	Bpktck	=	(1<<5),		/* packet checksum */
};

struct Block
{
	Block*	next;
	Block*	list;
	uchar*	rp;			/* first unconsumed byte */
	uchar*	wp;			/* first empty byte */
	uchar*	lim;			/* 1 past the end of the buffer */
	uchar*	base;			/* start of the buffer */
	void	(*free)(Block*);
	ushort	flag;
	ushort	checksum;		/* IP checksum of complete packet (minus media header) */
};
#define BLEN(s)	((s)->wp - (s)->rp)
#define BALLOC(s) ((s)->lim - (s)->base)

//struct Chan
//{
//	Lock;
//	Ref;
//	Chan*	next;			/* allocation */
//	Chan*	link;
//	vlong	offset;			/* in file */
//	ushort	type;
//	ulong	dev;
//	ushort	mode;			/* read/write */
//	ushort	flag;
//	Qid	qid;
//	int	fid;			/* for devmnt */
//	ulong	iounit;	/* chunk size for i/o; 0==default */
//	Mhead*	umh;			/* mount point that derived Chan; used in unionread */
//	Chan*	umc;			/* channel in union; held for union read */
//	QLock	umqlock;		/* serialize unionreads */
//	int	uri;			/* union read index */
//	int	dri;			/* devdirread index */
//	ulong	mountid;
//	Mntcache *mcp;			/* Mount cache pointer */
//	Mnt		*mux;		/* Mnt for clients using me for messages */
//	union {
//		void*	aux;
//		char	tag[4];		/* for iproute */
//	};
//	Chan*	mchan;			/* channel to mounted server */
//	Qid	mqid;			/* qid of root of mount point */
//	Cname	*name;
//};
//
//struct Cname
//{
//	Ref;
//	int	alen;			/* allocated length */
//	int	len;			/* strlen(s) */
//	char	*s;
//};

//struct Dev
//{
//	int	dc;
//	char*	name;
//
//	void	(*reset)(void);
//	void	(*init)(void);
//	void	(*shutdown)(void);
//	Chan*	(*attach)(char*);
//	Walkqid*	(*walk)(Chan*, Chan*, char**, int);
//	int	(*stat)(Chan*, uchar*, int);
//	Chan*	(*open)(Chan*, int);
//	void	(*create)(Chan*, char*, int, ulong);
//	void	(*close)(Chan*);
//	long	(*read)(Chan*, void*, long, vlong);
//	Block*	(*bread)(Chan*, long, ulong);
//	long	(*write)(Chan*, void*, long, vlong);
//	long	(*bwrite)(Chan*, Block*, ulong);
//	void	(*remove)(Chan*);
//	int	(*wstat)(Chan*, uchar*, int);
//	void	(*power)(int);	/* power mgt: power(1) → on, power (0) → off */
//	int	(*config)(int, char*, DevConf*);
//};
//
//struct Dirtab
//{
//	char	name[KNAMELEN];
//	Qid	qid;
//	vlong	length;
//	long	perm;
//};
//
//struct Walkqid
//{
//	Chan	*clone;
//	int	nqid;
//	Qid	qid[1];
//};

//enum
//{
//	NSMAX	=	1000,
//	NSLOG	=	7,
//	NSCACHE	=	(1<<NSLOG),
//};
//
//struct Mntwalk				/* state for /proc/#/ns */
//{
//	int		cddone;
//	ulong	id;
//	Mhead*	mh;
//	Mount*	cm;
//};
//
//struct Mount
//{
//	ulong	mountid;
//	Mount*	next;
//	Mhead*	head;
//	Mount*	copy;
//	Mount*	order;
//	Chan*	to;			/* channel replacing channel */
//	int	mflag;
//	char	*spec;
//};
//
//struct Mhead
//{
//	Ref;
//	RWlock	lock;
//	Chan*	from;			/* channel mounted upon */
//	Mount*	mount;			/* what's mounted upon it */
//	Mhead*	hash;			/* Hash chain */
//};
//
//struct Mnt
//{
//	Lock;
//	/* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
//	Chan	*c;		/* Channel to file service */
//	Proc	*rip;		/* Reader in progress */
//	Mntrpc	*queue;		/* Queue of pending requests on this channel */
//	ulong	id;		/* Multiplexer id for channel check */
//	Mnt	*list;		/* Free list */
//	int	flags;		/* cache */
//	int	msize;		/* data + IOHDRSZ */
//	char	*version;			/* 9P version */
//	Queue	*q;		/* input queue */
//};
//
//enum
//{
//	RENDLOG	=	5,
//	RENDHASH =	1<<RENDLOG,		/* Hash to lookup rendezvous tags */
//	MNTLOG	=	5,
//	MNTHASH =	1<<MNTLOG,		/* Hash to walk mount table */
//	DELTAFD=		20,		/* allocation quantum for process file descriptors */
//	MAXNFD =		4000,		/* max per process file descriptors */
//	MAXKEY =		8,	/* keys for signed modules */
//};
//#define MOUNTH(p,qid)	((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
//
//struct Mntparam {
//	Chan*	chan;
//	Chan*	authchan;
//	char*	spec;
//	int	flags;
//};
//
//struct Pgrp
//{
//	Ref;				/* also used as a lock when mounting */
//	ulong	pgrpid;
//	QLock	debug;			/* single access via devproc.c */
//	RWlock	ns;			/* Namespace n read/one write lock */
//	QLock	nsh;
//	Mhead*	mnthash[MNTHASH];
//	int	progmode;
//	Chan*	dot;
//	Chan*	slash;
//	int	nodevs;
//	int	pin;
//};
//
//struct Fgrp
//{
//	Lock;
//	Ref;
//	Chan**	fd;
//	int	nfd;			/* number of fd slots */
//	int	maxfd;			/* highest fd in use */
//	int	minfd;			/* lower bound on free fd */
//};

struct Evalue
{
	char	*var;
	char	*val;
	int	len;
//	Qid	qid;
	Evalue	*next;
};

struct Egrp
{
	Ref;
	QLock;
	Evalue	*entries;
	ulong	path;	/* qid.path of next Evalue to be allocated */
	ulong	vers;	/* of Egrp */
};

//struct Signerkey
//{
//	Ref;
//	char*	owner;
//	ushort	footprint;
//	ulong	expires;
//	void*	alg;
//	void*	pk;
//	void	(*pkfree)(void*);
//};
//
//struct Skeyset
//{
//	Ref;
//	QLock;
//	ulong	flags;
//	char*	devs;
//	int	nkey;
//	Signerkey	*keys[MAXKEY];
//};

/*
 * fasttick timer interrupts
 */
enum {
	/* Mode */
	Trelative,	/* timer programmed in ns from now */
	Tabsolute,	/* timer programmed in ns since epoch */
	Tperiodic,	/* periodic timer, period in ns */
};

struct Timer
{
	/* Public interface */
	int	tmode;		/* See above */
	vlong	tns;		/* meaning defined by mode */
	void	(*tf)(Ureg*, Timer*);
	void	*ta;
	/* Internal */
	Lock;
	Timers	*tt;		/* Timers queue this timer runs on */
	vlong	twhen;		/* ns represented in fastticks */
	Timer	*tnext;
};

enum
{
	Dead = 0,		/* Process states */
	Moribund,
	Ready,
	Scheding,
	Running,
	Queueing,
	Wakeme,
	Broken,
	Stopped,
	Rendezvous,
	Waitrelease,

	Proc_stopme = 1, 	/* devproc requests */
	Proc_exitme,
	Proc_traceme,
	Proc_exitbig,

	NERR		= 4,

	Unknown		= 0,
	IdleGC,
	Interp,
	BusyGC,

	PriLock		= 0,	/* Holding Spin lock */
	PriEdf,	/* active edf processes */
	PriRelease,	/* released edf processes */
	PriRealtime,		/* Video telephony */
	PriHicodec,		/* MPEG codec */
	PriLocodec,		/* Audio codec */
	PriHi,			/* Important task */
	PriNormal,
	PriLo,
	PriBackground,
	PriExtra,	/* edf processes we don't care about */
	Nrq
};

struct Proc
{
	Label		sched;		/* known to l.s */
	char*		kstack;		/* known to l.s */
	Mach*		mach;		/* machine running this proc */
	char		text[KNAMELEN];
	Proc*		rnext;		/* next process in run queue */
	Proc*		qnext;		/* next process on queue for a QLock */
	QLock*		qlock;		/* addrof qlock being queued for DEBUG */
	int		state;
	int		type;
	void*		prog;		/* Dummy Prog for interp release */
	void*		iprog;
	Osenv*		env;
	Osenv		defenv;
	int		swipend;	/* software interrupt pending for Prog */
	Lock		sysio;		/* note handler lock */
	char*		psstate;	/* What /proc/#/status reports */
	ulong		pid;
//	int		fpstate;
	int		procctl;	/* Control for /proc debugging */
	ulong		pc;		/* DEBUG only */
	Lock	rlock;	/* sync between sleep/swiproc for r */
	Rendez*		r;		/* rendezvous point slept on */
	Rendez		sleep;		/* place for syssleep/debug */
	int		killed;		/* by swiproc */
	int		kp;		/* true if a kernel process */
	ulong		alarm;		/* Time of call */
	int		pri;		/* scheduler priority */
	ulong		twhen;
	Rendez*		trend;
	Proc*		tlink;
	int		(*tfn)(void*);
	void		(*kpfun)(void*);
	void*		arg;
	//FPU		fpsave;
	int		scallnr;
	int		nerrlab;
	Label		errlab[NERR];
//	char	genbuf[KNAMELEN];	/* buffer used e.g. for last name element from namec */
	Mach*		mp;		/* machine this process last ran on */
	Mach*		wired;
	ulong		movetime;	/* next time process should switch processors */
	ulong		delaysched;
	int			preempted;	/* process yielding in interrupt */
	ulong		qpc;		/* last call that blocked in qlock */
	void*		dbgreg;		/* User registers for devproc */
 	int		dbgstop;		/* don't run this kproc */
	//Edf*	edf;	/* if non-null, real-time proc, edf contains scheduling params */
};

enum
{
	/* kproc flags */
	KPDUPPG		= (1<<0),
	KPDUPFDG	= (1<<1),
	KPDUPENVG	= (1<<2),
	KPDUP = KPDUPPG | KPDUPFDG | KPDUPENVG
};

enum {
	BrkSched,
	BrkNoSched,
};

//struct BkptCond
//{
//	uchar op;
//	ulong val;
//	BkptCond *next;
//};
//
//struct Bkpt
//{
//	int id;
//	ulong addr;
//	BkptCond *conditions;
//	Instr instr;
//	void (*handler)(Bkpt*);
//	void *aux;
//	Bkpt *next;
//	Bkpt *link;
//};

enum
{
	PRINTSIZE =	256,
	NUMSIZE	=	12,		/* size of formatted number */
	MB =		(1024*1024),
	READSTR =	1000,		/* temporary buffer size for device reads */
};

extern	Conf	conf;
//extern	char*	conffile;
//extern	int	consoleprint;
//extern	Dev*	devtab[];
//extern	char*	eve;
//extern	int	hwcurs;
//extern	FPU	initfp;
//extern  Queue	*kbdq;
//extern  Queue	*kscanq;
extern  Ref	noteidalloc;
//extern  Queue	*printq;
extern	uint	qiomaxatomic;
//extern	char*	statename[];
//extern	char*	sysname;
extern	Talarm	talarm;

/*
 *  action log
 */
//struct Log {
//	Lock;
//	int	opens;
//	char*	buf;
//	char	*end;
//	char	*rptr;
//	int	len;
//	int	nlog;
//	int	minread;
//
//	int	logmask;	/* mask of things to debug */
//
//	QLock	readq;
//	Rendez	readr;
//};
//
//struct Logflag {
//	char*	name;
//	int	mask;
//};

struct Cmdbuf
{
	char	*buf;
	char	**f;
	int	nf;
};

struct Cmdtab
{
	int	index;	/* used by client to switch on result */
	char	*cmd;	/* command name */
	int	narg;	/* expected #args; 0 ==> variadic */
};

//enum
//{
//	MAXPOOL		= 8,
//};
//
//extern Pool*	mainmem;
//extern Pool*	heapmem;
//extern Pool*	imagmem;

/* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
enum
{
	/* Queue.state */
	Qstarve		= (1<<0),	/* consumer starved */
	Qmsg		= (1<<1),	/* message stream */
	Qclosed		= (1<<2),	/* queue has been closed/hungup */
	Qflow		= (1<<3),	/* producer flow controlled */
	Qcoalesce	= (1<<4),	/* coallesce packets on read */
	Qkick		= (1<<5),	/* always call the kick routine after qwrite */
};

#define DEVDOTDOT -1

//#pragma	varargck	argpos	print	1
//#pragma	varargck	argpos	snprint	3
//#pragma	varargck	argpos	seprint	3
//#pragma	varargck	argpos	sprint	2
//#pragma	varargck	argpos	fprint	2
//#pragma	varargck	argpos	iprint	1
//#pragma	varargck	argpos	panic	1
//#pragma	varargck	argpos	kwerrstr	1
//#pragma	varargck	argpos	kprint	1
//
//#pragma	varargck	type	"lld"	vlong
//#pragma	varargck	type	"llx"	vlong
//#pragma	varargck	type	"lld"	uvlong
//#pragma	varargck	type	"llx"	uvlong
//#pragma	varargck	type	"lx"	void*
//#pragma	varargck	type	"ld"	long
//#pragma	varargck	type	"lx"	long
//#pragma	varargck	type	"ld"	ulong
//#pragma	varargck	type	"lx"	ulong
//#pragma	varargck	type	"d"	int
//#pragma	varargck	type	"x"	int
//#pragma	varargck	type	"c"	int
//#pragma	varargck	type	"C"	int
//#pragma	varargck	type	"d"	uint
//#pragma	varargck	type	"x"	uint
//#pragma	varargck	type	"c"	uint
//#pragma	varargck	type	"C"	uint
//#pragma	varargck	type	"f"	double
//#pragma	varargck	type	"e"	double
//#pragma	varargck	type	"g"	double
//#pragma	varargck	type	"s"	char*
//#pragma	varargck	type	"S"	Rune*
//#pragma	varargck	type	"r"	void
//#pragma	varargck	type	"%"	void
//#pragma	varargck	type	"I"	uchar*
//#pragma	varargck	type	"V"	uchar*
//#pragma	varargck	type	"E"	uchar*
//#pragma	varargck	type	"M"	uchar*
//#pragma	varargck	type	"p"	void*
//#pragma	varargck	type	"q"	char*