xref: /minix3/usr.sbin/installboot/arch/ews4800mips.c (revision 9f8e6353e54579f3834bed052b7960946fc4bb01)
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