1*1a03647eSAndrew Jeffery /* 2*1a03647eSAndrew Jeffery * MBox Daemon Test File 3*1a03647eSAndrew Jeffery * 4*1a03647eSAndrew Jeffery * Copyright 2017 IBM 5*1a03647eSAndrew Jeffery * 6*1a03647eSAndrew Jeffery * Licensed under the Apache License, Version 2.0 (the "License"); 7*1a03647eSAndrew Jeffery * you may not use this file except in compliance with the License. 8*1a03647eSAndrew Jeffery * You may obtain a copy of the License at 9*1a03647eSAndrew Jeffery * 10*1a03647eSAndrew Jeffery * http://www.apache.org/licenses/LICENSE-2.0 11*1a03647eSAndrew Jeffery * 12*1a03647eSAndrew Jeffery * Unless required by applicable law or agreed to in writing, software 13*1a03647eSAndrew Jeffery * distributed under the License is distributed on an "AS IS" BASIS, 14*1a03647eSAndrew Jeffery * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*1a03647eSAndrew Jeffery * See the License for the specific language governing permissions and 16*1a03647eSAndrew Jeffery * limitations under the License. 17*1a03647eSAndrew Jeffery * 18*1a03647eSAndrew Jeffery */ 19*1a03647eSAndrew Jeffery 20*1a03647eSAndrew Jeffery #include <assert.h> 21*1a03647eSAndrew Jeffery #include <sys/mman.h> 22*1a03647eSAndrew Jeffery 23*1a03647eSAndrew Jeffery #include "mbox.h" 24*1a03647eSAndrew Jeffery #include "mboxd_msg.h" 25*1a03647eSAndrew Jeffery 26*1a03647eSAndrew Jeffery #include "test/mbox.h" 27*1a03647eSAndrew Jeffery #include "test/system.h" 28*1a03647eSAndrew Jeffery 29*1a03647eSAndrew Jeffery static const uint8_t get_info[] = { 30*1a03647eSAndrew Jeffery 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 31*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 32*1a03647eSAndrew Jeffery }; 33*1a03647eSAndrew Jeffery 34*1a03647eSAndrew Jeffery static const uint8_t create_write_window[] = { 35*1a03647eSAndrew Jeffery 0x06, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 36*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 37*1a03647eSAndrew Jeffery }; 38*1a03647eSAndrew Jeffery 39*1a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_middle[] = { 40*1a03647eSAndrew Jeffery 0x07, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 41*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 42*1a03647eSAndrew Jeffery }; 43*1a03647eSAndrew Jeffery 44*1a03647eSAndrew Jeffery static const uint8_t write_flush[] = { 45*1a03647eSAndrew Jeffery 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 47*1a03647eSAndrew Jeffery }; 48*1a03647eSAndrew Jeffery 49*1a03647eSAndrew Jeffery static const uint8_t response[] = { 50*1a03647eSAndrew Jeffery 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 52*1a03647eSAndrew Jeffery }; 53*1a03647eSAndrew Jeffery 54*1a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_left[] = { 55*1a03647eSAndrew Jeffery 0x07, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 56*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 57*1a03647eSAndrew Jeffery }; 58*1a03647eSAndrew Jeffery 59*1a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_right[] = { 60*1a03647eSAndrew Jeffery 0x07, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 61*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 62*1a03647eSAndrew Jeffery }; 63*1a03647eSAndrew Jeffery 64*1a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_all[] = { 65*1a03647eSAndrew Jeffery 0x07, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 66*1a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 67*1a03647eSAndrew Jeffery }; 68*1a03647eSAndrew Jeffery 69*1a03647eSAndrew Jeffery const uint8_t start_data[] = { 0xaa, 0x55, 0xaa }; 70*1a03647eSAndrew Jeffery const uint8_t flush_middle_data[] = { 0xaa, 0x00, 0xaa }; 71*1a03647eSAndrew Jeffery const uint8_t flush_ends_data[] = { 0x55, 0x00, 0x55 }; 72*1a03647eSAndrew Jeffery const uint8_t flush_all_data[] = { 0x01, 0x02, 0x03 }; 73*1a03647eSAndrew Jeffery 74*1a03647eSAndrew Jeffery #define MEM_SIZE sizeof(start_data) 75*1a03647eSAndrew Jeffery #define ERASE_SIZE 1 76*1a03647eSAndrew Jeffery #define N_WINDOWS 1 77*1a03647eSAndrew Jeffery #define WINDOW_SIZE sizeof(start_data) 78*1a03647eSAndrew Jeffery 79*1a03647eSAndrew Jeffery int main(void) 80*1a03647eSAndrew Jeffery { 81*1a03647eSAndrew Jeffery struct mbox_context *ctx; 82*1a03647eSAndrew Jeffery uint8_t *map; 83*1a03647eSAndrew Jeffery int rc; 84*1a03647eSAndrew Jeffery 85*1a03647eSAndrew Jeffery system_set_reserved_size(MEM_SIZE); 86*1a03647eSAndrew Jeffery system_set_mtd_sizes(MEM_SIZE, ERASE_SIZE); 87*1a03647eSAndrew Jeffery 88*1a03647eSAndrew Jeffery ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE); 89*1a03647eSAndrew Jeffery rc = mbox_set_mtd_data(ctx, start_data, sizeof(start_data)); 90*1a03647eSAndrew Jeffery assert(rc == 0); 91*1a03647eSAndrew Jeffery 92*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info)); 93*1a03647eSAndrew Jeffery assert(rc == 1); 94*1a03647eSAndrew Jeffery 95*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, create_write_window, 96*1a03647eSAndrew Jeffery sizeof(create_write_window)); 97*1a03647eSAndrew Jeffery assert(rc == 1); 98*1a03647eSAndrew Jeffery 99*1a03647eSAndrew Jeffery /* { clean, dirty, clean } */ 100*1a03647eSAndrew Jeffery 101*1a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[1] = 0x00; 102*1a03647eSAndrew Jeffery 103*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_middle, 104*1a03647eSAndrew Jeffery sizeof(mark_write_dirty_middle)); 105*1a03647eSAndrew Jeffery assert(rc == 1); 106*1a03647eSAndrew Jeffery 107*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 108*1a03647eSAndrew Jeffery assert(rc == 1); 109*1a03647eSAndrew Jeffery 110*1a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 111*1a03647eSAndrew Jeffery assert(rc == 0); 112*1a03647eSAndrew Jeffery 113*1a03647eSAndrew Jeffery map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, 114*1a03647eSAndrew Jeffery ctx->fds[MTD_FD].fd, 0); 115*1a03647eSAndrew Jeffery assert(map != MAP_FAILED); 116*1a03647eSAndrew Jeffery 117*1a03647eSAndrew Jeffery rc = memcmp(flush_middle_data, map, sizeof(flush_middle_data)); 118*1a03647eSAndrew Jeffery assert(rc == 0); 119*1a03647eSAndrew Jeffery 120*1a03647eSAndrew Jeffery /* { dirty, clean, dirty } */ 121*1a03647eSAndrew Jeffery 122*1a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[0] = 0x55; 123*1a03647eSAndrew Jeffery 124*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_left, 125*1a03647eSAndrew Jeffery sizeof(mark_write_dirty_left)); 126*1a03647eSAndrew Jeffery assert(rc == 1); 127*1a03647eSAndrew Jeffery 128*1a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[2] = 0x55; 129*1a03647eSAndrew Jeffery 130*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_right, 131*1a03647eSAndrew Jeffery sizeof(mark_write_dirty_right)); 132*1a03647eSAndrew Jeffery assert(rc == 1); 133*1a03647eSAndrew Jeffery 134*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 135*1a03647eSAndrew Jeffery assert(rc == 1); 136*1a03647eSAndrew Jeffery 137*1a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 138*1a03647eSAndrew Jeffery assert(rc == 0); 139*1a03647eSAndrew Jeffery 140*1a03647eSAndrew Jeffery rc = memcmp(flush_ends_data, map, sizeof(flush_ends_data)); 141*1a03647eSAndrew Jeffery assert(rc == 0); 142*1a03647eSAndrew Jeffery 143*1a03647eSAndrew Jeffery /* { dirty, dirty, dirty } */ 144*1a03647eSAndrew Jeffery 145*1a03647eSAndrew Jeffery memcpy(ctx->mem, flush_all_data, sizeof(flush_all_data)); 146*1a03647eSAndrew Jeffery 147*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_all, 148*1a03647eSAndrew Jeffery sizeof(mark_write_dirty_all)); 149*1a03647eSAndrew Jeffery assert(rc == 1); 150*1a03647eSAndrew Jeffery 151*1a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 152*1a03647eSAndrew Jeffery assert(rc == 1); 153*1a03647eSAndrew Jeffery 154*1a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 155*1a03647eSAndrew Jeffery assert(rc == 0); 156*1a03647eSAndrew Jeffery 157*1a03647eSAndrew Jeffery rc = memcmp(flush_all_data, map, sizeof(flush_all_data)); 158*1a03647eSAndrew Jeffery assert(rc == 0); 159*1a03647eSAndrew Jeffery 160*1a03647eSAndrew Jeffery return rc; 161*1a03647eSAndrew Jeffery }; 162