1*e5c09b19Sthorpej /* $NetBSD: x68k.c,v 1.5 2019/05/07 04:35:31 thorpej Exp $ */
253175db8Sisaki
353175db8Sisaki /*-
453175db8Sisaki * Copyright (c) 2002 The NetBSD Foundation, Inc.
553175db8Sisaki * All rights reserved.
653175db8Sisaki *
753175db8Sisaki * This code is derived from software contributed to The NetBSD Foundation
853175db8Sisaki * by Luke Mewburn of Wasabi Systems.
953175db8Sisaki *
1053175db8Sisaki * Redistribution and use in source and binary forms, with or without
1153175db8Sisaki * modification, are permitted provided that the following conditions
1253175db8Sisaki * are met:
1353175db8Sisaki * 1. Redistributions of source code must retain the above copyright
1453175db8Sisaki * notice, this list of conditions and the following disclaimer.
1553175db8Sisaki * 2. Redistributions in binary form must reproduce the above copyright
1653175db8Sisaki * notice, this list of conditions and the following disclaimer in the
1753175db8Sisaki * documentation and/or other materials provided with the distribution.
1853175db8Sisaki *
1953175db8Sisaki * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2053175db8Sisaki * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2153175db8Sisaki * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2253175db8Sisaki * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2353175db8Sisaki * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2453175db8Sisaki * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2553175db8Sisaki * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2653175db8Sisaki * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2753175db8Sisaki * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2853175db8Sisaki * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2953175db8Sisaki * POSSIBILITY OF SUCH DAMAGE.
3053175db8Sisaki */
3153175db8Sisaki
32171d6532Slukem #if HAVE_NBTOOL_CONFIG_H
33171d6532Slukem #include "nbtool_config.h"
3453175db8Sisaki #endif
3553175db8Sisaki
36171d6532Slukem #include <sys/cdefs.h>
37171d6532Slukem #if !defined(__lint)
38*e5c09b19Sthorpej __RCSID("$NetBSD: x68k.c,v 1.5 2019/05/07 04:35:31 thorpej Exp $");
39171d6532Slukem #endif /* !__lint */
40171d6532Slukem
4153175db8Sisaki #include <sys/param.h>
4253175db8Sisaki #include <sys/stat.h>
4353175db8Sisaki
4453175db8Sisaki #include <assert.h>
4553175db8Sisaki #include <err.h>
4653175db8Sisaki #include <stddef.h>
4753175db8Sisaki #include <stdio.h>
4853175db8Sisaki #include <stdlib.h>
4953175db8Sisaki #include <string.h>
5053175db8Sisaki #include <unistd.h>
5153175db8Sisaki
5253175db8Sisaki #include "installboot.h"
5353175db8Sisaki
5453175db8Sisaki #define X68K_LABELOFFSET 64
5553175db8Sisaki #define X68K_LABELSIZE 404 /* reserve 16 partitions */
5653175db8Sisaki
5753175db8Sisaki static int x68k_clearheader(ib_params *, struct bbinfo_params *, uint8_t *);
5853175db8Sisaki
59cce659e2Sdsl static int x68k_clearboot(ib_params *);
60cce659e2Sdsl static int x68k_setboot(ib_params *);
61cce659e2Sdsl
62*e5c09b19Sthorpej struct ib_mach ib_mach_x68k = {
63*e5c09b19Sthorpej .name = "x68k",
64*e5c09b19Sthorpej .setboot = x68k_setboot,
65*e5c09b19Sthorpej .clearboot = x68k_clearboot,
66*e5c09b19Sthorpej .editboot = no_editboot,
67*e5c09b19Sthorpej .valid_flags = IB_STAGE1START | IB_STAGE2START,
68*e5c09b19Sthorpej };
6953175db8Sisaki
7053175db8Sisaki static struct bbinfo_params bbparams = {
7153175db8Sisaki X68K_BBINFO_MAGIC,
7253175db8Sisaki X68K_BOOT_BLOCK_OFFSET,
7353175db8Sisaki X68K_BOOT_BLOCK_BLOCKSIZE,
7453175db8Sisaki X68K_BOOT_BLOCK_MAX_SIZE,
7553175db8Sisaki X68K_LABELOFFSET + X68K_LABELSIZE, /* XXX */
7653175db8Sisaki BBINFO_BIG_ENDIAN,
7753175db8Sisaki };
7853175db8Sisaki
79cce659e2Sdsl static int
x68k_clearboot(ib_params * params)8053175db8Sisaki x68k_clearboot(ib_params *params)
8153175db8Sisaki {
8253175db8Sisaki
8353175db8Sisaki assert(params != NULL);
8453175db8Sisaki
8553175db8Sisaki if (params->flags & IB_STAGE1START) {
8653175db8Sisaki warnx("`-b bno' is not supported for %s",
8753175db8Sisaki params->machine->name);
8853175db8Sisaki return 0;
8953175db8Sisaki }
9053175db8Sisaki return shared_bbinfo_clearboot(params, &bbparams, x68k_clearheader);
9153175db8Sisaki }
9253175db8Sisaki
9353175db8Sisaki static int
x68k_clearheader(ib_params * params,struct bbinfo_params * bb_params,uint8_t * bb)9453175db8Sisaki x68k_clearheader(ib_params *params, struct bbinfo_params *bb_params,
9553175db8Sisaki uint8_t *bb)
9653175db8Sisaki {
9753175db8Sisaki
9853175db8Sisaki assert(params != NULL);
9953175db8Sisaki assert(bb_params != NULL);
10053175db8Sisaki assert(bb != NULL);
10153175db8Sisaki
10253175db8Sisaki memset(bb, 0, X68K_LABELOFFSET);
10353175db8Sisaki return 1;
10453175db8Sisaki }
10553175db8Sisaki
106cce659e2Sdsl static int
x68k_setboot(ib_params * params)10753175db8Sisaki x68k_setboot(ib_params *params)
10853175db8Sisaki {
10953175db8Sisaki struct stat bootstrapsb;
11053175db8Sisaki char bb[X68K_BOOT_BLOCK_MAX_SIZE];
11153175db8Sisaki char label[X68K_LABELSIZE];
11253175db8Sisaki uint32_t s1start;
11353175db8Sisaki int retval;
11453175db8Sisaki ssize_t rv;
11553175db8Sisaki
11653175db8Sisaki assert(params != NULL);
11753175db8Sisaki assert(params->fsfd != -1);
11853175db8Sisaki assert(params->filesystem != NULL);
11953175db8Sisaki assert(params->s1fd != -1);
12053175db8Sisaki assert(params->stage1 != NULL);
12153175db8Sisaki
12253175db8Sisaki retval = 0;
12353175db8Sisaki
12453175db8Sisaki if (params->flags & IB_STAGE1START)
12553175db8Sisaki s1start = params->s1start;
12653175db8Sisaki else
12753175db8Sisaki s1start = X68K_BOOT_BLOCK_OFFSET /
12853175db8Sisaki X68K_BOOT_BLOCK_BLOCKSIZE;
12953175db8Sisaki
13053175db8Sisaki /* read disklabel on the target disk */
13153175db8Sisaki rv = pread(params->fsfd, label, sizeof label,
13253175db8Sisaki s1start * X68K_BOOT_BLOCK_BLOCKSIZE + X68K_LABELOFFSET);
13353175db8Sisaki if (rv == -1) {
13453175db8Sisaki warn("Reading `%s'", params->filesystem);
13553175db8Sisaki goto done;
13653175db8Sisaki } else if (rv != sizeof label) {
13753175db8Sisaki warnx("Reading `%s': short read", params->filesystem);
13853175db8Sisaki goto done;
13953175db8Sisaki }
14053175db8Sisaki
14153175db8Sisaki if (fstat(params->s1fd, &bootstrapsb) == -1) {
14253175db8Sisaki warn("Examining `%s'", params->stage1);
14353175db8Sisaki goto done;
14453175db8Sisaki }
14553175db8Sisaki if (!S_ISREG(bootstrapsb.st_mode)) {
14653175db8Sisaki warnx("`%s' must be a regular file", params->stage1);
14753175db8Sisaki goto done;
14853175db8Sisaki }
14953175db8Sisaki
15053175db8Sisaki /* read boot loader */
15153175db8Sisaki memset(&bb, 0, sizeof bb);
15253175db8Sisaki rv = read(params->s1fd, &bb, sizeof bb);
15353175db8Sisaki if (rv == -1) {
15453175db8Sisaki warn("Reading `%s'", params->stage1);
15553175db8Sisaki goto done;
15653175db8Sisaki }
15753175db8Sisaki /* then, overwrite disklabel */
15853175db8Sisaki memcpy(&bb[X68K_LABELOFFSET], &label, sizeof label);
15953175db8Sisaki
16053175db8Sisaki if (params->flags & IB_VERBOSE) {
16153175db8Sisaki printf("Bootstrap start sector: %#x\n", s1start);
16253175db8Sisaki printf("Bootstrap byte count: %#x\n", (unsigned)rv);
16353175db8Sisaki printf("%sriting bootstrap\n",
16453175db8Sisaki (params->flags & IB_NOWRITE) ? "Not w" : "W");
16553175db8Sisaki }
16653175db8Sisaki if (params->flags & IB_NOWRITE) {
16753175db8Sisaki retval = 1;
16853175db8Sisaki goto done;
16953175db8Sisaki }
17053175db8Sisaki
17153175db8Sisaki /* write boot loader and disklabel into the target disk */
17253175db8Sisaki rv = pwrite(params->fsfd, &bb, X68K_BOOT_BLOCK_MAX_SIZE,
17353175db8Sisaki s1start * X68K_BOOT_BLOCK_BLOCKSIZE);
17453175db8Sisaki if (rv == -1) {
17553175db8Sisaki warn("Writing `%s'", params->filesystem);
17653175db8Sisaki goto done;
17753175db8Sisaki } else if (rv != X68K_BOOT_BLOCK_MAX_SIZE) {
17853175db8Sisaki warnx("Writing `%s': short write", params->filesystem);
17953175db8Sisaki goto done;
18053175db8Sisaki } else
18153175db8Sisaki retval = 1;
18253175db8Sisaki
18353175db8Sisaki done:
18453175db8Sisaki return (retval);
18553175db8Sisaki }
186