am.h 2.4 KB
Newer Older
Y
Yanyan Jiang 已提交
1
/*
Y
Yanyan Jiang 已提交
2
 * The Nexus Abstract Machine Architecture (AM)
Y
Yanyan Jiang 已提交
3
 * A portable abstraction of a bare-metal computer
Y
Yanyan Jiang 已提交
4
 */
Y
Yanyan Jiang 已提交
5

Y
Yanyan Jiang 已提交
6 7 8
#ifndef __AM_H__
#define __AM_H__

9
#include <stdint.h>
Y
Yanyan Jiang 已提交
10
#include <stddef.h>
11 12
#include <arch.h>

Y
Yanyan Jiang 已提交
13 14 15 16
#ifdef __cplusplus
extern "C" {
#endif

J
jyy 已提交
17
// ===================== Constants and Structs =======================
Y
Yanyan Jiang 已提交
18

J
jyy 已提交
19 20
enum {
  _EVENT_NULL = 0,
Y
Yanyan Jiang 已提交
21
  _EVENT_ERROR,
J
jyy 已提交
22 23 24 25 26 27 28
  _EVENT_IRQ_TIMER,
  _EVENT_IRQ_IODEV,
  _EVENT_PAGEFAULT,
  _EVENT_YIELD,
  _EVENT_SYSCALL,
};

Y
Yanyan Jiang 已提交
29 30 31 32
#define _PROT_NONE   1    // no access
#define _PROT_READ   2    // can read
#define _PROT_WRITE  4    // can write
#define _PROT_EXEC   8    // can execute
J
jyy 已提交
33

Y
Yanyan Jiang 已提交
34
// Memory area for [@start, @end)
Y
Yanyan Jiang 已提交
35 36 37 38
typedef struct _Area {
  void *start, *end;
} _Area; 

J
jyy 已提交
39 40
// A device (@id, @name) with @read/@write support
// See <amdev.h> for device descriptions
Y
Yanyan Jiang 已提交
41 42 43
typedef struct _Device {
  uint32_t id;
  const char *name;
Y
Yanyan Jiang 已提交
44
  size_t (*read) (uintptr_t reg, void *buf, size_t size);
Y
Yanyan Jiang 已提交
45
  size_t (*write)(uintptr_t reg, void *buf, size_t size);
Y
Yanyan Jiang 已提交
46 47
} _Device;

J
jyy 已提交
48
// An event of type @event, caused by @cause of pointer @ref
Y
Yanyan Jiang 已提交
49 50 51
typedef struct _Event {
  int event;
  uintptr_t cause, ref;
Y
Yanyan Jiang 已提交
52
  const char *msg;
Y
Yanyan Jiang 已提交
53
} _Event;
Y
Yanyan Jiang 已提交
54
typedef struct _Context _Context;
Y
Yanyan Jiang 已提交
55

J
jyy 已提交
56 57
// A protected address space with user memory @area
// and arch-dependent @ptr
Y
Yanyan Jiang 已提交
58
typedef struct _Protect {
Y
Yanyan Jiang 已提交
59 60
  size_t pgsize;
  _Area area;
Y
Yanyan Jiang 已提交
61 62 63
  void *ptr;
} _Protect;

Y
Yanyan Jiang 已提交
64
// ====================== Turing Machine (TRM) =======================
J
jyy 已提交
65 66 67

extern _Area _heap;
void _putc(char ch);
Y
Yanyan Jiang 已提交
68
void _halt(int code) __attribute__((__noreturn__));
J
jyy 已提交
69 70 71 72

// ======================= I/O Extension (IOE) =======================

int _ioe_init();
Y
Yanyan Jiang 已提交
73
_Device *_device(int n);
J
jyy 已提交
74

Z
Zihao Yu 已提交
75
// ====================== Context Extension (CTE) ====================
J
jyy 已提交
76

Z
Zihao Yu 已提交
77
int _cte_init(_Context *(*handler)(_Event ev, _Context *ctx));
J
jyy 已提交
78 79 80
void _yield();
int _intr_read();
void _intr_write(int enable);
Y
Yanyan Jiang 已提交
81
_Context *_kcontext(_Area kstack, void (*entry)(void *), void *arg);
J
jyy 已提交
82

Z
Zihao Yu 已提交
83
// ================= Virtual Memory Extension (VME) ==================
J
jyy 已提交
84

Z
Zihao Yu 已提交
85
int _vme_init(void *(*pgalloc)(size_t size), void (*pgfree)(void *));
Y
Yanyan Jiang 已提交
86 87
int _protect(_Protect *p);
void _unprotect(_Protect *p);
Y
Yanyan Jiang 已提交
88
int _map(_Protect *p, void *va, void *pa, int prot);
Y
Yanyan Jiang 已提交
89
_Context *_ucontext(_Protect *p, _Area ustack, _Area kstack,
Y
Yanyan Jiang 已提交
90
                                 void *entry, void *args);
Y
Yanyan Jiang 已提交
91

J
jyy 已提交
92
// ================= Multi-Processor Extension (MPE) =================
Y
Yanyan Jiang 已提交
93

J
jyy 已提交
94
int _mpe_init(void (*entry)());
Y
Yanyan Jiang 已提交
95
int _ncpu();
Y
Yanyan Jiang 已提交
96
int _cpu();
Y
Yanyan Jiang 已提交
97
intptr_t _atomic_xchg(volatile intptr_t *addr, intptr_t newval);
Y
Yanyan Jiang 已提交
98 99 100 101 102

#ifdef __cplusplus
}
#endif

103
#endif