更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_lms_pri.h 文件参考

浏览源代码.

结构体

struct  LmsAddrInfo
 

函数

static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsLock (pthread_mutex_t *lock)
 
static ATTRIBUTE_NO_SANITIZE_ADDRESS int LmsTrylock (pthread_mutex_t *lock)
 
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsUnlock (pthread_mutex_t *lock)
 
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsCrash (void)
 
uint32_t LmsIsShadowAddrMapped (uintptr_t sdStartAddr, uintptr_t sdEndAddr)
 
void LmsSetShadowValue (uintptr_t startAddr, uintptr_t endAddr, char value)
 
void LmsGetShadowValue (uintptr_t addr, uint32_t *shadowValue)
 
void LmsReportError (uintptr_t p, size_t size, uint32_t errMod)
 
void LmsMem2Shadow (uintptr_t memAddr, uintptr_t *shadowAddr, uint32_t *shadowOffset)
 
void LmsCheckValid (const char *dest, const char *src)
 
void__real_malloc (size_t)
 
void __real_free (void *)
 
void__real_calloc (size_t, size_t)
 
void__real_realloc (void *, size_t)
 
void__real_valloc (size_t)
 
void__real_aligned_alloc (size_t, size_t)
 
void__real_memcpy (void *__restrict, const void *__restrict, size_t)
 
void__real_memmove (void *, const void *, size_t)
 
char * __real_strcat (char *, const char *)
 
char * __real_strcpy (char *, const char *)
 
void__real_memset (void *, int, size_t)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN_noabort (uintptr_t p, uint32_t size)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN_noabort (uintptr_t p, uint32_t size)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16_noabort (uintptr_t p)
 
SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_no_return (void)
 

变量

pthread_mutex_t g_lmsMutex
 

函数说明

◆ __asan_handle_no_return()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_handle_no_return ( void  )

在文件 los_lms.c483 行定义.

484{
485 return;
486}

◆ __asan_load16_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_load16_noabort ( uintptr_t  p)

在文件 los_lms.c469 行定义.

470{
471 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_16) != LMS_OK) {
472 LmsReportError(p, MEM_REGION_SIZE_16, LOAD_ERRMODE);
473 }
474}
ATTRIBUTE_NO_SANITIZE_ADDRESS uint32_t LmsCheckAddrRegion(uintptr_t addr, size_t size)
Definition: los_lms.c:223
ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsReportError(uintptr_t p, size_t size, uint32_t errMod)
Definition: los_lms.c:352
函数调用图:

◆ __asan_load1_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_load1_noabort ( uintptr_t  p)

在文件 los_lms.c441 行定义.

442{
443 if (LmsCheckAddr(p) != LMS_SHADOW_ACCESSABLE_U8) {
444 LmsReportError(p, MEM_REGION_SIZE_1, LOAD_ERRMODE);
445 }
446}
ATTRIBUTE_NO_SANITIZE_ADDRESS uint32_t LmsCheckAddr(uintptr_t addr)
Definition: los_lms.c:214
函数调用图:

◆ __asan_load2_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_load2_noabort ( uintptr_t  p)

在文件 los_lms.c448 行定义.

449{
450 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_2) != LMS_OK) {
451 LmsReportError(p, MEM_REGION_SIZE_2, LOAD_ERRMODE);
452 }
453}
函数调用图:

◆ __asan_load4_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_load4_noabort ( uintptr_t  p)

在文件 los_lms.c455 行定义.

456{
457 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_4) != LMS_OK) {
458 LmsReportError(p, MEM_REGION_SIZE_4, LOAD_ERRMODE);
459 }
460}
函数调用图:

◆ __asan_load8_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_load8_noabort ( uintptr_t  p)

在文件 los_lms.c462 行定义.

463{
464 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_8) != LMS_OK) {
465 LmsReportError(p, MEM_REGION_SIZE_8, LOAD_ERRMODE);
466 }
467}
函数调用图:

◆ __asan_loadN_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_loadN_noabort ( uintptr_t  p,
uint32_t  size 
)

◆ __asan_store16_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_store16_noabort ( uintptr_t  p)

在文件 los_lms.c427 行定义.

428{
429 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_16) != LMS_OK) { /* 16 byte memory for check */
430 LmsReportError(p, MEM_REGION_SIZE_16, STORE_ERRMODE);
431 }
432}
函数调用图:

◆ __asan_store1_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_store1_noabort ( uintptr_t  p)

在文件 los_lms.c399 行定义.

400{
401 if (LmsCheckAddr(p) != LMS_SHADOW_ACCESSABLE_U8) {
402 LmsReportError(p, MEM_REGION_SIZE_1, STORE_ERRMODE);
403 }
404}
函数调用图:

◆ __asan_store2_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_store2_noabort ( uintptr_t  p)

在文件 los_lms.c406 行定义.

407{
408 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_2) != LMS_OK) {
409 LmsReportError(p, MEM_REGION_SIZE_2, STORE_ERRMODE);
410 }
411}
函数调用图:

◆ __asan_store4_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_store4_noabort ( uintptr_t  p)

在文件 los_lms.c413 行定义.

414{
415 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_4) != LMS_OK) {
416 LmsReportError(p, MEM_REGION_SIZE_4, STORE_ERRMODE);
417 }
418}
函数调用图:

◆ __asan_store8_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_store8_noabort ( uintptr_t  p)

在文件 los_lms.c420 行定义.

421{
422 if (LmsCheckAddrRegion(p, MEM_REGION_SIZE_8) != LMS_OK) {
423 LmsReportError(p, MEM_REGION_SIZE_8, STORE_ERRMODE);
424 }
425}
函数调用图:

◆ __asan_storeN_noabort()

SANITIZER_INTERFACE_ATTRIBUTE void __asan_storeN_noabort ( uintptr_t  p,
uint32_t  size 
)

◆ __real_aligned_alloc()

void * __real_aligned_alloc ( size_t  ,
size_t   
)
这是这个函数的调用关系图:

◆ __real_calloc()

void * __real_calloc ( size_t  ,
size_t   
)
这是这个函数的调用关系图:

◆ __real_free()

void __real_free ( void )
这是这个函数的调用关系图:

◆ __real_malloc()

void * __real_malloc ( size_t  )
这是这个函数的调用关系图:

◆ __real_memcpy()

void * __real_memcpy ( void __restrict,
const void __restrict,
size_t   
)
这是这个函数的调用关系图:

◆ __real_memmove()

void * __real_memmove ( void ,
const void ,
size_t   
)
这是这个函数的调用关系图:

◆ __real_memset()

void * __real_memset ( void ,
int  ,
size_t   
)
这是这个函数的调用关系图:

◆ __real_realloc()

void * __real_realloc ( void ,
size_t   
)
这是这个函数的调用关系图:

◆ __real_strcat()

char * __real_strcat ( char *  ,
const char *   
)
这是这个函数的调用关系图:

◆ __real_strcpy()

char * __real_strcpy ( char *  ,
const char *   
)
这是这个函数的调用关系图:

◆ __real_valloc()

void * __real_valloc ( size_t  )
这是这个函数的调用关系图:

◆ LmsCheckValid()

void LmsCheckValid ( const char *  dest,
const char *  src 
)

在文件 los_lms.c374 行定义.

375{
376 if (LmsCheckAddr((uintptr_t)dest) != LMS_SHADOW_ACCESSABLE_U8) {
377 LmsReportError((uintptr_t)dest, MEM_REGION_SIZE_1, STORE_ERRMODE);
378 return;
379 }
380
381 if (LmsCheckAddr((uintptr_t)src) != LMS_SHADOW_ACCESSABLE_U8) {
382 LmsReportError((uintptr_t)src, MEM_REGION_SIZE_1, LOAD_ERRMODE);
383 return;
384 }
385
386 for (uint32_t i = 0; *(src + i) != '\0'; i++) {
387 if (LmsCheckAddr((uintptr_t)dest + i + 1) != LMS_SHADOW_ACCESSABLE_U8) {
388 LmsReportError((uintptr_t)dest + i + 1, MEM_REGION_SIZE_1, STORE_ERRMODE);
389 return;
390 }
391
392 if (LmsCheckAddr((uintptr_t)src + i + 1) != LMS_SHADOW_ACCESSABLE_U8) {
393 LmsReportError((uintptr_t)src + i + 1, MEM_REGION_SIZE_1, LOAD_ERRMODE);
394 return;
395 }
396 }
397}
函数调用图:
这是这个函数的调用关系图:

◆ LmsCrash()

static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsCrash ( void  )
inlinestatic

在文件 los_lms_pri.h113 行定义.

114{
115 *(volatile char *)(SHADOW_BASE - 1) = 0;
116}
这是这个函数的调用关系图:

◆ LmsGetShadowValue()

void LmsGetShadowValue ( uintptr_t  addr,
uint32_t *  shadowValue 
)

在文件 los_lms.c170 行定义.

171{
172 uintptr_t shadowAddr;
173 uint32_t shadowOffset;
174 LmsMem2Shadow(addr, &shadowAddr, &shadowOffset);
175 /* If the shadow addr is not mapped then regarded as legal access */
176 if (LmsIsShadowAddrMapped(shadowAddr, shadowAddr) != LMS_OK) {
177 *shadowValue = LMS_SHADOW_ACCESSABLE_U8;
178 return;
179 }
180
181 *shadowValue = ((*(char *)shadowAddr) >> shadowOffset) & LMS_SHADOW_MASK;
182}
ATTRIBUTE_NO_SANITIZE_ADDRESS uint32_t LmsIsShadowAddrMapped(uintptr_t sdStartAddr, uintptr_t sdEndAddr)
Definition: los_lms.c:59
ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsMem2Shadow(uintptr_t memAddr, uintptr_t *shadowAddr, uint32_t *shadowOffset)
Definition: los_lms.c:52
函数调用图:
这是这个函数的调用关系图:

◆ LmsIsShadowAddrMapped()

uint32_t LmsIsShadowAddrMapped ( uintptr_t  sdStartAddr,
uintptr_t  sdEndAddr 
)

在文件 los_lms.c59 行定义.

60{
61 struct MmapNode *node = g_mmapNode;
62 while (node != NULL) {
63 if ((sdStartAddr >= node->addr) && (sdEndAddr < node->addr + node->mapSize)) {
64 return LMS_OK;
65 }
66 node = node->next;
67 }
68 return LMS_NOK;
69}
struct MmapNode * next
Definition: los_lms.c:41
size_t mapSize
Definition: los_lms.c:40
uintptr_t addr
Definition: los_lms.c:39
struct MmapNode * g_mmapNode
Definition: los_lms.c:46
这是这个函数的调用关系图:

◆ LmsLock()

static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsLock ( pthread_mutex_t *  lock)
inlinestatic

在文件 los_lms_pri.h98 行定义.

99{
101}
int pthread_mutex_lock(pthread_mutex_t *mutex)
互斥锁加锁操作
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
函数调用图:
这是这个函数的调用关系图:

◆ LmsMem2Shadow()

void LmsMem2Shadow ( uintptr_t  memAddr,
uintptr_t *  shadowAddr,
uint32_t *  shadowOffset 
)

在文件 los_lms.c52 行定义.

53{
54 uint32_t memOffset = memAddr - USPACE_MAP_BASE;
55 *shadowAddr = g_shadowStartAddr + memOffset / LMS_SHADOW_U8_REFER_BYTES;
56 *shadowOffset = ((memOffset % LMS_SHADOW_U8_REFER_BYTES) / LMS_SHADOW_U8_CELL_NUM) * LMS_SHADOW_BITS_PER_CELL;
57}
uint32_t g_shadowStartAddr
Definition: los_lms.c:48
这是这个函数的调用关系图:

◆ LmsReportError()

void LmsReportError ( uintptr_t  p,
size_t  size,
uint32_t  errMod 
)

在文件 los_lms.c352 行定义.

353{
354 LmsAddrInfo info;
355 (void)__real_memset(&info, 0, sizeof(LmsAddrInfo));
356
357 int locked = LmsTrylock(&g_lmsMutex);
358 LMS_OUTPUT_ERROR("\n***** Lite Memory Sanitizer Error Detected *****\n");
359 LmsGetErrorInfo(p, size, &info);
360 LmsPrintErrInfo(&info, errMod);
362 LMS_OUTPUT_ERROR("***** Lite Memory Sanitizer Error Detected End *****\n");
363 if (!locked) {
365 }
366
367 if (LMS_CRASH_MODE > 0) {
368 LmsCrash();
369 } else {
370 print_trace();
371 }
372}
UINTPTR memAddr
Definition: los_lms_pri.h:90
ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsPrintMemInfo(uintptr_t addr)
Definition: los_lms.c:232
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsPrintErrInfo(LmsAddrInfo *info, uint32_t errMod)
Definition: los_lms.c:310
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsGetErrorInfo(uintptr_t addr, size_t size, LmsAddrInfo *info)
Definition: los_lms.c:300
pthread_mutex_t g_lmsMutex
Definition: los_lms.c:50
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsCrash(void)
Definition: los_lms_pri.h:113
static ATTRIBUTE_NO_SANITIZE_ADDRESS int LmsTrylock(pthread_mutex_t *lock)
Definition: los_lms_pri.h:103
void * __real_memset(void *, int, size_t)
static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsUnlock(pthread_mutex_t *lock)
Definition: los_lms_pri.h:108
函数调用图:
这是这个函数的调用关系图:

◆ LmsSetShadowValue()

void LmsSetShadowValue ( uintptr_t  startAddr,
uintptr_t  endAddr,
char  value 
)

在文件 los_lms.c120 行定义.

121{
122 uintptr_t shadowStart;
123 uintptr_t shadowEnd;
124 uint32_t startOffset;
125 uint32_t endOffset;
126
127 char shadowValueMask;
128 char shadowValue;
129
130 /* endAddr - 1, then we mark [startAddr, endAddr) to value */
131 LmsMem2Shadow(startAddr, &shadowStart, &startOffset);
132 LmsMem2Shadow(endAddr - 1, &shadowEnd, &endOffset);
133
134 if (shadowStart == shadowEnd) { /* in the same u8 */
135 /* because endAddr - 1, the endOffset falls into the previous cell,
136 so endOffset + 2 is required for calculation */
137 shadowValueMask = LMS_SHADOW_MASK_U8;
138 shadowValueMask =
139 (shadowValueMask << startOffset) & (~(shadowValueMask << (endOffset + LMS_SHADOW_BITS_PER_CELL)));
140 shadowValue = value & shadowValueMask;
141 *(char *)shadowStart &= ~shadowValueMask;
142 *(char *)shadowStart |= shadowValue;
143 } else {
144 /* Adjust startAddr to left util it reach the beginning of a u8 */
145 if (startOffset > 0) {
146 shadowValueMask = LMS_SHADOW_MASK_U8;
147 shadowValueMask = shadowValueMask << startOffset;
148 shadowValue = value & shadowValueMask;
149 *(char *)shadowStart &= ~shadowValueMask;
150 *(char *)shadowStart |= shadowValue;
151 shadowStart += 1;
152 }
153
154 /* Adjust endAddr to right util it reach the end of a u8 */
155 if (endOffset < (LMS_SHADOW_U8_CELL_NUM - 1) * LMS_SHADOW_BITS_PER_CELL) {
156 shadowValueMask = LMS_SHADOW_MASK_U8;
157 shadowValueMask &= ~(shadowValueMask << (endOffset + LMS_SHADOW_BITS_PER_CELL));
158 shadowValue = value & shadowValueMask;
159 *(char *)shadowEnd &= ~shadowValueMask;
160 *(char *)shadowEnd |= shadowValue;
161 shadowEnd -= 1;
162 }
163
164 if (shadowEnd + 1 > shadowStart) {
165 (void)__real_memset((void *)shadowStart, value & LMS_SHADOW_MASK_U8, shadowEnd + 1 - shadowStart);
166 }
167 }
168}
函数调用图:
这是这个函数的调用关系图:

◆ LmsTrylock()

static ATTRIBUTE_NO_SANITIZE_ADDRESS int LmsTrylock ( pthread_mutex_t *  lock)
inlinestatic

在文件 los_lms_pri.h103 行定义.

104{
105 return pthread_mutex_trylock(lock);
106}
int pthread_mutex_trylock(pthread_mutex_t *mutex)
互斥锁尝试加锁操作
函数调用图:
这是这个函数的调用关系图:

◆ LmsUnlock()

static ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsUnlock ( pthread_mutex_t *  lock)
inlinestatic

在文件 los_lms_pri.h108 行定义.

109{
111}
int pthread_mutex_unlock(pthread_mutex_t *mutex)
解锁互斥锁
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ g_lmsMutex

pthread_mutex_t g_lmsMutex
extern

在文件 los_lms.c50 行定义.