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
#include ARCH_H // "arch/x86-qemu.h", "arch/native.h", ...
12

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
  _EVENT_IRQ_TIMER,
  _EVENT_IRQ_IODEV,
  _EVENT_PAGEFAULT,
  _EVENT_SYSCALL,
26
  _EVENT_YIELD,
J
jyy 已提交
27 28
};

29
enum {
30 31 32 33
  _PROT_NONE  = 0x1, // no access
  _PROT_READ  = 0x2, // can read
  _PROT_WRITE = 0x4, // can write
  _PROT_EXEC  = 0x8, // can execute
34
};
J
jyy 已提交
35

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

J
jyy 已提交
41
// An event of type @event, caused by @cause of pointer @ref
Y
Yanyan Jiang 已提交
42 43 44
typedef struct _Event {
  int event;
  uintptr_t cause, ref;
Y
Yanyan Jiang 已提交
45
  const char *msg;
Y
Yanyan Jiang 已提交
46
} _Event;
47 48

// Arch-dependent processor context
Y
Yanyan Jiang 已提交
49
typedef struct _Context _Context;
Y
Yanyan Jiang 已提交
50

J
jyy 已提交
51 52
// A protected address space with user memory @area
// and arch-dependent @ptr
53
typedef struct _AddressSpace {
Y
Yanyan Jiang 已提交
54 55
  size_t pgsize;
  _Area area;
Y
Yanyan Jiang 已提交
56
  void *ptr;
57
} _AddressSpace;
Y
Yanyan Jiang 已提交
58

Y
Yanyan Jiang 已提交
59
// ====================== Turing Machine (TRM) =======================
J
jyy 已提交
60 61 62

extern _Area _heap;
void _putc(char ch);
Y
Yanyan Jiang 已提交
63
void _halt(int code) __attribute__((__noreturn__));
J
jyy 已提交
64 65 66

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

67 68
int    _ioe_init();
size_t _io_read (uint32_t dev, uintptr_t reg, void *buf, size_t size);
69
size_t _io_write(uint32_t dev, uintptr_t reg, void *buf, size_t size);
J
jyy 已提交
70

Z
Zihao Yu 已提交
71
// ====================== Context Extension (CTE) ====================
J
jyy 已提交
72

73
int  _cte_init(_Context *(*handler)(_Event ev, _Context *ctx));
J
jyy 已提交
74
void _yield();
75
int  _intr_read();
J
jyy 已提交
76
void _intr_write(int enable);
77
_Context* _kcontext(_Area kstack, void (*entry)(void *), void *arg);
J
jyy 已提交
78

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

81 82
int  _vme_init(void *(*pgalloc)(size_t size), void (*pgfree)(void *));
void _protect(_AddressSpace *as);
83
void _unprotect(_AddressSpace *as);
84
void _map(_AddressSpace *as, void *va, void *pa, int prot);
85
_Context *_ucontext(_AddressSpace *as, _Area kstack, void *entry);
Y
Yanyan Jiang 已提交
86

87 88 89
// hugepage map for xiangshan testing
void _map_rv_hugepage(_AddressSpace *as, void *va, void *pa, int prot, int pagetable_level);

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

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

#ifdef __cplusplus
}
#endif

101
#endif