1// See LICENSE for license details.
2
3#include "pk.h"
4#include "atomic.h"
5#include "frontend.h"
6#include "syscall.h"
7#include "htif.h"
8#include <stdint.h>
9
10long frontend_syscall(long n, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6)
11{
12  static volatile uint64_t magic_mem[8];
13
14  static spinlock_t lock = SPINLOCK_INIT;
15  spinlock_lock(&lock);
16
17  magic_mem[0] = n;
18  magic_mem[1] = a0;
19  magic_mem[2] = a1;
20  magic_mem[3] = a2;
21  magic_mem[4] = a3;
22  magic_mem[5] = a4;
23  magic_mem[6] = a5;
24  magic_mem[7] = a6;
25
26  htif_syscall((uintptr_t)magic_mem);
27
28  long ret = magic_mem[0];
29
30  spinlock_unlock(&lock);
31  return ret;
32}
33
34void shutdown(int code)
35{
36  frontend_syscall(SYS_exit, code, 0, 0, 0, 0, 0, 0);
37  while (1);
38}
39
40void copy_stat(struct stat* dest, struct frontend_stat* src)
41{
42  dest->st_dev = src->dev;
43  dest->st_ino = src->ino;
44  dest->st_mode = src->mode;
45  dest->st_nlink = src->nlink;
46  dest->st_uid = src->uid;
47  dest->st_gid = src->gid;
48  dest->st_rdev = src->rdev;
49  dest->st_size = src->size;
50  dest->st_blksize = src->blksize;
51  dest->st_blocks = src->blocks;
52  dest->st_atime = src->atime;
53  dest->st_mtime = src->mtime;
54  dest->st_ctime = src->ctime;
55}
56