coredump:Add a coreudmp api to watch custom variables

Signed-off-by: anjiahao <anjiahao@xiaomi.com>
This commit is contained in:
anjiahao 2024-07-04 15:02:17 +08:00 committed by Xiang Xiao
parent 60796a7063
commit f2bdfa43e1
2 changed files with 85 additions and 0 deletions

View File

@ -42,6 +42,16 @@
int coredump_set_memory_region(FAR const struct memory_region_s *region);
/****************************************************************************
* Name: coredump_add_memory_region
*
* Description:
* Use coredump to dump the memory of the specified area.
*
****************************************************************************/
int coredump_add_memory_region(FAR const void *ptr, size_t size);
/****************************************************************************
* Name: coredump_initialize
*

View File

@ -181,6 +181,81 @@ int coredump_set_memory_region(FAR const struct memory_region_s *region)
return 0;
}
/****************************************************************************
* Name: coredump_add_memory_region
*
* Description:
* Use coredump to dump the memory of the specified area.
*
****************************************************************************/
int coredump_add_memory_region(FAR const void *ptr, size_t size)
{
FAR struct memory_region_s *region;
size_t count = 1; /* 1 for end flag */
if (g_regions != NULL)
{
region = (FAR struct memory_region_s *)g_regions;
while (region->start != 0)
{
if ((uintptr_t)ptr >= region->start &&
(uintptr_t)ptr + size < region->end)
{
/* Already watched */
return 0;
}
else if ((uintptr_t)ptr < region->end &&
(uintptr_t)ptr + size >= region->end)
{
/* start in region, end out of region */
region->end = (uintptr_t)ptr + size;
return 0;
}
else if ((uintptr_t)ptr < region->start &&
(uintptr_t)ptr + size >= region->start)
{
/* start out of region, end in region */
region->start = (uintptr_t)ptr;
return 0;
}
else if ((uintptr_t)ptr < region->start &&
(uintptr_t)ptr + size >= region->end)
{
/* start out of region, end out of region */
region->start = (uintptr_t)ptr;
region->end = (uintptr_t)ptr + size;
return 0;
}
count++;
region++;
}
/* Need a new region */
}
region = lib_realloc((FAR void *)g_regions,
sizeof(struct memory_region_s) * (count + 1));
if (region == NULL)
{
return -ENOMEM;
}
region[count - 1].start = (uintptr_t)ptr;
region[count - 1].end = (uintptr_t)ptr + size;
region[count - 1].flags = 0;
region[count].start = 0;
g_regions = region;
return 0;
}
/****************************************************************************
* Name: coredump_initialize
*