1*76559068SAndroid Build Coastguard Worker //===-- trusty.cpp ---------------------------------------------*- C++ -*-===//
2*76559068SAndroid Build Coastguard Worker //
3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*76559068SAndroid Build Coastguard Worker //
7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*76559068SAndroid Build Coastguard Worker
9*76559068SAndroid Build Coastguard Worker #include "platform.h"
10*76559068SAndroid Build Coastguard Worker
11*76559068SAndroid Build Coastguard Worker #if SCUDO_TRUSTY
12*76559068SAndroid Build Coastguard Worker
13*76559068SAndroid Build Coastguard Worker #include "common.h"
14*76559068SAndroid Build Coastguard Worker #include "mutex.h"
15*76559068SAndroid Build Coastguard Worker #include "report_linux.h"
16*76559068SAndroid Build Coastguard Worker #include "trusty.h"
17*76559068SAndroid Build Coastguard Worker
18*76559068SAndroid Build Coastguard Worker #include <errno.h> // for errno
19*76559068SAndroid Build Coastguard Worker #include <lk/err_ptr.h> // for PTR_ERR and IS_ERR
20*76559068SAndroid Build Coastguard Worker #include <stdio.h> // for printf()
21*76559068SAndroid Build Coastguard Worker #include <stdlib.h> // for getenv()
22*76559068SAndroid Build Coastguard Worker #include <sys/auxv.h> // for getauxval()
23*76559068SAndroid Build Coastguard Worker #include <time.h> // for clock_gettime()
24*76559068SAndroid Build Coastguard Worker #include <trusty_err.h> // for lk_err_to_errno()
25*76559068SAndroid Build Coastguard Worker #include <trusty_syscalls.h> // for _trusty_brk()
26*76559068SAndroid Build Coastguard Worker #include <uapi/mm.h> // for MMAP flags
27*76559068SAndroid Build Coastguard Worker
28*76559068SAndroid Build Coastguard Worker namespace scudo {
29*76559068SAndroid Build Coastguard Worker
getPageSize()30*76559068SAndroid Build Coastguard Worker uptr getPageSize() { return getauxval(AT_PAGESZ); }
31*76559068SAndroid Build Coastguard Worker
die()32*76559068SAndroid Build Coastguard Worker void NORETURN die() { abort(); }
33*76559068SAndroid Build Coastguard Worker
map(void * Addr,uptr Size,const char * Name,uptr Flags,UNUSED MapPlatformData * Data)34*76559068SAndroid Build Coastguard Worker void *map(void *Addr, uptr Size, const char *Name, uptr Flags,
35*76559068SAndroid Build Coastguard Worker UNUSED MapPlatformData *Data) {
36*76559068SAndroid Build Coastguard Worker uint32_t MmapFlags =
37*76559068SAndroid Build Coastguard Worker MMAP_FLAG_ANONYMOUS | MMAP_FLAG_PROT_READ | MMAP_FLAG_PROT_WRITE;
38*76559068SAndroid Build Coastguard Worker
39*76559068SAndroid Build Coastguard Worker // If the MAP_NOACCESS flag is set, Scudo tries to reserve
40*76559068SAndroid Build Coastguard Worker // a memory region without mapping physical pages. This corresponds
41*76559068SAndroid Build Coastguard Worker // to MMAP_FLAG_NO_PHYSICAL in Trusty.
42*76559068SAndroid Build Coastguard Worker if (Flags & MAP_NOACCESS)
43*76559068SAndroid Build Coastguard Worker MmapFlags |= MMAP_FLAG_NO_PHYSICAL;
44*76559068SAndroid Build Coastguard Worker if (Addr)
45*76559068SAndroid Build Coastguard Worker MmapFlags |= MMAP_FLAG_FIXED_NOREPLACE;
46*76559068SAndroid Build Coastguard Worker
47*76559068SAndroid Build Coastguard Worker if (Flags & MAP_MEMTAG)
48*76559068SAndroid Build Coastguard Worker MmapFlags |= MMAP_FLAG_PROT_MTE;
49*76559068SAndroid Build Coastguard Worker
50*76559068SAndroid Build Coastguard Worker void *P = (void *)_trusty_mmap(Addr, Size, MmapFlags, 0);
51*76559068SAndroid Build Coastguard Worker
52*76559068SAndroid Build Coastguard Worker if (IS_ERR(P)) {
53*76559068SAndroid Build Coastguard Worker errno = lk_err_to_errno(PTR_ERR(P));
54*76559068SAndroid Build Coastguard Worker if (!(Flags & MAP_ALLOWNOMEM) || errno != ENOMEM)
55*76559068SAndroid Build Coastguard Worker reportMapError(Size);
56*76559068SAndroid Build Coastguard Worker return nullptr;
57*76559068SAndroid Build Coastguard Worker }
58*76559068SAndroid Build Coastguard Worker
59*76559068SAndroid Build Coastguard Worker return P;
60*76559068SAndroid Build Coastguard Worker }
61*76559068SAndroid Build Coastguard Worker
unmap(UNUSED void * Addr,UNUSED uptr Size,UNUSED uptr Flags,UNUSED MapPlatformData * Data)62*76559068SAndroid Build Coastguard Worker void unmap(UNUSED void *Addr, UNUSED uptr Size, UNUSED uptr Flags,
63*76559068SAndroid Build Coastguard Worker UNUSED MapPlatformData *Data) {
64*76559068SAndroid Build Coastguard Worker if (_trusty_munmap(Addr, Size) != 0)
65*76559068SAndroid Build Coastguard Worker reportUnmapError(reinterpret_cast<uptr>(Addr), Size);
66*76559068SAndroid Build Coastguard Worker }
67*76559068SAndroid Build Coastguard Worker
setMemoryPermission(UNUSED uptr Addr,UNUSED uptr Size,UNUSED uptr Flags,UNUSED MapPlatformData * Data)68*76559068SAndroid Build Coastguard Worker void setMemoryPermission(UNUSED uptr Addr, UNUSED uptr Size, UNUSED uptr Flags,
69*76559068SAndroid Build Coastguard Worker UNUSED MapPlatformData *Data) {}
70*76559068SAndroid Build Coastguard Worker
releasePagesToOS(UNUSED uptr BaseAddress,UNUSED uptr Offset,UNUSED uptr Size,UNUSED MapPlatformData * Data)71*76559068SAndroid Build Coastguard Worker void releasePagesToOS(UNUSED uptr BaseAddress, UNUSED uptr Offset,
72*76559068SAndroid Build Coastguard Worker UNUSED uptr Size, UNUSED MapPlatformData *Data) {}
73*76559068SAndroid Build Coastguard Worker
getEnv(const char * Name)74*76559068SAndroid Build Coastguard Worker const char *getEnv(const char *Name) { return getenv(Name); }
75*76559068SAndroid Build Coastguard Worker
76*76559068SAndroid Build Coastguard Worker // All mutex operations are a no-op since Trusty doesn't currently support
77*76559068SAndroid Build Coastguard Worker // threads.
tryLock()78*76559068SAndroid Build Coastguard Worker bool HybridMutex::tryLock() { return true; }
79*76559068SAndroid Build Coastguard Worker
lockSlow()80*76559068SAndroid Build Coastguard Worker void HybridMutex::lockSlow() {}
81*76559068SAndroid Build Coastguard Worker
unlock()82*76559068SAndroid Build Coastguard Worker void HybridMutex::unlock() {}
83*76559068SAndroid Build Coastguard Worker
assertHeldImpl()84*76559068SAndroid Build Coastguard Worker void HybridMutex::assertHeldImpl() {}
85*76559068SAndroid Build Coastguard Worker
getMonotonicTime()86*76559068SAndroid Build Coastguard Worker u64 getMonotonicTime() {
87*76559068SAndroid Build Coastguard Worker timespec TS;
88*76559068SAndroid Build Coastguard Worker clock_gettime(CLOCK_MONOTONIC, &TS);
89*76559068SAndroid Build Coastguard Worker return static_cast<u64>(TS.tv_sec) * (1000ULL * 1000 * 1000) +
90*76559068SAndroid Build Coastguard Worker static_cast<u64>(TS.tv_nsec);
91*76559068SAndroid Build Coastguard Worker }
92*76559068SAndroid Build Coastguard Worker
getMonotonicTimeFast()93*76559068SAndroid Build Coastguard Worker u64 getMonotonicTimeFast() {
94*76559068SAndroid Build Coastguard Worker #if defined(CLOCK_MONOTONIC_COARSE)
95*76559068SAndroid Build Coastguard Worker timespec TS;
96*76559068SAndroid Build Coastguard Worker clock_gettime(CLOCK_MONOTONIC_COARSE, &TS);
97*76559068SAndroid Build Coastguard Worker return static_cast<u64>(TS.tv_sec) * (1000ULL * 1000 * 1000) +
98*76559068SAndroid Build Coastguard Worker static_cast<u64>(TS.tv_nsec);
99*76559068SAndroid Build Coastguard Worker #else
100*76559068SAndroid Build Coastguard Worker return getMonotonicTime();
101*76559068SAndroid Build Coastguard Worker #endif
102*76559068SAndroid Build Coastguard Worker }
103*76559068SAndroid Build Coastguard Worker
getNumberOfCPUs()104*76559068SAndroid Build Coastguard Worker u32 getNumberOfCPUs() { return 0; }
105*76559068SAndroid Build Coastguard Worker
getThreadID()106*76559068SAndroid Build Coastguard Worker u32 getThreadID() { return 0; }
107*76559068SAndroid Build Coastguard Worker
getRandom(UNUSED void * Buffer,UNUSED uptr Length,UNUSED bool Blocking)108*76559068SAndroid Build Coastguard Worker bool getRandom(UNUSED void *Buffer, UNUSED uptr Length, UNUSED bool Blocking) {
109*76559068SAndroid Build Coastguard Worker return false;
110*76559068SAndroid Build Coastguard Worker }
111*76559068SAndroid Build Coastguard Worker
outputRaw(const char * Buffer)112*76559068SAndroid Build Coastguard Worker void outputRaw(const char *Buffer) { printf("%s", Buffer); }
113*76559068SAndroid Build Coastguard Worker
setAbortMessage(UNUSED const char * Message)114*76559068SAndroid Build Coastguard Worker void setAbortMessage(UNUSED const char *Message) {}
115*76559068SAndroid Build Coastguard Worker
116*76559068SAndroid Build Coastguard Worker } // namespace scudo
117*76559068SAndroid Build Coastguard Worker
118*76559068SAndroid Build Coastguard Worker #endif // SCUDO_TRUSTY
119