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

浏览源代码.

结构体

struct  LmsMemListNode
 
struct  LmsAddrInfo
 
struct  LmsHook
 

函数

VOID OsLmsCheckValid (UINTPTR checkAddr, BOOL isFreeCheck)
 
VOID OsLmsLosMallocMark (const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize)
 
VOID OsLmsLosFreeMark (const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize)
 
VOID OsLmsSimpleMark (UINTPTR startAddr, UINTPTR endAddr, UINT32 value)
 
VOID OsLmsPrintPoolListInfo (VOID)
 
VOID OsLmsReportError (UINTPTR p, UINT32 size, UINT32 errMod)
 
VOID CheckValid (const CHAR *dest, const CHAR *src)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store1_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store4_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load4_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load1_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_loadN_noabort (UINTPTR p, UINT32 size)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_storeN_noabort (UINTPTR p, UINT32 size)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store2_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load2_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store8_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load8_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load16_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store16_noabort (UINTPTR p)
 
SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_handle_no_return (VOID)
 

变量

LmsHookg_lms
 

函数说明

◆ __asan_handle_no_return()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_handle_no_return ( VOID  )

在文件 los_lms.c792 行定义.

793{
794 return;
795}

◆ __asan_load16_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load16_noabort ( UINTPTR  p)

在文件 los_lms.c747 行定义.

748{
749 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_16) != LOS_OK) {
750 OsLmsReportError(p, MEM_REGION_SIZE_16, LOAD_ERRMODE);
751 }
752}
STATIC INLINE UINT32 OsLmsCheckAddrRegion(UINTPTR addr, UINT32 size)
Definition: los_lms.c:466
VOID OsLmsReportError(UINTPTR p, UINT32 size, UINT32 errMod)
Definition: los_lms.c:619
函数调用图:

◆ __asan_load1_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load1_noabort ( UINTPTR  p)

在文件 los_lms.c719 行定义.

720{
721 if (OsLmsCheckAddr(p) != LMS_SHADOW_ACCESSABLE_U8) {
722 OsLmsReportError(p, MEM_REGION_SIZE_1, LOAD_ERRMODE);
723 }
724}
STATIC UINT32 OsLmsCheckAddr(UINTPTR addr)
Definition: los_lms.c:444
函数调用图:

◆ __asan_load2_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load2_noabort ( UINTPTR  p)

在文件 los_lms.c726 行定义.

727{
728 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_2) != LOS_OK) {
729 OsLmsReportError(p, MEM_REGION_SIZE_2, LOAD_ERRMODE);
730 }
731}
函数调用图:

◆ __asan_load4_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load4_noabort ( UINTPTR  p)

在文件 los_lms.c733 行定义.

734{
735 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_4) != LOS_OK) {
736 OsLmsReportError(p, MEM_REGION_SIZE_4, LOAD_ERRMODE);
737 }
738}
函数调用图:

◆ __asan_load8_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_load8_noabort ( UINTPTR  p)

在文件 los_lms.c740 行定义.

741{
742 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_8) != LOS_OK) {
743 OsLmsReportError(p, MEM_REGION_SIZE_8, LOAD_ERRMODE);
744 }
745}
函数调用图:

◆ __asan_loadN_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_loadN_noabort ( UINTPTR  p,
UINT32  size 
)

在文件 los_lms.c754 行定义.

755{
756 if (OsLmsCheckAddrRegion(p, size) != LOS_OK) {
757 OsLmsReportError(p, size, LOAD_ERRMODE);
758 }
759}
函数调用图:
这是这个函数的调用关系图:

◆ __asan_store16_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store16_noabort ( UINTPTR  p)

在文件 los_lms.c671 行定义.

672{
673 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_16) != LOS_OK) {
674 OsLmsReportError(p, MEM_REGION_SIZE_16, STORE_ERRMODE);
675 }
676}
函数调用图:

◆ __asan_store1_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store1_noabort ( UINTPTR  p)

在文件 los_lms.c643 行定义.

644{
645 if (OsLmsCheckAddr(p) != LMS_SHADOW_ACCESSABLE_U8) {
646 OsLmsReportError(p, MEM_REGION_SIZE_1, STORE_ERRMODE);
647 }
648}
函数调用图:

◆ __asan_store2_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store2_noabort ( UINTPTR  p)

在文件 los_lms.c650 行定义.

651{
652 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_2) != LOS_OK) {
653 OsLmsReportError(p, MEM_REGION_SIZE_2, STORE_ERRMODE);
654 }
655}
函数调用图:

◆ __asan_store4_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store4_noabort ( UINTPTR  p)

在文件 los_lms.c657 行定义.

658{
659 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_4) != LOS_OK) {
660 OsLmsReportError(p, MEM_REGION_SIZE_4, STORE_ERRMODE);
661 }
662}
函数调用图:

◆ __asan_store8_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_store8_noabort ( UINTPTR  p)

在文件 los_lms.c664 行定义.

665{
666 if (OsLmsCheckAddrRegion(p, MEM_REGION_SIZE_8) != LOS_OK) {
667 OsLmsReportError(p, MEM_REGION_SIZE_8, STORE_ERRMODE);
668 }
669}
函数调用图:

◆ __asan_storeN_noabort()

SANITIZER_INTERFACE_ATTRIBUTE VOID __asan_storeN_noabort ( UINTPTR  p,
UINT32  size 
)

在文件 los_lms.c678 行定义.

679{
680 if (OsLmsCheckAddrRegion(p, size) != LOS_OK) {
681 OsLmsReportError(p, size, STORE_ERRMODE);
682 }
683}
函数调用图:
这是这个函数的调用关系图:

◆ CheckValid()

VOID CheckValid ( const CHAR dest,
const CHAR src 
)

◆ OsLmsCheckValid()

VOID OsLmsCheckValid ( UINTPTR  checkAddr,
BOOL  isFreeCheck 
)

在文件 los_lms.c362 行定义.

363{
364 UINT32 intSave;
365 UINT32 shadowValue = INVALID_SHADOW_VALUE;
366 LMS_LOCK(intSave);
367 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr(checkAddr);
368 if (node == NULL) {
369 LMS_UNLOCK(intSave);
370 return;
371 }
372
373 OsLmsGetShadowValue(node, checkAddr, &shadowValue);
374 LMS_UNLOCK(intSave);
375 if ((shadowValue == LMS_SHADOW_ACCESSABLE) || ((isFreeCheck) && (shadowValue == LMS_SHADOW_PAINT))) {
376 return;
377 }
378
379 OsLmsReportError(checkAddr, MEM_REGION_SIZE_1, isFreeCheck ? FREE_ERRORMODE : COMMON_ERRMODE);
380}
STATIC LmsMemListNode * OsLmsGetPoolNodeFromAddr(UINTPTR addr)
Definition: los_lms.c:106
VOID OsLmsGetShadowValue(LmsMemListNode *node, UINTPTR addr, UINT32 *shadowValue)
Definition: los_lms.c:307
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:
这是这个函数的调用关系图:

◆ OsLmsLosFreeMark()

VOID OsLmsLosFreeMark ( const VOID *  curNodeStart,
const VOID *  nextNodeStart,
UINT32  nodeHeadSize 
)

在文件 los_lms.c382 行定义.

383{
384 UINT32 intSave;
385 UINT32 shadowValue = INVALID_SHADOW_VALUE;
386
387 LMS_LOCK(intSave);
388 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr((UINTPTR)curNodeStart);
389 if (node == NULL) {
390 LMS_UNLOCK(intSave);
391 return;
392 }
393
394 UINTPTR curNodeStartAddr = (UINTPTR)curNodeStart;
395 UINTPTR nextNodeStartAddr = (UINTPTR)nextNodeStart;
396
397 OsLmsGetShadowValue(node, curNodeStartAddr + nodeHeadSize, &shadowValue);
398 if ((shadowValue != LMS_SHADOW_ACCESSABLE) && (shadowValue != LMS_SHADOW_PAINT)) {
399 LMS_UNLOCK(intSave);
400 OsLmsReportError(curNodeStartAddr + nodeHeadSize, MEM_REGION_SIZE_1, FREE_ERRORMODE);
401 return;
402 }
403
404 if (*((UINT8 *)curNodeStart) == 0) { /* if merge the node has memset with 0 */
405 OsLmsSetShadowValue(node, curNodeStartAddr, curNodeStartAddr + nodeHeadSize, LMS_SHADOW_AFTERFREE_U8);
406 }
407 OsLmsSetShadowValue(node, curNodeStartAddr + nodeHeadSize, nextNodeStartAddr, LMS_SHADOW_AFTERFREE_U8);
408
409 if (*((UINT8 *)nextNodeStart) == 0) { /* if merge the node has memset with 0 */
410 OsLmsSetShadowValue(node, nextNodeStartAddr, nextNodeStartAddr + nodeHeadSize, LMS_SHADOW_AFTERFREE_U8);
411 }
412
413 LMS_UNLOCK(intSave);
414}
VOID OsLmsSetShadowValue(LmsMemListNode *node, UINTPTR startAddr, UINTPTR endAddr, UINT8 value)
Definition: los_lms.c:255
unsigned char UINT8
Definition: los_typedef.h:55
unsigned long UINTPTR
Definition: los_typedef.h:68
函数调用图:
这是这个函数的调用关系图:

◆ OsLmsLosMallocMark()

VOID OsLmsLosMallocMark ( const VOID *  curNodeStart,
const VOID *  nextNodeStart,
UINT32  nodeHeadSize 
)

在文件 los_lms.c343 行定义.

344{
345 UINT32 intSave;
346 UINTPTR curNodeStartAddr = (UINTPTR)curNodeStart;
347 UINTPTR nextNodeStartAddr = (UINTPTR)nextNodeStart;
348
349 LMS_LOCK(intSave);
350 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr((UINTPTR)curNodeStart);
351 if (node == NULL) {
352 LMS_UNLOCK(intSave);
353 return;
354 }
355
356 OsLmsSetShadowValue(node, curNodeStartAddr, curNodeStartAddr + nodeHeadSize, LMS_SHADOW_REDZONE_U8);
357 OsLmsSetShadowValue(node, curNodeStartAddr + nodeHeadSize, nextNodeStartAddr, LMS_SHADOW_ACCESSABLE_U8);
358 OsLmsSetShadowValue(node, nextNodeStartAddr, nextNodeStartAddr + nodeHeadSize, LMS_SHADOW_REDZONE_U8);
359 LMS_UNLOCK(intSave);
360}
函数调用图:
这是这个函数的调用关系图:

◆ OsLmsPrintPoolListInfo()

VOID OsLmsPrintPoolListInfo ( VOID  )

在文件 los_lms.c488 行定义.

489{
490 UINT32 count = 0;
491 UINT32 intSave;
492 LmsMemListNode *current = NULL;
493 LOS_DL_LIST *listHead = &g_lmsCheckPoolList;
494
495 LMS_LOCK(intSave);
496 LOS_DL_LIST_FOR_EACH_ENTRY(current, listHead, LmsMemListNode, node)
497 {
498 count++;
499 PRINT_DEBUG(
500 "[LMS]memory pool[%1u]: totalsize 0x%-8x memstart 0x%-8x memstop 0x%-8x memsize 0x%-8x shadowstart 0x%-8x "
501 "shadowSize 0x%-8x\n",
502 count, current->poolSize + current->shadowSize, current->poolAddr, current->poolAddr + current->poolSize,
503 current->poolSize, current->shadowStart, current->shadowSize);
504 }
505
506 LMS_UNLOCK(intSave);
507}
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_lmsCheckPoolList
Definition: los_lms.c:66
UINT32 shadowSize
Definition: los_lms_pri.h:86
UINTPTR shadowStart
Definition: los_lms_pri.h:85
UINTPTR poolAddr
Definition: los_lms_pri.h:83
UINT32 poolSize
Definition: los_lms_pri.h:84

◆ OsLmsReportError()

VOID OsLmsReportError ( UINTPTR  p,
UINT32  size,
UINT32  errMod 
)

在文件 los_lms.c619 行定义.

620{
621 UINT32 intSave;
622 LmsAddrInfo info;
623
624 (VOID)LOS_AtomicAdd(&g_checkDepth, 1);
625 LMS_LOCK(intSave);
626 (VOID)memset(&info, 0, sizeof(LmsAddrInfo));
627
628 PRINT_ERR("***** Kernel Address Sanitizer Error Detected Start *****\n");
629
630 OsLmsGetErrorInfo(p, size, &info);
631
632 OsLmsPrintErrInfo(&info, errMod);
633
634 OsBackTrace();
635
637 LMS_UNLOCK(intSave);
638 PRINT_ERR("***** Kernel Address Sanitizer Error Detected End *****\n");
639 (VOID)LOS_AtomicSub(&g_checkDepth, 1);
640}
STATIC INLINE INT32 LOS_AtomicAdd(Atomic *v, INT32 addVal)
Atomic addition.
Definition: los_atomic.h:173
STATIC INLINE INT32 LOS_AtomicSub(Atomic *v, INT32 subVal)
Atomic subtraction.
Definition: los_atomic.h:217
VOID OsBackTrace(VOID)
Kernel backtrace function.
Definition: los_exc.c:1025
void * memset(void *addr, int c, size_t len)
Definition: lms_libc.c:36
STATIC VOID OsLmsPrintErrInfo(LmsAddrInfo *info, UINT32 errMod)
Definition: los_lms.c:580
VOID OsLmsPrintMemInfo(UINTPTR addr)
Definition: los_lms.c:509
STATIC Atomic g_checkDepth
Definition: los_lms.c:67
STATIC VOID OsLmsGetErrorInfo(UINTPTR addr, UINT32 size, LmsAddrInfo *info)
Definition: los_lms.c:569
UINTPTR memAddr
Definition: los_lms_pri.h:90
函数调用图:
这是这个函数的调用关系图:

◆ OsLmsSimpleMark()

VOID OsLmsSimpleMark ( UINTPTR  startAddr,
UINTPTR  endAddr,
UINT32  value 
)

在文件 los_lms.c318 行定义.

319{
320 UINT32 intSave;
321 if (endAddr <= startAddr) {
322 PRINT_DEBUG("[LMS]mark 0x%x, 0x%x, 0x%x\n", startAddr, endAddr, (UINTPTR)__builtin_return_address(0));
323 return;
324 }
325
326 if (!IS_ALIGNED(startAddr, OS_MEM_ALIGN_SIZE) || !IS_ALIGNED(endAddr, OS_MEM_ALIGN_SIZE)) {
327 PRINT_ERR("[LMS]mark addr is not aligned! 0x%x, 0x%x\n", startAddr, endAddr);
328 return;
329 }
330
331 LMS_LOCK(intSave);
332
333 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr(startAddr);
334 if (node == NULL) {
335 LMS_UNLOCK(intSave);
336 return;
337 }
338
339 OsLmsSetShadowValue(node, startAddr, endAddr, value);
340 LMS_UNLOCK(intSave);
341}
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ g_lms

LmsHook* g_lms
extern

在文件 los_lms.c68 行定义.