blob: 3d299ddbf04572577362a215cd0bb464213cc545 [file] [log] [blame]
Andrew Jeffery4fe996c2018-02-27 12:16:48 +10301// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2018 IBM Corp.
Andrew Jefferyf37ae022017-04-12 14:21:37 +09303
4#include <assert.h>
5#include <stdarg.h>
6#include <stdlib.h>
7#include <stdio.h>
Andrew Jeffery26558db2018-08-10 00:22:38 +09308#include <string.h>
Andrew Jefferyf37ae022017-04-12 14:21:37 +09309#include <sys/ioctl.h>
10#include <unistd.h>
11
12#include <linux/types.h>
13
Andrew Jeffery26558db2018-08-10 00:22:38 +093014#include "common.h"
15#include "mboxd.h"
Andrew Jefferyeebc6bd2018-08-08 10:38:19 +093016#include "flash.h"
Andrew Jefferyf37ae022017-04-12 14:21:37 +093017
18#include "test/tmpf.h"
19
20static struct tmpf mtd;
21
22void cleanup_mtd(void)
23{
24 tmpf_destroy(&mtd);
25}
26
27char *get_dev_mtd(void)
28{
29 int rc;
30
Andrew Jefferyc3144042018-02-26 13:24:52 +103031 rc = tmpf_init(&mtd, "flash-store.XXXXXX");
Andrew Jefferyf37ae022017-04-12 14:21:37 +093032 if (rc < 0)
33 return NULL;
34
35 return strdup(mtd.path);
36}
37
38struct erase_info_user *recorded;
39int n_ioctls;
40
41#define MEM_SIZE 3
42#define ERASE_SIZE 1
43
44int ioctl(int fd, unsigned long request, ...)
45{
46 va_list ap;
47 struct erase_info_user *provided, *alloced;
48
49 if (!(request == MEMERASE || request == MEMGETINFO)) {
50 printf("Uh-oh: ioctl() called with request 0x%08lx\n", request);
51 return -1;
52 }
53
54 switch (request) {
55 case MEMGETINFO:
56 {
57 struct mtd_info_user *info;
58
59 va_start(ap, request);
60 info = va_arg(ap, struct mtd_info_user *);
61 info->size = MEM_SIZE;
62 info->erasesize = ERASE_SIZE;
63 va_end(ap);
64 break;
65 }
66 case MEMERASE:
67 va_start(ap, request);
68 provided = va_arg(ap, struct erase_info_user *);
69
70 n_ioctls++;
71
72 alloced = realloc(recorded, n_ioctls * sizeof(*recorded));
73 if (!alloced)
74 return -1;
75 recorded = alloced;
76
77 memcpy(&recorded[n_ioctls - 1], provided, sizeof(*provided));
78
79 va_end(ap);
80 break;
81 default:
82 break;
83 }
84
85 return 0;
86}
87
88void dump_ioctls(void)
89{
90 int i;
91
92 printf("n_ioctls: %d\n", n_ioctls);
93
94 for (i = 0; i < n_ioctls; i++)
95 printf("%d: start: %d, length %d\n",
96 i, recorded[i].start, recorded[i].length);
97}
98
99int main(void)
100{
101 struct mbox_context context;
102 char data[MEM_SIZE];
103 int rc;
104
105 rc = atexit(cleanup_mtd);
106 if (rc)
107 return rc;
108
Suraj Jitindar Singh6f3197d2017-05-03 16:57:25 +1000109 mbox_vlog = &mbox_log_console;
110
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930111 n_ioctls = 0;
112 recorded = NULL;
113
Andrew Jefferyd6b09bc2018-08-08 16:47:54 +0930114 flash_dev_init(&context);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930115
116 /* Erase from an unknown state */
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930117 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930118
119 assert(rc == 0);
120 assert(n_ioctls == 1);
121 assert(recorded[0].start == 0);
122 assert(recorded[0].length == sizeof(data));
123
124 free(recorded);
125 recorded = NULL;
126 n_ioctls = 0;
127
128 /* Erase an erased flash */
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930129 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930130
131 assert(rc == 0);
132 assert(n_ioctls == 0);
133
134 memset(data, 0xaa, sizeof(data));
135
136 /* Erase written flash */
Andrew Jeffery0293f2f2018-08-08 16:59:45 +0930137 rc = flash_write(&context, 0, data, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930138 assert(rc == 0);
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930139 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930140
141 assert(rc == 0);
142 assert(n_ioctls == 1);
143 assert(recorded[0].start == 0);
144 assert(recorded[0].length == sizeof(data));
145
146 free(recorded);
147 recorded = NULL;
148 n_ioctls = 0;
149
150 /* Erase the start of flash */
Andrew Jeffery0293f2f2018-08-08 16:59:45 +0930151 rc = flash_write(&context, 0, data, sizeof(data) - 1);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930152 assert(rc == 0);
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930153 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930154
155 assert(rc == 0);
156 assert(n_ioctls == 1);
157 assert(recorded[0].start == 0);
158 assert(recorded[0].length == sizeof(data) - 1);
159
160 free(recorded);
161 recorded = NULL;
162 n_ioctls = 0;
163
164 /* Erase the end of flash */
Andrew Jeffery0293f2f2018-08-08 16:59:45 +0930165 rc = flash_write(&context, 1, data, sizeof(data) - 1);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930166 assert(rc == 0);
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930167 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930168
169 assert(rc == 0);
170 assert(n_ioctls == 1);
171 assert(recorded[0].start == 1);
172 assert(recorded[0].length == sizeof(data) - 1);
173
174 free(recorded);
175 recorded = NULL;
176 n_ioctls = 0;
177
178 /* Erase each end of flash */
Andrew Jeffery0293f2f2018-08-08 16:59:45 +0930179 rc = flash_write(&context, 0, data, 1);
180 rc = flash_write(&context, 2, data, 1);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930181 assert(rc == 0);
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930182 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930183
184 assert(rc == 0);
185 assert(n_ioctls == 2);
186 assert(recorded[0].start == 0);
187 assert(recorded[0].length == 1);
188 assert(recorded[1].start == 2);
189 assert(recorded[1].length == 1);
190
191 free(recorded);
192 recorded = NULL;
193 n_ioctls = 0;
194
195 /* Erase the middle of flash */
Andrew Jeffery0293f2f2018-08-08 16:59:45 +0930196 rc = flash_write(&context, 1, data, 1);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930197 assert(rc == 0);
Andrew Jeffery4f5d29c2018-08-08 16:58:04 +0930198 rc = flash_erase(&context, 0, sizeof(data));
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930199
200 assert(rc == 0);
201 assert(n_ioctls == 1);
202 assert(recorded[0].start == 1);
203 assert(recorded[0].length == 1);
204
205 free(recorded);
206 recorded = NULL;
207 n_ioctls = 0;
208
Andrew Jefferydec6ca62018-08-08 16:49:43 +0930209 flash_dev_free(&context);
Andrew Jefferyf37ae022017-04-12 14:21:37 +0930210
211 return rc;
212}