enum {
       Maxsteps = 200 * 100 * 2,       /* 100 periods of 200 procs */

       /* Edf.flags field */
       Admitted                = 0x01,
       Sporadic                = 0x02,
       Yieldonblock            = 0x04,
       Sendnotes               = 0x08,
       Deadline                = 0x10,
       Yield                   = 0x20,
       Extratime               = 0x40,

       Infinity = ~0ULL,
};

typedef struct Edf              Edf;

struct Edf {
       /* All times in µs */
       /* time intervals */
       long            D;              /* Deadline */
       long            Delta;          /* Inherited deadline */
       long            T;              /* period */
       long            C;              /* Cost */
       long            S;              /* Slice: time remaining in this period */
       /* times (only low-order bits of absolute time) */
       long            r;              /* (this) release time */
       long            d;              /* (this) deadline */
       long            t;              /* Start of next period, t += T at release */
       long            s;              /* Time at which this proc was last scheduled */
       /* for schedulability testing */
       long            testDelta;
       int             testtype;       /* Release or Deadline */
       long            testtime;
       Proc            *testnext;
       /* other */
       ushort          flags;
       Timer;
       /* Stats */
       long            edfused;
       long            extraused;
       long            aged;
       ulong           periods;
       ulong           missed;
};

extern Lock     edftestlock;    /* for atomic admitting/expelling */

#pragma varargck        type    "t"             long
#pragma varargck        type    "U"             uvlong

/* Interface: */
Edf*            edflock(Proc*);
void            edfunlock(void);