blob: 7428b759b715e3f52cb60d2472547c6f8364f55c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#pragma once
#include <stdint.h>
#include <mlibc/tcb.hpp>
#include <bits/ensure.h>
namespace mlibc {
inline Tcb *get_current_tcb() {
// On RISC-V, the TCB is below the thread pointer.
uintptr_t tp = (uintptr_t)__builtin_thread_pointer();
auto tcb = reinterpret_cast<Tcb *>(tp - sizeof(Tcb));
__ensure(tcb == tcb->selfPointer);
return tcb;
}
inline uintptr_t get_sp() {
uintptr_t sp;
asm ("mv %0, sp" : "=r"(sp));
return sp;
}
} // namespace mlibc
|