am.h 3.6 KB
Newer Older
Y
Yanyan Jiang 已提交
1
/*
2 3
 * The Nexus Abstract Architecture
 * Minmal architectural-independent library for implementing system software
Y
Yanyan Jiang 已提交
4 5 6 7 8 9
 *
 * Please refer to the AM specification
 */
#ifndef __AM_H__
#define __AM_H__

10 11 12 13 14 15 16 17 18 19
#include <stdint.h>

typedef int8_t    i8;
typedef int16_t  i16;
typedef int32_t  i32;
typedef int64_t  i64;
typedef uint8_t   u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
Y
Yanyan Jiang 已提交
20 21 22 23 24 25

typedef unsigned long  ulong;
typedef unsigned int   uint;
typedef unsigned short ushort;
typedef unsigned char  uchar;

26 27
#include <arch.h>

Y
Yanyan Jiang 已提交
28 29 30 31 32 33
#define MAX_CPU 8

typedef struct _Area {
  void *start, *end;
} _Area; 

Y
Yanyan Jiang 已提交
34
#define _KEYS(_) \
Y
Yanyan Jiang 已提交
35 36 37 38 39 40 41
  _(ESCAPE) _(F1) _(F2) _(F3) _(F4) _(F5) _(F6) _(F7) _(F8) _(F9) _(F10) _(F11) _(F12) \
  _(GRAVE) _(1) _(2) _(3) _(4) _(5) _(6) _(7) _(8) _(9) _(0) _(MINUS) _(EQUALS) _(BACKSPACE) \
  _(TAB) _(Q) _(W) _(E) _(R) _(T) _(Y) _(U) _(I) _(O) _(P) _(LEFTBRACKET) _(RIGHTBRACKET) _(BACKSLASH) \
  _(CAPSLOCK) _(A) _(S) _(D) _(F) _(G) _(H) _(J) _(K) _(L) _(SEMICOLON) _(APOSTROPHE) _(RETURN) \
  _(LSHIFT) _(Z) _(X) _(C) _(V) _(B) _(N) _(M) _(COMMA) _(PERIOD) _(SLASH) _(RSHIFT) \
  _(LCTRL) _(APPLICATION) _(LALT) _(SPACE) _(RALT) _(RCTRL) \
  _(UP) _(DOWN) _(LEFT) _(RIGHT) _(INSERT) _(DELETE) _(HOME) _(END) _(PAGEUP) _(PAGEDOWN)
Y
Yanyan Jiang 已提交
42

Y
Yanyan Jiang 已提交
43
#define _KEY_NAME(k) _KEY_##k,
Y
Yanyan Jiang 已提交
44

Y
Yanyan Jiang 已提交
45 46
enum {
  _KEY_NONE = 0,
Y
Yanyan Jiang 已提交
47
  _KEYS(_KEY_NAME)
Y
Yanyan Jiang 已提交
48 49
};

Y
Yanyan Jiang 已提交
50
#define _EVENTS(_) \
Y
Yanyan Jiang 已提交
51 52 53
  _(IRQ_TIME) _(IRQ_IODEV) \
  _(ERROR) _(PAGE_FAULT) _(BUS_ERROR) _(NUMERIC) \
  _(TRAP)
Y
Yanyan Jiang 已提交
54

Y
Yanyan Jiang 已提交
55
#define _EVENT_NAME(ev) _EVENT_##ev,
Y
Yanyan Jiang 已提交
56 57 58

enum {
  _EVENT_NULL = 0,
Y
Yanyan Jiang 已提交
59
  _EVENTS(_EVENT_NAME)
Y
Yanyan Jiang 已提交
60 61
};

62 63
typedef struct _RegSet _RegSet;

Y
Yanyan Jiang 已提交
64 65
typedef struct _Event {
  int event;
Y
Yanyan Jiang 已提交
66
  intptr_t cause;
Y
Yanyan Jiang 已提交
67 68
} _Event;

Y
Yanyan Jiang 已提交
69 70 71 72 73 74 75 76 77
typedef struct _Screen {
  int width, height;
} _Screen;

typedef struct _Protect {
  _Area area; 
  void *ptr;
} _Protect;

78 79 80 81
#ifdef __cplusplus
extern "C" {
#endif

Y
Yanyan Jiang 已提交
82
// =======================================================================
Y
Yanyan Jiang 已提交
83
// [0] Turing Machine: code execution & a heap memory
Y
Yanyan Jiang 已提交
84 85 86 87 88 89 90
// =======================================================================

void _putc(char ch);
void _halt(int code);
extern _Area _heap;

// =======================================================================
91
// [1] IO Extension (IOE)
Y
Yanyan Jiang 已提交
92 93 94 95
// =======================================================================

void _ioe_init();
ulong _uptime();
Y
Yanyan Jiang 已提交
96
int _read_key();
Y
Yanyan Jiang 已提交
97 98 99 100 101 102 103
typedef u32 _Pixel;
void _draw_p(int x, int y, _Pixel p);
void _draw_f(_Pixel *p); 
void _draw_sync();
extern _Screen _screen;

// =======================================================================
104
// [2] Asynchronous Extension (ASYE)
Y
Yanyan Jiang 已提交
105 106 107
// =======================================================================

void _asye_init();
Y
Yanyan Jiang 已提交
108
void _listen(_RegSet* (*l)(_Event ev, _RegSet *regs));
Y
Yanyan Jiang 已提交
109
_RegSet *_make(_Area kstack, void *entry, void *arg);
Y
Yanyan Jiang 已提交
110 111 112 113 114 115 116
void _trap();
void _idle();
void _ienable();
void _idisable();
int _istatus();

// =======================================================================
117
// [3] Protection Extension (PTE)
Y
Yanyan Jiang 已提交
118 119 120 121 122 123
// =======================================================================

void _pte_init(void*(*palloc)(), void (*pfree)(void*));
void _protect(_Protect *p);
void _release(_Protect *p);
void _map(_Protect *p, void *va, void *pa);
Y
Yanyan Jiang 已提交
124
void _unmap(_Protect *p, void *va);
Y
Yanyan Jiang 已提交
125
void _switch(_Protect *p);
Y
Yanyan Jiang 已提交
126
_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, char *const argv[], char *const envp[]);
Y
Yanyan Jiang 已提交
127 128

// =======================================================================
129
// [4] Multi-Processor Extension (MPE)
Y
Yanyan Jiang 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143
// =======================================================================

void _mpe_init(void (*entry)());
int _cpu();
ulong _atomic_xchg(volatile ulong *addr, ulong newval);
void _barrier();
extern int _NR_CPU;

#ifdef __cplusplus
}
#endif

#endif