#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if !defined(__lint)
__RCSID("$NetBSD: news.c,v 1.8 2019/05/07 04:35:31 thorpej Exp $");
#endif
#include <sys/param.h>
#include <assert.h>
#include <err.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "installboot.h"
static int news_copydisklabel(ib_params *, struct bbinfo_params *, uint8_t *);
static int news68k_clearboot(ib_params *);
static int news68k_setboot(ib_params *);
static int newsmips_clearboot(ib_params *);
static int newsmips_setboot(ib_params *);
struct ib_mach ib_mach_news68k = {
.name = "news68k",
.setboot = news68k_setboot,
.clearboot = news68k_clearboot,
.editboot = no_editboot,
.valid_flags = IB_STAGE2START,
};
struct ib_mach ib_mach_newsmips = {
.name = "newsmips",
.setboot = newsmips_setboot,
.clearboot = newsmips_clearboot,
.editboot = no_editboot,
.valid_flags = IB_STAGE2START,
};
static struct bbinfo_params news68k_bbparams = {
NEWS68K_BBINFO_MAGIC,
NEWS_BOOT_BLOCK_OFFSET,
NEWS_BOOT_BLOCK_BLOCKSIZE,
NEWS_BOOT_BLOCK_MAX_SIZE,
0,
BBINFO_BIG_ENDIAN,
};
static int
news68k_clearboot(ib_params *params)
{
assert(params != NULL);
return (shared_bbinfo_clearboot(params, &news68k_bbparams,
news_copydisklabel));
}
static int
news68k_setboot(ib_params *params)
{
assert(params != NULL);
return (shared_bbinfo_setboot(params, &news68k_bbparams,
news_copydisklabel));
}
static struct bbinfo_params newsmips_bbparams = {
NEWSMIPS_BBINFO_MAGIC,
NEWS_BOOT_BLOCK_OFFSET,
NEWS_BOOT_BLOCK_BLOCKSIZE,
NEWS_BOOT_BLOCK_MAX_SIZE,
0,
BBINFO_BIG_ENDIAN,
};
static int
newsmips_clearboot(ib_params *params)
{
assert(params != NULL);
return (shared_bbinfo_clearboot(params, &newsmips_bbparams,
news_copydisklabel));
}
static int
newsmips_setboot(ib_params *params)
{
assert(params != NULL);
return (shared_bbinfo_setboot(params, &newsmips_bbparams,
news_copydisklabel));
}
static int
news_copydisklabel(ib_params *params, struct bbinfo_params *bbparams,
uint8_t *bb)
{
uint8_t boot00[NEWS_BOOT_BLOCK_BLOCKSIZE];
ssize_t rv;
assert(params != NULL);
assert(params->fsfd != -1);
assert(bbparams != NULL);
assert(bb != NULL);
memset(boot00, 0, sizeof(boot00));
rv = pread(params->fsfd, boot00, sizeof(boot00), 0);
if (rv == -1) {
warn("Reading label sector from `%s'", params->filesystem);
return (0);
}
memcpy(bb + NEWS_BOOT_BLOCK_LABELOFFSET,
boot00 + NEWS_BOOT_BLOCK_LABELOFFSET,
sizeof(boot00) - NEWS_BOOT_BLOCK_LABELOFFSET);
return (1);
}