Skip to content

Commit

Permalink
Latest RM0630-2130-0.102.4-54e7e3e on PATREON & GitHub - LOADER FIX
Browse files Browse the repository at this point in the history
  • Loading branch information
RogueMaster committed Jul 1, 2024
1 parent 7f2f243 commit 79ab298
Show file tree
Hide file tree
Showing 21 changed files with 152 additions and 468 deletions.
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,3 @@
[submodule "lib/uzlib"]
path = lib/uzlib
url = https://github.com/pfalcon/uzlib.git
[submodule "lib/tlsf"]
path = lib/tlsf
url = https://github.com/espressif/tlsf
2 changes: 1 addition & 1 deletion .pvsoptions
Original file line number Diff line number Diff line change
@@ -1 +1 @@
--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/tlsf -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/*
--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/*
1 change: 1 addition & 0 deletions ReadMe.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ This software is for experimental purposes only and is not meant for any illegal
- Incremented FW Version to 0.103.2 with OFW
- NFC: [Parser for CSC Service Works Reloadable Cash Card (By zinongli)](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/commit/fa9b702dc24f3c892798dec86e4f5f25443432c2)
- Added: [Tasks v1.0 (By MadLadSquad)](https://github.com/MadLadSquad/FlipperTasks)
- [Fix Loader for Main Menu (By RogueMaster)](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/commit/)

<a name="release">

Expand Down
257 changes: 0 additions & 257 deletions applications/debug/unit_tests/tests/furi/furi_memmgr_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,260 +37,3 @@ void test_furi_memmgr(void) {
}
free(ptr);
}

static void test_memmgr_malloc(const size_t allocation_size) {
uint8_t* ptr = NULL;
const char* error_message = NULL;

FURI_CRITICAL_ENTER();

ptr = malloc(allocation_size);

// test that we can allocate memory
if(ptr == NULL) {
error_message = "malloc failed";
}

// test that memory is zero-initialized after allocation
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] != 0) {
error_message = "memory is not zero-initialized after malloc";
break;
}
}
memset(ptr, 0x55, allocation_size);
free(ptr);

// test that memory is zero-initialized after free
// we know that allocator can use this memory for inner purposes
// so we check that memory at least partially zero-initialized

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuse-after-free"

size_t zero_count = 0;
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] == 0) {
zero_count++;
}
}

#pragma GCC diagnostic pop

// check that at least 75% of memory is zero-initialized
if(zero_count < (allocation_size * 0.75)) {
error_message = "seems that memory is not zero-initialized after free (malloc)";
}

FURI_CRITICAL_EXIT();

if(error_message != NULL) {
mu_fail(error_message);
}
}

static void test_memmgr_realloc(const size_t allocation_size) {
uint8_t* ptr = NULL;
const char* error_message = NULL;

FURI_CRITICAL_ENTER();

ptr = realloc(ptr, allocation_size);

// test that we can allocate memory
if(ptr == NULL) {
error_message = "realloc(NULL) failed";
}

// test that memory is zero-initialized after allocation
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] != 0) {
error_message = "memory is not zero-initialized after realloc(NULL)";
break;
}
}

memset(ptr, 0x55, allocation_size);

ptr = realloc(ptr, allocation_size * 2);

// test that we can reallocate memory
if(ptr == NULL) {
error_message = "realloc failed";
}

// test that memory content is preserved
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] != 0x55) {
error_message = "memory is not reallocated after realloc";
break;
}
}

// test that remaining memory is zero-initialized
size_t non_zero_count = 0;
for(size_t i = allocation_size; i < allocation_size * 2; i++) {
if(ptr[i] != 0) {
non_zero_count += 1;
}
}

// check that at most of memory is zero-initialized
// we know that allocator not always can restore content size from a pointer
// so we check against small threshold
if(non_zero_count > 4) {
error_message = "seems that memory is not zero-initialized after realloc";
}

uint8_t* null_ptr = realloc(ptr, 0);

// test that we can free memory
if(null_ptr != NULL) {
error_message = "realloc(0) failed";
}

// test that memory is zero-initialized after realloc(0)
// we know that allocator can use this memory for inner purposes
// so we check that memory at least partially zero-initialized

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuse-after-free"

size_t zero_count = 0;
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] == 0) {
zero_count++;
}
}

#pragma GCC diagnostic pop

// check that at least 75% of memory is zero-initialized
if(zero_count < (allocation_size * 0.75)) {
error_message = "seems that memory is not zero-initialized after realloc(0)";
}

FURI_CRITICAL_EXIT();

if(error_message != NULL) {
mu_fail(error_message);
}
}

static void test_memmgr_alloc_aligned(const size_t allocation_size, const size_t alignment) {
uint8_t* ptr = NULL;
const char* error_message = NULL;

FURI_CRITICAL_ENTER();

ptr = aligned_alloc(alignment, allocation_size);

// test that we can allocate memory
if(ptr == NULL) {
error_message = "aligned_alloc failed";
}

// test that memory is aligned
if(((uintptr_t)ptr % alignment) != 0) {
error_message = "memory is not aligned after aligned_alloc";
}

// test that memory is zero-initialized after allocation
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] != 0) {
error_message = "memory is not zero-initialized after aligned_alloc";
break;
}
}
memset(ptr, 0x55, allocation_size);
free(ptr);

// test that memory is zero-initialized after free
// we know that allocator can use this memory for inner purposes
// so we check that memory at least partially zero-initialized

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuse-after-free"

size_t zero_count = 0;
for(size_t i = 0; i < allocation_size; i++) {
if(ptr[i] == 0) {
zero_count++;
}
}

#pragma GCC diagnostic pop

// check that at least 75% of memory is zero-initialized
if(zero_count < (allocation_size * 0.75)) {
error_message = "seems that memory is not zero-initialized after free (aligned_alloc)";
}

FURI_CRITICAL_EXIT();

if(error_message != NULL) {
mu_fail(error_message);
}
}

void test_furi_memmgr_advanced(void) {
const size_t sizes[] = {50, 100, 500, 1000, 5000, 10000};
const size_t sizes_count = sizeof(sizes) / sizeof(sizes[0]);
const size_t alignments[] = {4, 8, 16, 32, 64, 128, 256, 512, 1024};
const size_t alignments_count = sizeof(alignments) / sizeof(alignments[0]);

// do test without memory fragmentation
{
for(size_t i = 0; i < sizes_count; i++) {
test_memmgr_malloc(sizes[i]);
}

for(size_t i = 0; i < sizes_count; i++) {
test_memmgr_realloc(sizes[i]);
}

for(size_t i = 0; i < sizes_count; i++) {
for(size_t j = 0; j < alignments_count; j++) {
test_memmgr_alloc_aligned(sizes[i], alignments[j]);
}
}
}

// do test with memory fragmentation
{
void* blocks[sizes_count];
void* guards[sizes_count - 1];

// setup guards
for(size_t i = 0; i < sizes_count; i++) {
blocks[i] = malloc(sizes[i]);
if(i < sizes_count - 1) {
guards[i] = malloc(sizes[i]);
}
}

for(size_t i = 0; i < sizes_count; i++) {
free(blocks[i]);
}

// do test
for(size_t i = 0; i < sizes_count; i++) {
test_memmgr_malloc(sizes[i]);
}

for(size_t i = 0; i < sizes_count; i++) {
test_memmgr_realloc(sizes[i]);
}

for(size_t i = 0; i < sizes_count; i++) {
for(size_t j = 0; j < alignments_count; j++) {
test_memmgr_alloc_aligned(sizes[i], alignments[j]);
}
}

// cleanup guards
for(size_t i = 0; i < sizes_count - 1; i++) {
free(guards[i]);
}
}
}
1 change: 0 additions & 1 deletion applications/debug/unit_tests/tests/furi/furi_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ MU_TEST(mu_test_furi_memmgr) {
// this test is not accurate, but gives a basic understanding
// that memory management is working fine
test_furi_memmgr();
test_furi_memmgr_advanced();
}

MU_TEST(mu_test_furi_event_loop) {
Expand Down
2 changes: 1 addition & 1 deletion applications/main/nfc/application.fam
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ App(
targets=["f7"],
entry_point="nfc_app",
icon="A_NFC_14",
stack_size=5 * 1024,
stack_size=6 * 1024,
order=30,
resources="resources",
sources=[
Expand Down
Loading

0 comments on commit 79ab298

Please sign in to comment.