1*9f8e6353SEvgeniy Ivanov
2*9f8e6353SEvgeniy Ivanov #if HAVE_NBTOOL_CONFIG_H
3*9f8e6353SEvgeniy Ivanov #include "nbtool_config.h"
4*9f8e6353SEvgeniy Ivanov #endif
5*9f8e6353SEvgeniy Ivanov
6*9f8e6353SEvgeniy Ivanov #include <sys/cdefs.h>
7*9f8e6353SEvgeniy Ivanov #if !defined(__lint)
8*9f8e6353SEvgeniy Ivanov __RCSID("$NetBSD: ews4800mips.c,v 1.2 2006/02/18 10:08:07 dsl Exp $");
9*9f8e6353SEvgeniy Ivanov #endif /* !__lint */
10*9f8e6353SEvgeniy Ivanov
11*9f8e6353SEvgeniy Ivanov #include <sys/param.h>
12*9f8e6353SEvgeniy Ivanov #include <unistd.h>
13*9f8e6353SEvgeniy Ivanov #include <err.h>
14*9f8e6353SEvgeniy Ivanov #include <stdio.h>
15*9f8e6353SEvgeniy Ivanov #include "installboot.h"
16*9f8e6353SEvgeniy Ivanov
17*9f8e6353SEvgeniy Ivanov static int ews4800mips_setboot(ib_params *);
18*9f8e6353SEvgeniy Ivanov
19*9f8e6353SEvgeniy Ivanov struct ib_mach ib_mach_ews4800mips =
20*9f8e6353SEvgeniy Ivanov { "ews4800mips", ews4800mips_setboot, no_clearboot, no_editboot, 0};
21*9f8e6353SEvgeniy Ivanov
22*9f8e6353SEvgeniy Ivanov struct bbinfo_params ews4800mips_bbparams = {
23*9f8e6353SEvgeniy Ivanov EWS4800MIPS_BBINFO_MAGIC,
24*9f8e6353SEvgeniy Ivanov EWS4800MIPS_BOOT_BLOCK_OFFSET,
25*9f8e6353SEvgeniy Ivanov EWS4800MIPS_BOOT_BLOCK_BLOCKSIZE,
26*9f8e6353SEvgeniy Ivanov EWS4800MIPS_BOOT_BLOCK_MAX_SIZE,
27*9f8e6353SEvgeniy Ivanov 0,
28*9f8e6353SEvgeniy Ivanov BBINFO_BIG_ENDIAN,
29*9f8e6353SEvgeniy Ivanov };
30*9f8e6353SEvgeniy Ivanov
31*9f8e6353SEvgeniy Ivanov static int
ews4800mips_setboot(ib_params * params)32*9f8e6353SEvgeniy Ivanov ews4800mips_setboot(ib_params *params)
33*9f8e6353SEvgeniy Ivanov {
34*9f8e6353SEvgeniy Ivanov u_int8_t buf[EWS4800MIPS_BOOT_BLOCK_MAX_SIZE];
35*9f8e6353SEvgeniy Ivanov int rv;
36*9f8e6353SEvgeniy Ivanov
37*9f8e6353SEvgeniy Ivanov rv = pread(params->s1fd, buf, sizeof buf, 0);
38*9f8e6353SEvgeniy Ivanov if (rv == -1) {
39*9f8e6353SEvgeniy Ivanov warn("Reading `%s'", params->stage1);
40*9f8e6353SEvgeniy Ivanov return 0;
41*9f8e6353SEvgeniy Ivanov } else if (rv != sizeof buf) {
42*9f8e6353SEvgeniy Ivanov warnx("Reading `%s' : short read", params->stage1);
43*9f8e6353SEvgeniy Ivanov return 0;
44*9f8e6353SEvgeniy Ivanov }
45*9f8e6353SEvgeniy Ivanov
46*9f8e6353SEvgeniy Ivanov if (params->flags & IB_NOWRITE)
47*9f8e6353SEvgeniy Ivanov return 1;
48*9f8e6353SEvgeniy Ivanov
49*9f8e6353SEvgeniy Ivanov if (params->flags & IB_VERBOSE)
50*9f8e6353SEvgeniy Ivanov printf("Writing boot block\n");
51*9f8e6353SEvgeniy Ivanov
52*9f8e6353SEvgeniy Ivanov rv = pwrite(params->fsfd, buf, sizeof buf, 0);
53*9f8e6353SEvgeniy Ivanov if (rv == -1) {
54*9f8e6353SEvgeniy Ivanov warn("Writing `%s'", params->filesystem);
55*9f8e6353SEvgeniy Ivanov return 0;
56*9f8e6353SEvgeniy Ivanov } else if (rv != sizeof buf) {
57*9f8e6353SEvgeniy Ivanov warnx("Writing `%s': short write", params->filesystem);
58*9f8e6353SEvgeniy Ivanov return 0;
59*9f8e6353SEvgeniy Ivanov }
60*9f8e6353SEvgeniy Ivanov
61*9f8e6353SEvgeniy Ivanov return 1;
62*9f8e6353SEvgeniy Ivanov }
63