plan9fox/sys/src/9/kw/dat.h
2021-07-25 14:03:12 +00:00

297 lines
4.9 KiB
C

typedef struct Conf Conf;
typedef struct Confmem Confmem;
typedef struct FPsave FPsave;
typedef struct PFPU PFPU;
typedef struct ISAConf ISAConf;
typedef struct Label Label;
typedef struct Lock Lock;
typedef struct Memcache Memcache;
typedef struct MMMU MMMU;
typedef struct Mach Mach;
typedef struct Page Page;
typedef struct Pcidev Pcidev;
typedef struct PhysUart PhysUart;
typedef struct PMMU PMMU;
typedef struct Proc Proc;
typedef u32int PTE;
typedef struct Soc Soc;
typedef struct Uart Uart;
typedef struct Ureg Ureg;
typedef uvlong Tval;
#pragma incomplete Pcidev
#pragma incomplete Ureg
#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */
/*
* parameters for sysproc.c
*/
#define AOUT_MAGIC (E_MAGIC)
struct Lock
{
ulong key;
u32int sr;
uintptr pc;
Proc* p;
Mach* m;
int isilock;
};
struct Label
{
uintptr sp;
uintptr pc;
};
/*
* emulated floating point
*/
enum{
Nfpctlregs = 16,
};
struct FPsave
{
ulong status;
ulong control;
ulong regs[Nfpctlregs][3];
int fpstate;
};
struct PFPU
{
int fpstate;
FPsave fpsave[1];
};
enum
{
FPinit,
FPactive,
FPinactive,
FPillegal= 0x100,
};
struct Confmem
{
uintptr base;
ulong npage;
uintptr limit;
uintptr kbase;
uintptr klimit;
};
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
ulong monitor; /* has monitor? */
Confmem mem[1]; /* physical memory */
ulong npage; /* total physical pages of memory */
ulong upages; /* user page pool */
ulong copymode; /* 0 is copy on write, 1 is copy on reference */
ulong ialloc; /* max interrupt time allocation in bytes */
ulong pipeqsize; /* size in bytes of pipe queues */
ulong nimage; /* number of page cache image headers */
ulong nswap; /* number of swap pages */
int nswppo; /* max # of pageouts per segment pass */
// ulong hz; /* processor cycle freq */
// ulong mhz;
};
/*
* MMU stuff in Mach.
*/
struct MMMU
{
PTE* mmul1; /* l1 for this processor */
int mmul1lo;
int mmul1hi;
int mmupid;
};
/*
* MMU stuff in proc
*/
#define NCOLOR 1 /* 1 level cache, don't worry about VCE's */
struct PMMU
{
Page* mmul2;
Page* mmul2cache; /* free mmu pages */
};
#include "../port/portdat.h"
struct Mach
{
int machno; /* physical id of processor */
uintptr splpc; /* pc of last caller to splhi */
Proc* proc; /* current process */
MMMU;
/* end of offsets known to asm */
PMach;
vlong fastclock; /* last sampled value */
int inclockintr;
int cputype;
int socrev; /* system-on-chip revision */
ulong delayloop;
uvlong cpuhz; /* speed of cpu */
/* save areas for exceptions */
u32int sfiq[5];
u32int sirq[5];
u32int sund[5];
u32int sabt[5];
#define fiqstack sfiq
#define irqstack sirq
#define abtstack sabt
#define undstack sund
uintptr stack[1];
};
/*
* Fake kmap.
*/
typedef void KMap;
#define VA(k) ((uintptr)(k))
#define kmap(p) (KMap*)((p)->pa|kseg0)
#define kunmap(k)
struct
{
char machs[MAXMACH]; /* active CPUs */
int exiting; /* shutdown */
}active;
enum {
Frequency = 1200*1000*1000, /* the processor clock */
};
extern register Mach* m; /* R10 */
extern register Proc* up; /* R9 */
extern uintptr kseg0;
extern Mach* machaddr[MAXMACH];
enum {
Nvec = 8, /* # of vectors at start of lexception.s */
};
/*
* Layout of physical 0.
*/
typedef struct Vectorpage {
void (*vectors[Nvec])(void);
uint vtable[Nvec];
} Vectorpage;
/*
* a parsed plan9.ini line
*/
#define NISAOPT 8
struct ISAConf {
char *type;
ulong port;
int irq;
ulong dma;
ulong mem;
ulong size;
ulong freq;
int nopt;
char *opt[NISAOPT];
};
#define MACHP(n) (machaddr[n])
/*
* Horrid. But the alternative is 'defined'.
*/
#ifdef _DBGC_
#define DBGFLG (dbgflg[_DBGC_])
#else
#define DBGFLG (0)
#endif /* _DBGC_ */
int vflag;
extern char dbgflg[256];
#define dbgprint print /* for now */
/*
* hardware info about a device
*/
typedef struct {
ulong port;
int size;
} Devport;
struct DevConf
{
ulong intnum; /* interrupt number */
char *type; /* card type, malloced */
int nports; /* Number of ports */
Devport *ports; /* The ports themselves */
};
enum {
Dcache,
Icache,
Unified,
};
/* characteristics of a given cache level */
struct Memcache {
uint level; /* 1 is nearest processor, 2 further away */
uint kind; /* I, D or unified */
uint size;
uint nways; /* associativity */
uint nsets;
uint linelen; /* bytes per cache line */
uint setsways;
uint log2linelen;
uint waysh; /* shifts for set/way register */
uint setsh;
};
struct Soc { /* addr's of SoC controllers */
uintptr cpu;
uintptr devid;
uintptr l2cache;
uintptr sdramc;
// uintptr sdramd; /* unused */
uintptr iocfg;
uintptr addrmap;
uintptr intr;
uintptr nand;
uintptr cesa; /* crypto accel. */
uintptr ehci;
uintptr spi;
uintptr twsi;
uintptr analog;
uintptr pci;
uintptr pcibase;
uintptr rtc; /* real-time clock */
uintptr clock;
uintptr ether[2];
uintptr sata[3];
uintptr uart[2];
uintptr gpio[2];
} soc;
extern Soc soc;