/* * p1_emm.c — проверка выделения трёх EMM-страниц и доступа через W3. */ #include #include #include #include #include #include "p1_platform.h" #define P1_PAGE_SIZE 0x4000u #define P1_BLOCK 64u static uint8_t write_buf[P1_BLOCK]; static uint8_t read_buf[P1_BLOCK]; static void make_pattern(uint8_t page_index, uint8_t salt) { uint8_t i; for (i = 0; i < P1_BLOCK; i++) { write_buf[i] = (uint8_t)(salt ^ (uint8_t)(page_index * 0x41u + i)); read_buf[i] = 0; } } static int check_region(uint8_t page, uint8_t page_index, uint16_t offset, uint8_t salt) { make_pattern(page_index, salt); bank_write(page, offset, write_buf, P1_BLOCK); bank_read(page, offset, read_buf, P1_BLOCK); if (memcmp(write_buf, read_buf, P1_BLOCK) != 0) { printf("Mismatch: logical=%u phys=%02X offset=%04X\n", (unsigned)page_index, (unsigned)page, (unsigned)offset); return -1; } return 0; } int p1_test_emm(void) { uint16_t total_before, free_before; uint16_t total_after, free_after; uint8_t block; uint8_t page[3]; uint8_t i; int failed = 0; p1_heading("EMM: 3-page allocation and W3 access"); errno = 0; mem_info(&total_before, &free_before); printf("Before: total=%u free=%u pages\n", (unsigned)total_before, (unsigned)free_before); block = mem_alloc_pages(3); if (block == 0) { printf("mem_alloc_pages(3) failed: errno=%d\n", errno); return -1; } printf("Block id: %u\n", (unsigned)block); for (i = 0; i < 3; i++) { page[i] = mem_get_page(block, i); printf(" logical %u -> physical %02X\n", (unsigned)i, (unsigned)page[i]); if (page[i] == 0) failed++; } if (page[0] == page[1] || page[0] == page[2] || page[1] == page[2]) { puts("Physical page numbers are not distinct."); failed++; } for (i = 0; i < 3; i++) { if (page[i] == 0) continue; if (check_region(page[i], i, 0, 0x5A) != 0) failed++; if (check_region(page[i], i, (uint16_t)(P1_PAGE_SIZE - P1_BLOCK), 0xA5) != 0) { failed++; } } mem_free_block(block); mem_info(&total_after, &free_after); printf("After : total=%u free=%u pages\n", (unsigned)total_after, (unsigned)free_after); if (total_before != total_after || free_before != free_after) { puts("EMM counters were not restored after free."); failed++; } printf("EMM checks failed: %u\n", (unsigned)failed); return failed ? -1 : 0; }