am.h 2.6 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>

Z
Zihao Yu 已提交
13 14 15 16
#ifndef NULL
# define NULL ((void *)0)
#endif

Y
Yanyan Jiang 已提交
17 18 19 20
typedef struct _Area {
  void *start, *end;
} _Area; 

Y
Yanyan Jiang 已提交
21 22 23 24 25 26 27 28 29 30 31
typedef struct _Device {
  uint32_t id;
  const char *name;
  uintptr_t (*read)(uintptr_t reg, size_t nmemb);
  void (*write)(uintptr_t reg, size_t nmemb, uintptr_t data);
} _Device;

typedef struct _RegSet _RegSet;

enum {
  _EVENT_NULL = 0,
Y
Yanyan Jiang 已提交
32 33 34
  _EVENT_IRQ_TIMER,
  _EVENT_IRQ_IODEV,
  _EVENT_PAGEFAULT,
Y
Yanyan Jiang 已提交
35
  _EVENT_ERROR,
Y
Yanyan Jiang 已提交
36 37
  _EVENT_TRAP,
  _EVENT_SYSCALL,
Y
Yanyan Jiang 已提交
38 39 40 41 42 43 44 45 46
};

typedef struct _Event {
  int event;
  uintptr_t cause, ref;
} _Event;

typedef struct _Protect {
  _Area area; 
Y
Yanyan Jiang 已提交
47
  size_t pgsize;
Y
Yanyan Jiang 已提交
48 49 50
  void *ptr;
} _Protect;

51 52 53 54
#ifdef __cplusplus
extern "C" {
#endif

Y
Yanyan Jiang 已提交
55
// =======================================================================
Y
Yanyan Jiang 已提交
56
// [0] Turing Machine
Y
Yanyan Jiang 已提交
57 58
// =======================================================================

Y
Yanyan Jiang 已提交
59
extern _Area _heap;
Y
Yanyan Jiang 已提交
60 61 62 63
void _putc(char ch);
void _halt(int code);

// =======================================================================
Y
Yanyan Jiang 已提交
64
// [1] I/O Extension (IOE)
Y
Yanyan Jiang 已提交
65 66 67
// =======================================================================

void _ioe_init();
Y
Yanyan Jiang 已提交
68
_Device *_device(int n);
Y
Yanyan Jiang 已提交
69 70

// =======================================================================
71
// [2] Asynchronous Extension (ASYE)
Y
Yanyan Jiang 已提交
72 73
// =======================================================================

Y
Yanyan Jiang 已提交
74
void _asye_init(_RegSet *(*l)(_Event ev, _RegSet *regs));
Y
Yanyan Jiang 已提交
75
_RegSet *_make(_Area kstack, void *entry, void *arg);
Y
Yanyan Jiang 已提交
76
void _trap();
Y
Yanyan Jiang 已提交
77
int _istatus(int enable);
Y
Yanyan Jiang 已提交
78 79

// =======================================================================
80
// [3] Protection Extension (PTE)
Y
Yanyan Jiang 已提交
81 82
// =======================================================================

Y
Yanyan Jiang 已提交
83 84 85 86 87
#define _PROT_NONE   1
#define _PROT_READ   2
#define _PROT_WRITE  4
#define _PROT_EXEC   8
void _pte_init(void*(*pgalloc)(), void (*pgfree)(void*));
Y
Yanyan Jiang 已提交
88 89
void _protect(_Protect *p);
void _release(_Protect *p);
Y
Yanyan Jiang 已提交
90 91
void _map(_Protect *p, void *va, void *pa, int prot);
void *_query(_Protect *p, void *va, int *prot);
Y
Yanyan Jiang 已提交
92
void _unmap(_Protect *p, void *va);
Y
Yanyan Jiang 已提交
93
void _switch(_Protect *p);
Y
Yanyan Jiang 已提交
94
_RegSet *_umake(_Protect *p, _Area ustack, _Area kstack, void *entry, void *args);
Y
Yanyan Jiang 已提交
95 96

// =======================================================================
97
// [4] Multi-Processor Extension (MPE)
Y
Yanyan Jiang 已提交
98 99 100
// =======================================================================

void _mpe_init(void (*entry)());
Y
Yanyan Jiang 已提交
101
int _ncpu();
Y
Yanyan Jiang 已提交
102
int _cpu();
Y
Yanyan Jiang 已提交
103
intptr_t _atomic_xchg(volatile intptr_t *addr, intptr_t newval);
Y
Yanyan Jiang 已提交
104 105 106 107 108 109 110

#ifdef __cplusplus
}
#endif

#endif