xref: /aosp_15_r20/external/scudo/standalone/trusty.cpp (revision 76559068c068bd27e82aff38fac3bfc865233bca)
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