1 1.8 sevan /* $NetBSD: methods.c,v 1.8 2018/01/23 21:06:25 sevan Exp $ */ 2 1.1 minoura 3 1.1 minoura /*- 4 1.1 minoura * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 1.1 minoura * All rights reserved. 6 1.1 minoura * 7 1.1 minoura * This code is derived from software contributed to The NetBSD Foundation 8 1.1 minoura * by Minoura Makoto. 9 1.1 minoura * 10 1.1 minoura * Redistribution and use in source and binary forms, with or without 11 1.1 minoura * modification, are permitted provided that the following conditions 12 1.1 minoura * are met: 13 1.1 minoura * 1. Redistributions of source code must retain the above copyright 14 1.1 minoura * notice, this list of conditions and the following disclaimer. 15 1.1 minoura * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 minoura * notice, this list of conditions and the following disclaimer in the 17 1.1 minoura * documentation and/or other materials provided with the distribution. 18 1.1 minoura * 19 1.1 minoura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 minoura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 minoura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 minoura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 minoura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 minoura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 minoura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 minoura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 minoura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 minoura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 minoura * POSSIBILITY OF SUCH DAMAGE. 30 1.1 minoura */ 31 1.1 minoura 32 1.1 minoura #include <stdio.h> 33 1.1 minoura #include <string.h> 34 1.1 minoura #include <err.h> 35 1.1 minoura #include <sys/types.h> 36 1.1 minoura 37 1.1 minoura #include "memswitch.h" 38 1.2 minoura #include "methods.h" 39 1.1 minoura 40 1.1 minoura int 41 1.8 sevan atoi_(const char **p) 42 1.1 minoura { 43 1.2 minoura const char *p1 = *p; 44 1.1 minoura int v = 0; 45 1.1 minoura int first = 1; 46 1.1 minoura 47 1.1 minoura while (*p1 == ' ' || *p1 == '\t') 48 1.1 minoura p1++; 49 1.1 minoura 50 1.1 minoura if (*p1 == 0) { 51 1.1 minoura *p = 0; 52 1.1 minoura return 0; 53 1.1 minoura } 54 1.7 minoura if (strlen(p1) >= 2 && strncasecmp("0x", p1, 2) == 0) { 55 1.1 minoura p1 += 2; 56 1.1 minoura while (1) { 57 1.1 minoura if (*p1 >= '0' && *p1 <= '9') { 58 1.1 minoura v *= 16; 59 1.1 minoura v += *p1 - '0'; 60 1.1 minoura first = 0; 61 1.1 minoura } else if (*p1 >= 'A' && *p1 <= 'F') { 62 1.1 minoura v *= 16; 63 1.1 minoura v += *p1 - 'A' + 10; 64 1.1 minoura first = 0; 65 1.1 minoura } else if (*p1 >= 'a' && *p1 <= 'f') { 66 1.1 minoura v *= 16; 67 1.1 minoura v += *p1 - 'a' + 10; 68 1.1 minoura first = 0; 69 1.1 minoura } else { 70 1.1 minoura break; 71 1.1 minoura } 72 1.1 minoura p1++; 73 1.1 minoura } 74 1.1 minoura } else { 75 1.1 minoura while (1) { 76 1.1 minoura if (*p1 >= '0' && *p1 <= '9') { 77 1.1 minoura v *= 10; 78 1.1 minoura v += *p1 - '0'; 79 1.1 minoura first = 0; 80 1.1 minoura } else { 81 1.1 minoura break; 82 1.1 minoura } 83 1.1 minoura p1++; 84 1.1 minoura } 85 1.1 minoura } 86 1.1 minoura 87 1.1 minoura if (first) { 88 1.1 minoura *p = 0; 89 1.1 minoura return 0; 90 1.1 minoura } 91 1.1 minoura 92 1.3 minoura while (*p1 == ' ' || *p1 == '\t') p1++; 93 1.1 minoura *p = p1; 94 1.1 minoura return v; 95 1.1 minoura } 96 1.1 minoura 97 1.1 minoura int 98 1.8 sevan fill_uchar(struct property *prop) 99 1.1 minoura { 100 1.1 minoura if (current_values == 0) 101 1.7 minoura alloc_current_values(); 102 1.1 minoura 103 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset]; 104 1.1 minoura prop->current_value.byte[1] = 0; 105 1.1 minoura prop->current_value.byte[2] = 0; 106 1.1 minoura prop->current_value.byte[3] = 0; 107 1.1 minoura prop->value_valid = 1; 108 1.1 minoura 109 1.1 minoura return 0; 110 1.1 minoura } 111 1.1 minoura 112 1.1 minoura int 113 1.8 sevan fill_ushort(struct property *prop) 114 1.1 minoura { 115 1.1 minoura if (current_values == 0) 116 1.7 minoura alloc_current_values(); 117 1.1 minoura 118 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset]; 119 1.1 minoura prop->current_value.byte[1] = current_values[prop->offset+1]; 120 1.1 minoura prop->current_value.byte[2] = 0; 121 1.1 minoura prop->current_value.byte[3] = 0; 122 1.1 minoura prop->value_valid = 1; 123 1.1 minoura 124 1.1 minoura return 0; 125 1.1 minoura } 126 1.1 minoura 127 1.1 minoura int 128 1.8 sevan fill_ulong(struct property *prop) 129 1.1 minoura { 130 1.1 minoura if (current_values == 0) 131 1.7 minoura alloc_current_values(); 132 1.1 minoura 133 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset]; 134 1.1 minoura prop->current_value.byte[1] = current_values[prop->offset+1]; 135 1.1 minoura prop->current_value.byte[2] = current_values[prop->offset+2]; 136 1.1 minoura prop->current_value.byte[3] = current_values[prop->offset+3]; 137 1.1 minoura prop->value_valid = 1; 138 1.1 minoura 139 1.1 minoura return 0; 140 1.1 minoura } 141 1.1 minoura 142 1.1 minoura int 143 1.8 sevan flush_uchar(struct property *prop) 144 1.1 minoura { 145 1.1 minoura if (!prop->modified) 146 1.1 minoura return 0; 147 1.1 minoura 148 1.1 minoura if (modified_values == 0) 149 1.7 minoura alloc_modified_values(); 150 1.1 minoura 151 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0]; 152 1.1 minoura 153 1.1 minoura return 0; 154 1.1 minoura } 155 1.1 minoura 156 1.1 minoura int 157 1.8 sevan flush_ushort(struct property *prop) 158 1.1 minoura { 159 1.1 minoura if (!prop->modified) 160 1.1 minoura return 0; 161 1.1 minoura 162 1.1 minoura if (modified_values == 0) 163 1.7 minoura alloc_modified_values(); 164 1.1 minoura 165 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0]; 166 1.1 minoura modified_values[prop->offset+1] = prop->modified_value.byte[1]; 167 1.1 minoura 168 1.1 minoura return 0; 169 1.1 minoura } 170 1.1 minoura 171 1.1 minoura int 172 1.8 sevan flush_ulong(struct property *prop) 173 1.1 minoura { 174 1.1 minoura if (!prop->modified) 175 1.1 minoura return 0; 176 1.1 minoura 177 1.1 minoura if (modified_values == 0) 178 1.7 minoura alloc_modified_values(); 179 1.1 minoura 180 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0]; 181 1.1 minoura modified_values[prop->offset+1] = prop->modified_value.byte[1]; 182 1.1 minoura modified_values[prop->offset+2] = prop->modified_value.byte[2]; 183 1.1 minoura modified_values[prop->offset+3] = prop->modified_value.byte[3]; 184 1.1 minoura 185 1.1 minoura return 0; 186 1.1 minoura } 187 1.1 minoura 188 1.1 minoura int 189 1.8 sevan flush_dummy(struct property *prop) 190 1.1 minoura { 191 1.1 minoura return 0; 192 1.1 minoura } 193 1.1 minoura 194 1.1 minoura int 195 1.8 sevan parse_dummy(struct property *prop, const char *value) 196 1.1 minoura { 197 1.7 minoura warnx("Cannot modify %s.%s", prop->class, prop->node); 198 1.1 minoura 199 1.1 minoura return -1; 200 1.1 minoura } 201 1.1 minoura 202 1.1 minoura int 203 1.8 sevan parse_byte(struct property *prop, const char *value) 204 1.1 minoura { 205 1.1 minoura const char *p = value; 206 1.1 minoura int v; 207 1.1 minoura 208 1.7 minoura v = atoi_(&p); 209 1.1 minoura if (p == 0) { 210 1.7 minoura warnx("%s: Invalid value", value); 211 1.1 minoura return -1; 212 1.1 minoura } 213 1.1 minoura 214 1.7 minoura if (strcasecmp("MB", p) == 0) 215 1.1 minoura v *= 1024 * 1024; 216 1.7 minoura else if (strcasecmp("KB", p) == 0) 217 1.1 minoura v *= 1024; 218 1.1 minoura else if (*p != 0 && 219 1.7 minoura strcasecmp("B", p) != 0) { 220 1.7 minoura warnx("%s: Invalid value", value); 221 1.1 minoura return -1; 222 1.1 minoura } 223 1.1 minoura 224 1.1 minoura if (v < prop->min) { 225 1.7 minoura warnx("%s: Too small", value); 226 1.1 minoura return -1; 227 1.1 minoura } else if (v > prop->max) { 228 1.7 minoura warnx("%s: Too large", value); 229 1.1 minoura return -1; 230 1.1 minoura } 231 1.1 minoura 232 1.1 minoura prop->modified = 1; 233 1.1 minoura prop->modified_value.longword = v; 234 1.1 minoura 235 1.1 minoura return 0; 236 1.1 minoura } 237 1.1 minoura 238 1.1 minoura int 239 1.8 sevan parse_uchar(struct property *prop, const char *value) 240 1.1 minoura { 241 1.1 minoura const char *p = value; 242 1.1 minoura int v; 243 1.1 minoura 244 1.7 minoura v = atoi_(&p); 245 1.1 minoura if (p == 0) { 246 1.7 minoura warnx("%s: Invalid value", value); 247 1.1 minoura return -1; 248 1.1 minoura } 249 1.1 minoura 250 1.1 minoura if (v < prop->min) { 251 1.7 minoura warnx("%s: Too small", value); 252 1.1 minoura return -1; 253 1.1 minoura } else if (v > prop->max) { 254 1.7 minoura warnx("%s: Too large", value); 255 1.1 minoura return -1; 256 1.1 minoura } 257 1.1 minoura 258 1.1 minoura prop->modified = 1; 259 1.1 minoura prop->modified_value.byte[0] = v; 260 1.1 minoura 261 1.1 minoura return 0; 262 1.1 minoura } 263 1.1 minoura 264 1.1 minoura int 265 1.8 sevan parse_ulong(struct property *prop, const char *value) 266 1.1 minoura { 267 1.1 minoura const char *p = value; 268 1.1 minoura int v; 269 1.1 minoura 270 1.7 minoura v = atoi_(&p); 271 1.1 minoura if (p == 0) { 272 1.7 minoura warnx("%s: Invalid value", value); 273 1.1 minoura return -1; 274 1.1 minoura } 275 1.1 minoura 276 1.1 minoura if (v < prop->min) { 277 1.7 minoura warnx("%s: Too small", value); 278 1.1 minoura return -1; 279 1.1 minoura } else if (v > prop->max) { 280 1.7 minoura warnx("%s: Too large", value); 281 1.1 minoura return -1; 282 1.1 minoura } 283 1.1 minoura 284 1.1 minoura prop->modified = 1; 285 1.1 minoura prop->modified_value.longword = v; 286 1.1 minoura 287 1.1 minoura return 0; 288 1.1 minoura } 289 1.1 minoura 290 1.1 minoura int 291 1.8 sevan parse_ushort(struct property *prop, const char *value) 292 1.1 minoura { 293 1.1 minoura const char *p = value; 294 1.1 minoura int v; 295 1.1 minoura 296 1.7 minoura v = atoi_(&p); 297 1.1 minoura if (p == 0) { 298 1.7 minoura warnx("%s: Invalid value", value); 299 1.1 minoura return -1; 300 1.1 minoura } 301 1.1 minoura 302 1.1 minoura if (v < prop->min) { 303 1.7 minoura warnx("%s: Too small", value); 304 1.1 minoura return -1; 305 1.1 minoura } else if (v > prop->max) { 306 1.7 minoura warnx("%s: Too large", value); 307 1.1 minoura return -1; 308 1.1 minoura } 309 1.1 minoura 310 1.1 minoura prop->modified = 1; 311 1.1 minoura prop->modified_value.word[0] = v; 312 1.1 minoura 313 1.1 minoura return 0; 314 1.1 minoura } 315 1.1 minoura 316 1.1 minoura int 317 1.8 sevan parse_time(struct property *prop, const char *value) 318 1.1 minoura { 319 1.1 minoura const char *p = value; 320 1.1 minoura int v; 321 1.1 minoura 322 1.3 minoura while (*p == ' ' || *p == '\t') p++; 323 1.1 minoura if (*p == '-') { 324 1.1 minoura p++; 325 1.7 minoura v = -atoi_(&p); 326 1.1 minoura } else 327 1.7 minoura v = atoi_(&p); 328 1.1 minoura if (p == 0) { 329 1.7 minoura warnx("%s: Invalid value", value); 330 1.1 minoura return -1; 331 1.1 minoura } 332 1.1 minoura 333 1.7 minoura if (strcasecmp("hours", p) == 0 || strcasecmp("hour", p) == 0) 334 1.1 minoura v *= 60 * 60; 335 1.7 minoura else if (strcasecmp("minutes", p) == 0 || 336 1.7 minoura strcasecmp("minute", p) == 0) 337 1.1 minoura v *= 60; 338 1.1 minoura else if (*p != 0 && 339 1.7 minoura strcasecmp("second", p) != 0 && 340 1.7 minoura strcasecmp("seconds", p) != 0) { 341 1.7 minoura warnx("%s: Invalid value", value); 342 1.1 minoura return -1; 343 1.1 minoura } 344 1.1 minoura 345 1.1 minoura if (v < prop->min) { 346 1.7 minoura warnx("%s: Too small", value); 347 1.1 minoura return -1; 348 1.1 minoura } else if (v > prop->max) { 349 1.7 minoura warnx("%s: Too large", value); 350 1.1 minoura return -1; 351 1.1 minoura } 352 1.1 minoura 353 1.1 minoura prop->modified = 1; 354 1.1 minoura prop->modified_value.longword = v; 355 1.1 minoura 356 1.1 minoura return 0; 357 1.1 minoura } 358 1.1 minoura 359 1.1 minoura int 360 1.8 sevan parse_bootdev(struct property *prop, const char *value) 361 1.1 minoura { 362 1.1 minoura const char *p = value; 363 1.1 minoura int v; 364 1.4 minoura char expr_scsi[32]; 365 1.1 minoura 366 1.3 minoura while (*p == ' ' || *p == '\t') p++; 367 1.1 minoura 368 1.7 minoura if (strcasecmp("STD", p) == 0) 369 1.1 minoura v = 0; 370 1.7 minoura else if (strcasecmp("ROM", p) == 0) 371 1.1 minoura v = 0xa000; 372 1.7 minoura else if (strcasecmp("RAM", p) == 0) 373 1.1 minoura v = 0xb000; 374 1.7 minoura else if (strncasecmp("HD", p, 2) == 0) { 375 1.1 minoura p += 2; 376 1.7 minoura v = atoi_(&p); 377 1.1 minoura if (p == 0 || v < 0 || v > 15) { 378 1.7 minoura warnx("%s: Invalid value", value); 379 1.1 minoura return -1; 380 1.1 minoura } 381 1.1 minoura v *= 0x0100; 382 1.1 minoura v += 0x8000; 383 1.7 minoura } else if (strncasecmp("FD", p, 2) == 0) { 384 1.1 minoura p += 2; 385 1.7 minoura v = atoi_(&p); 386 1.1 minoura if (p == 0 || v < 0 || v > 3) { 387 1.7 minoura warnx("%s: Invalid value", value); 388 1.1 minoura return -1; 389 1.1 minoura } 390 1.1 minoura v *= 0x0100; 391 1.1 minoura v += 0x9070; 392 1.7 minoura } else if (strncasecmp("INSCSI", p, 6) == 0 || 393 1.7 minoura strncasecmp("EXSCSI", p, 6) == 0) { 394 1.7 minoura int isin = strncasecmp("EXSCSI", p, 6); 395 1.4 minoura 396 1.4 minoura p += 6; 397 1.7 minoura v = atoi_(&p); 398 1.4 minoura if (p == 0 || v < 0 || v > 7) { 399 1.7 minoura warnx("%s: Invalid value", value); 400 1.4 minoura return -1; 401 1.4 minoura } 402 1.4 minoura 403 1.4 minoura /* change boot.romaddr */ 404 1.4 minoura sprintf(expr_scsi, "boot.romaddr=0x%06x", 405 1.4 minoura (isin ? 0xfc0000 : 0xea0020) + v * 4); 406 1.4 minoura modify_single(expr_scsi); 407 1.4 minoura 408 1.4 minoura /* boot.device again */ 409 1.4 minoura v = 0xa000; 410 1.1 minoura } else { 411 1.7 minoura warnx("%s: Invalid value", value); 412 1.1 minoura return -1; 413 1.1 minoura } 414 1.1 minoura 415 1.1 minoura prop->modified = 1; 416 1.1 minoura prop->modified_value.word[0] = v; 417 1.1 minoura 418 1.1 minoura return 0; 419 1.1 minoura } 420 1.1 minoura 421 1.1 minoura int 422 1.8 sevan parse_serial(struct property *prop, const char *value) 423 1.3 minoura #define NEXTSPEC while (*p == ' ' || *p == '\t') p++; \ 424 1.3 minoura if (*p++ != ',') { \ 425 1.7 minoura warnx("%s: Invalid value", value); \ 426 1.3 minoura return -1; \ 427 1.3 minoura } \ 428 1.3 minoura while (*p == ' ' || *p == '\t') p++; 429 1.3 minoura { 430 1.3 minoura const char *p = value; 431 1.3 minoura const char *q; 432 1.3 minoura int baud, bit, parity, stop, flow; 433 1.5 yamt static const int bauds[] = {75, 150, 300, 600, 1200, 2400, 4800, 9600, 434 1.5 yamt 17361, 0}; 435 1.5 yamt static const char parities[] = "noe"; 436 1.3 minoura int i; 437 1.3 minoura 438 1.3 minoura while (*p == ' ' || *p == '\t') p++; 439 1.3 minoura 440 1.3 minoura /* speed */ 441 1.7 minoura baud = atoi_(&p); 442 1.3 minoura if (p == 0) { 443 1.7 minoura warnx("%s: Invalid value", value); 444 1.3 minoura return -1; 445 1.3 minoura } 446 1.3 minoura for (i = 0; bauds[i]; i++) 447 1.3 minoura if (baud == bauds[i]) 448 1.3 minoura break; 449 1.3 minoura if (bauds[i] == 0) { 450 1.7 minoura warnx("%d: Invalid speed", baud); 451 1.3 minoura return -1; 452 1.3 minoura } 453 1.3 minoura baud = i; 454 1.3 minoura 455 1.3 minoura NEXTSPEC; 456 1.3 minoura 457 1.3 minoura /* bit size */ 458 1.3 minoura if (*p < '5' || *p > '8') { 459 1.7 minoura warnx("%c: Invalid bit size", *p); 460 1.3 minoura return -1; 461 1.3 minoura } 462 1.3 minoura bit = *p++ - '5'; 463 1.3 minoura 464 1.3 minoura NEXTSPEC; 465 1.3 minoura 466 1.3 minoura /* parity */ 467 1.3 minoura q = strchr(parities, *p++); 468 1.3 minoura if (q == 0) { 469 1.7 minoura warnx("%c: Invalid parity spec", *p); 470 1.3 minoura return -1; 471 1.3 minoura } 472 1.3 minoura parity = q - parities; 473 1.3 minoura 474 1.3 minoura NEXTSPEC; 475 1.3 minoura 476 1.3 minoura /* stop bit */ 477 1.7 minoura if (strncmp(p, "1.5", 3) == 0) { 478 1.3 minoura stop = 2; 479 1.3 minoura p += 3; 480 1.7 minoura } else if (strncmp(p, "2", 1) == 0) { 481 1.3 minoura stop = 0; 482 1.3 minoura p++; 483 1.7 minoura } else if (strncmp(p, "1", 1) == 0) { 484 1.3 minoura stop = 1; 485 1.3 minoura p++; 486 1.3 minoura } else { 487 1.7 minoura warnx("%s: Invalid value", value); 488 1.3 minoura return -1; 489 1.3 minoura } 490 1.3 minoura 491 1.3 minoura NEXTSPEC; 492 1.3 minoura 493 1.3 minoura /* flow */ 494 1.3 minoura if (*p == '-') 495 1.3 minoura flow = 0; 496 1.3 minoura else if (*p == 's') 497 1.3 minoura flow = 1; 498 1.3 minoura else { 499 1.7 minoura warnx("%s: Invalid value", value); 500 1.3 minoura return -1; 501 1.3 minoura } 502 1.3 minoura 503 1.3 minoura p++; 504 1.3 minoura while (*p == ' ' || *p == '\t') p++; 505 1.3 minoura if (*p != 0) { 506 1.7 minoura warnx("%s: Invalid value", value); 507 1.3 minoura return -1; 508 1.3 minoura } 509 1.3 minoura 510 1.3 minoura prop->modified = 1; 511 1.3 minoura prop->modified_value.word[0] = ((stop << 14) + 512 1.3 minoura (parity << 12) + 513 1.3 minoura (bit << 10) + 514 1.3 minoura (flow << 9) + 515 1.3 minoura baud); 516 1.3 minoura 517 1.3 minoura return 0; 518 1.3 minoura } 519 1.3 minoura #undef NEXTSPEC 520 1.3 minoura 521 1.3 minoura int 522 1.8 sevan parse_srammode(struct property *prop, const char *value) 523 1.3 minoura { 524 1.5 yamt static const char *const sramstrs[] = {"unused", "SRAMDISK", "program"}; 525 1.3 minoura int i; 526 1.3 minoura 527 1.3 minoura for (i = 0; i <= 2; i++) { 528 1.7 minoura if (strcasecmp(value, sramstrs[i]) == 0) 529 1.3 minoura break; 530 1.3 minoura } 531 1.3 minoura if (i > 2) { 532 1.7 minoura warnx("%s: Invalid value", value); 533 1.3 minoura return -1; 534 1.3 minoura } 535 1.3 minoura 536 1.3 minoura prop->modified = 1; 537 1.3 minoura prop->modified_value.byte[0] = i; 538 1.3 minoura 539 1.3 minoura return 0; 540 1.3 minoura } 541 1.3 minoura 542 1.3 minoura int 543 1.8 sevan print_uchar(struct property *prop, char *str) 544 1.1 minoura { 545 1.1 minoura if (prop->modified) 546 1.7 minoura snprintf(str, MAXVALUELEN, 547 1.7 minoura "%d", prop->modified_value.byte[0]); 548 1.1 minoura else { 549 1.1 minoura if (!prop->value_valid) 550 1.7 minoura prop->fill(prop); 551 1.7 minoura snprintf(str, MAXVALUELEN, "%d", 552 1.7 minoura prop->current_value.byte[0]); 553 1.1 minoura } 554 1.1 minoura 555 1.1 minoura return 0; 556 1.1 minoura } 557 1.1 minoura 558 1.1 minoura int 559 1.8 sevan print_ucharh(struct property *prop, char *str) 560 1.1 minoura { 561 1.1 minoura if (prop->modified) 562 1.7 minoura snprintf(str, MAXVALUELEN, 563 1.7 minoura "0x%4.4x", prop->modified_value.byte[0]); 564 1.1 minoura else { 565 1.1 minoura if (!prop->value_valid) 566 1.7 minoura prop->fill(prop); 567 1.7 minoura snprintf(str, MAXVALUELEN, 568 1.7 minoura "0x%4.4x", prop->current_value.byte[0]); 569 1.1 minoura } 570 1.1 minoura 571 1.1 minoura return 0; 572 1.1 minoura } 573 1.1 minoura 574 1.1 minoura int 575 1.8 sevan print_ushorth(struct property *prop, char *str) 576 1.1 minoura { 577 1.1 minoura if (prop->modified) 578 1.7 minoura snprintf(str, MAXVALUELEN, 579 1.1 minoura "0x%4.4x", prop->modified_value.word[0]); 580 1.1 minoura else { 581 1.1 minoura if (!prop->value_valid) 582 1.7 minoura prop->fill(prop); 583 1.7 minoura snprintf(str, MAXVALUELEN, 584 1.7 minoura "0x%4.4x", prop->current_value.word[0]); 585 1.1 minoura } 586 1.1 minoura 587 1.1 minoura return 0; 588 1.1 minoura } 589 1.1 minoura 590 1.1 minoura int 591 1.8 sevan print_ulong(struct property *prop, char *str) 592 1.1 minoura { 593 1.1 minoura if (prop->modified) 594 1.7 minoura snprintf(str, MAXVALUELEN, 595 1.7 minoura "%ld", prop->modified_value.longword); 596 1.1 minoura else { 597 1.1 minoura if (!prop->value_valid) 598 1.7 minoura prop->fill(prop); 599 1.7 minoura snprintf(str, MAXVALUELEN, 600 1.7 minoura "%ld", prop->current_value.longword); 601 1.1 minoura } 602 1.1 minoura 603 1.1 minoura return 0; 604 1.1 minoura } 605 1.1 minoura 606 1.1 minoura int 607 1.8 sevan print_ulongh(struct property *prop, char *str) 608 1.1 minoura { 609 1.1 minoura if (prop->modified) 610 1.7 minoura snprintf(str, MAXVALUELEN, 611 1.7 minoura "0x%8.8lx", prop->modified_value.longword); 612 1.1 minoura else { 613 1.1 minoura if (!prop->value_valid) 614 1.7 minoura prop->fill(prop); 615 1.7 minoura snprintf(str, MAXVALUELEN, 616 1.7 minoura "0x%8.8lx", prop->current_value.longword); 617 1.1 minoura } 618 1.1 minoura 619 1.1 minoura return 0; 620 1.1 minoura } 621 1.1 minoura 622 1.1 minoura int 623 1.8 sevan print_magic(struct property *prop, char *str) 624 1.1 minoura { 625 1.1 minoura if (!prop->value_valid) 626 1.7 minoura prop->fill(prop); 627 1.7 minoura snprintf(str, MAXVALUELEN, "%c%c%c%c", 628 1.7 minoura prop->current_value.byte[0], 629 1.7 minoura prop->current_value.byte[1], 630 1.7 minoura prop->current_value.byte[2], 631 1.7 minoura prop->current_value.byte[3]); 632 1.1 minoura 633 1.1 minoura return 0; 634 1.1 minoura } 635 1.1 minoura 636 1.1 minoura int 637 1.8 sevan print_timesec(struct property *prop, char *str) 638 1.1 minoura { 639 1.1 minoura if (prop->modified) 640 1.7 minoura snprintf(str, MAXVALUELEN, 641 1.7 minoura "%ld second", prop->modified_value.longword); 642 1.1 minoura else { 643 1.1 minoura if (!prop->value_valid) 644 1.7 minoura prop->fill(prop); 645 1.7 minoura snprintf(str, MAXVALUELEN, 646 1.7 minoura "%ld second", prop->current_value.longword); 647 1.1 minoura } 648 1.1 minoura 649 1.1 minoura return 0; 650 1.1 minoura } 651 1.1 minoura 652 1.1 minoura int 653 1.8 sevan print_bootdev(struct property *prop, char *str) 654 1.1 minoura { 655 1.1 minoura unsigned int v; 656 1.1 minoura 657 1.1 minoura if (prop->modified) 658 1.1 minoura v = prop->modified_value.word[0]; 659 1.1 minoura else { 660 1.1 minoura if (!prop->value_valid) 661 1.7 minoura prop->fill(prop); 662 1.1 minoura v = prop->current_value.word[0]; 663 1.1 minoura } 664 1.1 minoura 665 1.1 minoura if (v == 0) 666 1.7 minoura strcpy(str, "STD"); 667 1.1 minoura else if (v == 0xa000) 668 1.7 minoura strcpy(str, "ROM"); 669 1.1 minoura else if (v == 0xb000) 670 1.7 minoura strcpy(str, "RAM"); 671 1.1 minoura else if (v >= 0x8000 && v < 0x9000) 672 1.7 minoura snprintf(str, MAXVALUELEN, "HD%d", (v & 0x0f00) >> 8); 673 1.1 minoura else if (v >= 0x9000 && v < 0xa000) 674 1.7 minoura snprintf(str, MAXVALUELEN, "FD%d", (v & 0x0f00) >> 8); 675 1.1 minoura else 676 1.7 minoura snprintf(str, MAXVALUELEN, "%8.8x", v); 677 1.3 minoura 678 1.3 minoura return 0; 679 1.3 minoura } 680 1.3 minoura 681 1.3 minoura int 682 1.8 sevan print_serial(struct property *prop, char *str) 683 1.3 minoura { 684 1.3 minoura unsigned int v; 685 1.4 minoura const char *baud, *stop; 686 1.4 minoura char bit, parity, flow; 687 1.5 yamt static const char *const bauds[] = {"75", "150", "300", "600", "1200", 688 1.4 minoura "2400", "4800", "9600", "17361"}; 689 1.5 yamt static const char bits[] = "5678"; 690 1.5 yamt static const char parities[] = "noen"; 691 1.5 yamt static const char *const stops[] = {"2", "1", "1.5", "2"}; 692 1.5 yamt static const char flows[] = "-s"; 693 1.3 minoura 694 1.3 minoura if (prop->modified) 695 1.3 minoura v = prop->modified_value.word[0]; 696 1.3 minoura else { 697 1.3 minoura if (!prop->value_valid) 698 1.7 minoura prop->fill(prop); 699 1.3 minoura v = prop->current_value.word[0]; 700 1.3 minoura } 701 1.3 minoura 702 1.3 minoura baud = bauds[v & 0x000f]; 703 1.3 minoura bit = bits[(v & 0x0c00) >> 10]; 704 1.3 minoura parity = parities[(v & 0x3000) >> 12]; 705 1.3 minoura stop = stops[(v & 0xe000) >> 14]; 706 1.3 minoura flow = flows[(v & 0x0200) >> 9]; 707 1.7 minoura sprintf(str, "%s,%c,%c,%s,%c", baud, bit, parity, stop, flow); 708 1.3 minoura 709 1.3 minoura return 0; 710 1.3 minoura } 711 1.3 minoura 712 1.3 minoura int 713 1.8 sevan print_srammode(struct property *prop, char *str) 714 1.3 minoura { 715 1.3 minoura int v; 716 1.5 yamt static const char *const sramstrs[] = {"unused", "SRAMDISK", "program"}; 717 1.3 minoura 718 1.3 minoura if (prop->modified) 719 1.3 minoura v = prop->modified_value.byte[0]; 720 1.3 minoura else { 721 1.3 minoura if (!prop->value_valid) 722 1.7 minoura prop->fill(prop); 723 1.3 minoura v = prop->current_value.byte[0]; 724 1.3 minoura } 725 1.3 minoura 726 1.3 minoura if (v < 0 || v > 2) 727 1.7 minoura strcpy(str, "INVALID"); 728 1.3 minoura else 729 1.7 minoura strcpy(str, sramstrs[v]); 730 1.1 minoura 731 1.1 minoura return 0; 732 1.1 minoura } 733