Module Name: src
Committed By: martin
Date: Mon Jan 20 21:26:35 UTC 2020
Modified Files:
src/usr.sbin/sysinst: README.md_defs bsddisklabel.c defs.h disklabel.c
mbr.c part_edit.c util.c
src/usr.sbin/sysinst/arch/evbarm: md.c md.h
Log Message:
First try to bring evbarm installation closer to current reality.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/sysinst/README.md_defs
cvs rdiff -u -r1.35 -r1.36 src/usr.sbin/sysinst/bsddisklabel.c
cvs rdiff -u -r1.51 -r1.52 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/sysinst/disklabel.c
cvs rdiff -u -r1.28 -r1.29 src/usr.sbin/sysinst/mbr.c
cvs rdiff -u -r1.14 -r1.15 src/usr.sbin/sysinst/part_edit.c
cvs rdiff -u -r1.40 -r1.41 src/usr.sbin/sysinst/util.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/arch/evbarm/md.c
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/sysinst/arch/evbarm/md.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/sysinst/README.md_defs
diff -u src/usr.sbin/sysinst/README.md_defs:1.3 src/usr.sbin/sysinst/README.md_defs:1.4
--- src/usr.sbin/sysinst/README.md_defs:1.3 Tue Dec 10 06:25:50 2019
+++ src/usr.sbin/sysinst/README.md_defs Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: README.md_defs,v 1.3 2019/12/10 06:25:50 isaki Exp $ */
+/* $NetBSD: README.md_defs,v 1.4 2020/01/20 21:26:35 martin Exp $ */
The following is trying to document the most important machine dependent
defines used in the sysinst code.
@@ -71,6 +71,24 @@ used like:
returns true if this setup needs boot blocks. Used for example on x86
when UEFI installs do not need any bootblocks, but BIOS ones do.
+MD_MAY_SWAP_TO may be undefined
+
+used like:
+
+ bool MD_MAY_SWAP_TO(const char *disk_name)
+
+returns true if the disk is usable as a swap device. Typical implementation
+in utils.c:may_swap_if_not_sdmmc.
+
+MD_SET_EXTRACT_FINALIZE may be undefined
+
+used like:
+
+ int MD_SET_EXTRACT_FINALIZE(int update)
+
+extracts any additional parts of the distribution. Returns an error code
+if something fails.
+
HAVE_PLAIN_DISKLABEL_BOOT may be undefined, only used on architectures
that have MBR as primary with disklabel as
@@ -90,3 +108,9 @@ If defined, do not verify the presence o
offering the disklabel partitioning scheme. This allows ports to use
kernel translation for the disklabel ioctls (e.g. x68k uses Human68k
partitions this way).
+
+
+HAVE_GPT_BOOT defined if the architecture can boot from GPT
+
+NO_DISKLABEL_BOOT defined if the architecture can NOT boot
+ from a disklabel partitioned disk
Index: src/usr.sbin/sysinst/bsddisklabel.c
diff -u src/usr.sbin/sysinst/bsddisklabel.c:1.35 src/usr.sbin/sysinst/bsddisklabel.c:1.36
--- src/usr.sbin/sysinst/bsddisklabel.c:1.35 Thu Jan 16 16:47:19 2020
+++ src/usr.sbin/sysinst/bsddisklabel.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: bsddisklabel.c,v 1.35 2020/01/16 16:47:19 martin Exp $ */
+/* $NetBSD: bsddisklabel.c,v 1.36 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -949,10 +949,28 @@ fill_defaults(struct partition_usage_set
for (i = 0; i < wanted->num; i++) {
wanted->infos[i].parts = parts;
wanted->infos[i].cur_part_id = NO_PART;
+ if (wanted->infos[i].type == PT_undef &&
+ wanted->infos[i].fs_type != FS_UNUSED) {
+ const struct part_type_desc *pt =
+ parts->pscheme->get_fs_part_type(PT_undef,
+ wanted->infos[i].fs_type,
+ wanted->infos[i].fs_version);
+ if (pt != NULL)
+ wanted->infos[i].type = pt->generic_ptype;
+ }
+ if (wanted->parts->parent != NULL &&
+ wanted->infos[i].fs_type == FS_MSDOS)
+ wanted->infos[i].flags |=
+ PUIFLG_ADD_INNER|PUIFLAG_ADD_OUTER;
#if DEFSWAPSIZE == -1
- if (wanted->infos[i].type == PT_swap)
- wanted->infos[i].size = get_ramsize() * (MEG / 512);
+ if (wanted->infos[i].type == PT_swap) {
+#ifdef MD_MAY_SWAP_TO
+ if (MD_MAY_SWAP_TO(wanted->parts->disk))
+#endif
+ wanted->infos[i].size =
+ get_ramsize() * (MEG / 512);
+ }
#endif
if (wanted->infos[i].type == PT_swap && swap > wanted->num)
swap = i;
@@ -988,7 +1006,8 @@ fill_defaults(struct partition_usage_set
* empty disk. Merge the partitions in target range that are already
* there (match with wanted) or are there additionaly.
* The only thing outside of target range that we care for
- * is a potential swap partition - we assume one is enough.
+ * are FAT partitions and a potential swap partition - we assume one
+ * is enough.
*/
size_t num = wanted->num;
if (parts->parent) {
@@ -998,7 +1017,8 @@ fill_defaults(struct partition_usage_set
if (!parts->parent->pscheme->get_part_info(
parts->parent, pno, &info))
continue;
- if (info.nat_type->generic_ptype != PT_swap)
+ if (info.nat_type->generic_ptype != PT_swap &&
+ info.fs_type != FS_MSDOS)
continue;
merge_part_with_wanted(parts->parent, pno, &info,
wanted, num, true);
@@ -1297,16 +1317,16 @@ apply_settings_to_partitions(struct pm_d
if ((wanted->infos[i].flags & PUIFLAG_EXTEND) &&
exp_ndx == ~0U)
exp_ndx = i;
- if (wanted->infos[i].flags &
- (PUIFLG_JUST_MOUNTPOINT|PUIFLG_IS_OUTER))
+ if (wanted->infos[i].flags & PUIFLG_JUST_MOUNTPOINT)
continue;
nsp = wanted->infos[i].size;
if (wanted->infos[i].cur_part_id != NO_PART) {
ps = wanted->infos[i].flags & PUIFLG_IS_OUTER ?
parts->parent : parts;
- if (ps->pscheme->get_part_info(ps,
- wanted->infos[i].cur_part_id, &infos[i]))
+ ps->pscheme->get_part_info(ps,
+ wanted->infos[i].cur_part_id, &infos[i]);
+ if (!(wanted->infos[i].flags & PUIFLG_IS_OUTER))
nsp -= infos[i].size;
}
if (nsp > 0)
@@ -1343,9 +1363,11 @@ apply_settings_to_partitions(struct pm_d
infos[i].start);
if (free_size < wanted->infos[i].size)
continue;
- infos[i].size = wanted->infos[i].size;
- ps->pscheme->set_part_info(ps, want->cur_part_id,
- &infos[i], NULL);
+ if (infos[i].size != wanted->infos[i].size) {
+ infos[i].size = wanted->infos[i].size;
+ ps->pscheme->set_part_info(ps, want->cur_part_id,
+ &infos[i], NULL);
+ }
}
from = -1;
@@ -1488,7 +1510,7 @@ apply_settings_to_partitions(struct pm_d
for (i = 0; i < wanted->num; i++) {
struct part_usage_info *want = &wanted->infos[i];
- if (want->cur_part_id != NO_PART)
+ if (want->cur_part_id == NO_PART)
continue;
if (want->flags & PUIFLG_JUST_MOUNTPOINT)
continue;
@@ -1522,6 +1544,13 @@ apply_settings_to_partitions(struct pm_d
wanted->parts->pscheme->get_part_info(
wanted->parts, new_part_id, &infos[i]);
+ want->parts = wanted->parts;
+ if (want->fs_type != FS_UNUSED &&
+ want->type != PT_swap) {
+ want->instflags |= PUIINST_NEWFS;
+ if (want->mount[0] != 0)
+ want->instflags |= PUIINST_MOUNT;
+ }
}
/*
Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.51 src/usr.sbin/sysinst/defs.h:1.52
--- src/usr.sbin/sysinst/defs.h:1.51 Thu Jan 16 16:47:19 2020
+++ src/usr.sbin/sysinst/defs.h Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: defs.h,v 1.51 2020/01/16 16:47:19 martin Exp $ */
+/* $NetBSD: defs.h,v 1.52 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -789,6 +789,7 @@ int get_via_localdir(void);
void show_cur_distsets(void);
void make_ramdisk_dir(const char *);
void set_kernel_set(unsigned int);
+void set_noextract_set(unsigned int);
unsigned int get_kernel_set(void);
unsigned int set_X11_selected(void);
int get_and_unpack_sets(int, msg, msg, msg);
@@ -811,7 +812,10 @@ const char *set_dir_for_set(const char *
const char *ext_dir_for_set(const char *);
void replace(const char *, const char *, ...) __printflike(2, 3);
void get_tz_default(void);
+distinfo* get_set_distinfo(int);
int extract_file(distinfo *, int);
+int extract_file_to(distinfo *dist, int update, const char *dest_dir,
+ const char *extr_pattern, bool do_stats);
void do_coloring (unsigned int, unsigned int);
int set_menu_select(menudesc *, void *);
const char *safectime(time_t *);
@@ -823,6 +827,7 @@ void free_usage_set(struct partition_usa
bool install_desc_from_parts(struct install_partition_desc *,
struct disk_partitions*);
void free_install_desc(struct install_partition_desc*);
+bool may_swap_if_not_sdmmc(const char*);
/* from target.c */
#if defined(DEBUG) || defined(DEBUG_ROOT)
Index: src/usr.sbin/sysinst/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.30 src/usr.sbin/sysinst/disklabel.c:1.31
--- src/usr.sbin/sysinst/disklabel.c:1.30 Wed Jan 15 19:36:30 2020
+++ src/usr.sbin/sysinst/disklabel.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: disklabel.c,v 1.30 2020/01/15 19:36:30 martin Exp $ */
+/* $NetBSD: disklabel.c,v 1.31 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@@ -123,6 +123,13 @@ disklabel_cylinder_size(const struct dis
return parts->l.d_secpercyl;
}
+static bool
+disklabel_non_bootable(const char *disk)
+{
+
+ return false;
+}
+
static struct disk_partitions *
disklabel_parts_new(const char *dev, daddr_t start, daddr_t len,
daddr_t total_size, bool is_boot_drive, struct disk_partitions *parent)
@@ -1221,6 +1228,9 @@ disklabel_parts = {
.write_to_disk = disklabel_write_to_disk,
.read_from_disk = disklabel_parts_read,
.create_new_for_disk = disklabel_parts_new,
+#ifdef NO_DISKLABEL_BOOT
+ .have_boot_support = disklabel_non_bootable,
+#endif
.change_disk_geom = disklabel_change_geom,
.get_cylinder_size = disklabel_cylinder_size,
.find_by_name = disklabel_find_by_name,
Index: src/usr.sbin/sysinst/mbr.c
diff -u src/usr.sbin/sysinst/mbr.c:1.28 src/usr.sbin/sysinst/mbr.c:1.29
--- src/usr.sbin/sysinst/mbr.c:1.28 Sat Jan 18 18:39:55 2020
+++ src/usr.sbin/sysinst/mbr.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: mbr.c,v 1.28 2020/01/18 18:39:55 martin Exp $ */
+/* $NetBSD: mbr.c,v 1.29 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -1017,6 +1017,10 @@ mbr_map_part_type(unsigned int t)
switch (t) {
case MBR_PTYPE_FAT32:
case MBR_PTYPE_FAT32L:
+ case MBR_PTYPE_FAT16S:
+ case MBR_PTYPE_FAT16B:
+ case MBR_PTYPE_FAT16L:
+ case MBR_PTYPE_FAT12:
case MBR_PTYPE_FT_FAT32:
case MBR_PTYPE_FT_FAT32_EXT:
return PT_FAT;
Index: src/usr.sbin/sysinst/part_edit.c
diff -u src/usr.sbin/sysinst/part_edit.c:1.14 src/usr.sbin/sysinst/part_edit.c:1.15
--- src/usr.sbin/sysinst/part_edit.c:1.14 Thu Jan 9 13:22:30 2020
+++ src/usr.sbin/sysinst/part_edit.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: part_edit.c,v 1.14 2020/01/09 13:22:30 martin Exp $ */
+/* $NetBSD: part_edit.c,v 1.15 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -973,6 +973,10 @@ parts_use_wholedisk(struct disk_partitio
1, info.size, align, -1, -1) != 1)
return false;
info.start = space.start;
+ if (info.nat_type == NULL)
+ info.nat_type = parts->pscheme->
+ get_fs_part_type(PT_undef, info.fs_type,
+ info.fs_sub_type);
if (parts->pscheme->add_partition(parts, &info, NULL)
== NO_PART)
return false;
Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.40 src/usr.sbin/sysinst/util.c:1.41
--- src/usr.sbin/sysinst/util.c:1.40 Sat Nov 16 21:25:14 2019
+++ src/usr.sbin/sysinst/util.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: util.c,v 1.40 2019/11/16 21:25:14 martin Exp $ */
+/* $NetBSD: util.c,v 1.41 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -59,6 +59,9 @@
#include "defsizes.h"
#include "msg_defs.h"
#include "menu_defs.h"
+#ifdef MD_MAY_SWAP_TO
+#include <sys/drvctlio.h>
+#endif
#define MAX_CD_DEVS 256 /* how many cd drives do we expect to attach */
#define ISO_BLKSIZE ISO_DEFAULT_BLOCK_SIZE
@@ -71,6 +74,7 @@ static uint8_t set_status[SET_GROUP_END]
#define SET_SELECTED 0x02
#define SET_SKIPPED 0x04
#define SET_INSTALLED 0x08
+#define SET_NO_EXTRACT 0x10
struct tarstats {
int nselected;
@@ -721,6 +725,13 @@ set_kernel_set(unsigned int kernel_set)
set_status[kernel_set] |= SET_SELECTED;
}
+void
+set_noextract_set(unsigned int set)
+{
+
+ set_status[set] |= SET_NO_EXTRACT;
+}
+
static int
set_toggle(menudesc *menu, void *arg)
{
@@ -907,6 +918,23 @@ customise_sets(void)
int
extract_file(distinfo *dist, int update)
{
+ const char *dest_dir = NULL;
+
+ if (update && (dist->set == SET_ETC || dist->set == SET_X11_ETC)) {
+ dest_dir = "/.sysinst";
+ make_target_dir(dest_dir);
+ } else if (dist->set == SET_PKGSRC)
+ dest_dir = "/usr";
+ else
+ dest_dir = "/";
+
+ return extract_file_to(dist, update, dest_dir, NULL, true);
+}
+
+int
+extract_file_to(distinfo *dist, int update, const char *dest_dir,
+ const char *extr_pattern, bool do_stats)
+{
char path[STRSIZE];
char *owd;
int rval;
@@ -942,7 +970,8 @@ extract_file(distinfo *dist, int update)
if (!file_exists_p(path)) {
#endif /* SUPPORT_8_3_SOURCE_FILESYSTEM */
- tarstats.nnotfound++;
+ if (do_stats)
+ tarstats.nnotfound++;
char *err = str_arg_subst(msg_string(MSG_notarfile),
1, &dist->name);
@@ -955,15 +984,10 @@ extract_file(distinfo *dist, int update)
}
#endif /* SUPPORT_8_3_SOURCE_FILESYSTEM */
- tarstats.nfound++;
+ if (do_stats)
+ tarstats.nfound++;
/* cd to the target root. */
- if (update && (dist->set == SET_ETC || dist->set == SET_X11_ETC)) {
- make_target_dir("/.sysinst");
- target_chdir_or_die("/.sysinst");
- } else if (dist->set == SET_PKGSRC)
- target_chdir_or_die("/usr");
- else
- target_chdir_or_die("/");
+ target_chdir_or_die(dest_dir);
/*
* /usr/X11R7/lib/X11/xkb/symbols/pc was a directory in 5.0
@@ -974,16 +998,24 @@ extract_file(distinfo *dist, int update)
run_program(0, "rm -rf usr/X11R7/lib/X11/xkb/symbols/pc");
/* now extract set files into "./". */
- rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
- "progress -zf %s tar --chroot "
- TAR_EXTRACT_FLAGS " -", path);
+ if (extr_pattern != NULL) {
+ rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
+ "progress -zf %s tar --chroot "
+ TAR_EXTRACT_FLAGS " - '%s'",
+ path, extr_pattern);
+ } else {
+ rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
+ "progress -zf %s tar --chroot "
+ TAR_EXTRACT_FLAGS " -", path);
+ }
chdir(owd);
free(owd);
/* Check rval for errors and give warning. */
if (rval != 0) {
- tarstats.nerror++;
+ if (do_stats)
+ tarstats.nerror++;
msg_fmt_display(MSG_tarerror, "%s", path);
hit_enter_to_continue(NULL, NULL);
return SET_RETRY;
@@ -995,7 +1027,8 @@ extract_file(distinfo *dist, int update)
}
set_status[dist->set] |= SET_INSTALLED;
- tarstats.nsuccess++;
+ if (do_stats)
+ tarstats.nsuccess++;
return SET_OK;
}
@@ -1020,6 +1053,27 @@ skip_set(distinfo *dist, int skip_type)
}
}
+distinfo*
+get_set_distinfo(int opt)
+{
+ distinfo *dist;
+ int set;
+
+ for (dist = dist_list; (set = dist->set) != SET_LAST; dist++) {
+ if (set != opt)
+ continue;
+ if (dist->name == NULL)
+ continue;
+ if ((set_status[set] & (SET_VALID | SET_SELECTED))
+ != (SET_VALID | SET_SELECTED))
+ continue;
+ return dist;
+ }
+
+ return NULL;
+}
+
+
/*
* Get and unpack the distribution.
* Show success_msg if installation completes.
@@ -1047,6 +1101,8 @@ get_and_unpack_sets(int update, msg setu
for (dist = dist_list; (set = dist->set) != SET_LAST; dist++) {
if (dist->name == NULL)
continue;
+ if (set_status[set] & SET_NO_EXTRACT)
+ continue;
if ((set_status[set] & (SET_VALID | SET_SELECTED))
== (SET_VALID | SET_SELECTED))
tarstats.nselected++;
@@ -1090,12 +1146,19 @@ get_and_unpack_sets(int update, msg setu
}
}
+ if (set_status[set] & SET_NO_EXTRACT)
+ continue;
+
/* Try to extract this set */
status = extract_file(dist, update);
if (status == SET_RETRY)
dist--;
}
+#ifdef MD_SET_EXTRACT_FINALIZE
+ MD_SET_EXTRACT_FINALIZE(update);
+#endif
+
if (tarstats.nerror == 0 && tarstats.nsuccess == tarstats.nselected) {
msg_display(MSG_endtarok);
/* Give user a chance to see the success message */
@@ -2126,3 +2189,59 @@ free_install_desc(struct install_partiti
free(install->infos);
}
+#ifdef MD_MAY_SWAP_TO
+bool
+may_swap_if_not_sdmmc(const char *disk)
+{
+ int fd, res;
+ prop_dictionary_t command_dict, args_dict, results_dict, data_dict;
+ prop_string_t string;
+ prop_number_t number;
+ const char *parent = "";
+
+ fd = open(DRVCTLDEV, O_RDONLY, 0);
+ if (fd == -1)
+ return true;
+
+ command_dict = prop_dictionary_create();
+ args_dict = prop_dictionary_create();
+
+ string = prop_string_create_cstring_nocopy("get-properties");
+ prop_dictionary_set(command_dict, "drvctl-command", string);
+ prop_object_release(string);
+
+ string = prop_string_create_cstring(disk);
+ prop_dictionary_set(args_dict, "device-name", string);
+ prop_object_release(string);
+
+ prop_dictionary_set(command_dict, "drvctl-arguments",
+ args_dict);
+ prop_object_release(args_dict);
+
+ res = prop_dictionary_sendrecv_ioctl(command_dict, fd,
+ DRVCTLCOMMAND, &results_dict);
+ prop_object_release(command_dict);
+ close(fd);
+ if (res)
+ return true;
+
+ number = prop_dictionary_get(results_dict, "drvctl-error");
+ if (prop_number_integer_value(number) == 0) {
+ data_dict = prop_dictionary_get(results_dict,
+ "drvctl-result-data");
+ if (data_dict != NULL) {
+ string = prop_dictionary_get(data_dict,
+ "device-parent");
+ if (string != NULL)
+ parent = prop_string_cstring_nocopy(string);
+ }
+ }
+
+ prop_object_release(results_dict);
+
+ if (parent == NULL)
+ return true;
+
+ return strncmp(parent, "sdmmc", 5) != 0;
+}
+#endif
Index: src/usr.sbin/sysinst/arch/evbarm/md.c
diff -u src/usr.sbin/sysinst/arch/evbarm/md.c:1.12 src/usr.sbin/sysinst/arch/evbarm/md.c:1.13
--- src/usr.sbin/sysinst/arch/evbarm/md.c:1.12 Thu Jan 9 17:06:46 2020
+++ src/usr.sbin/sysinst/arch/evbarm/md.c Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: md.c,v 1.12 2020/01/09 17:06:46 martin Exp $ */
+/* $NetBSD: md.c,v 1.13 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -81,8 +81,13 @@ md_init(void)
void
md_init_set_status(int flags)
{
- if (boardtype == BOARD_TYPE_RPI)
- set_kernel_set(SET_KERNEL_RPI);
+
+ /*
+ * we will extract kernel variants and DTB files piecwise
+ * manually later, just fetch the kernel set, do not
+ * unpack it.
+ */
+ set_noextract_set(SET_KERNEL_1);
}
bool
@@ -111,10 +116,7 @@ md_get_info(struct install_partition_des
pm->dlsize = ps->size_limit;
}
- if (boardtype == BOARD_TYPE_RPI)
- return set_bios_geom_with_mbr_guess(pm->parts);
-
- return true;
+ return edit_outer_parts(pm->parts);
}
/*
@@ -134,16 +136,13 @@ md_check_partitions(struct install_parti
{
size_t i;
- if (boardtype == BOARD_TYPE_NORMAL)
- return true;
- if (boardtype == BOARD_TYPE_RPI) {
- for (i = 0; i < install->num; i++)
- if (install->infos[i].fs_type == FS_MSDOS)
- return true;
+ for (i = 0; i < install->num; i++)
+ if (install->infos[i].fs_type == FS_MSDOS)
+ return true;
+
+ msg_display(MSG_nomsdospart);
+ process_menu(MENU_ok, NULL);
- msg_display(MSG_nomsdospart);
- process_menu(MENU_ok, NULL);
- }
return false;
}
@@ -195,13 +194,43 @@ md_post_newfs(struct install_partition_d
}
int
-md_post_extract(struct install_partition_desc *install)
+evbarm_extract_finalize(int update)
{
+ distinfo *dist;
char kernelbin[100];
+ int (*saved_fetch_fn)(const char *);
+#ifdef _LP64
+#define EFIBOOT "/usr/mdec/bootaa64.efi"
+#else
+#define EFIBOOT "/usr/mdec/bootarm.efi"
+#endif
+
+ dist = get_set_distinfo(SET_KERNEL_1);
+ if (dist == NULL)
+ return 0;
+
+ saved_fetch_fn = fetch_fn;
+ extract_file_to(dist, false, "/", "./netbsd", false);
+ fetch_fn = NULL;
+ make_target_dir("/boot/EFI/boot");
+ if (target_file_exists_p(EFIBOOT))
+ cp_within_target(EFIBOOT, "/boot/EFI/boot", 0);
- if (boardtype == BOARD_TYPE_NORMAL)
+ if (boardtype == BOARD_TYPE_ACPI) {
+ fetch_fn = saved_fetch_fn;
return 0;
+ }
+ if (boardtype == BOARD_TYPE_NORMAL) {
+ make_target_dir("/boot/dtb");
+ extract_file_to(dist, false, "/boot/dtb", "*.dt*", false);
+ extract_file_to(dist, false, "/boot", "./netbsd.ub", false);
+ fetch_fn = saved_fetch_fn;
+ return 0;
+ }
if (boardtype == BOARD_TYPE_RPI) {
+ extract_file_to(dist, false, "/boot", "./netbsd.img", false);
+ extract_file_to(dist, false, "/boot", "./bcm*.dtb", false);
+ fetch_fn = saved_fetch_fn;
snprintf(kernelbin, 100, "%s/netbsd.img", targetroot_mnt);
if (file_exists_p(kernelbin)) {
run_program(RUN_DISPLAY,
@@ -212,6 +241,14 @@ md_post_extract(struct install_partition
return 1;
}
}
+ fetch_fn = saved_fetch_fn;
+ return 0;
+}
+
+int
+md_post_extract(struct install_partition_desc *install)
+{
+
return 0;
}
@@ -252,86 +289,36 @@ md_check_mbr(struct disk_partitions *par
struct mbr_partition *part;
int i, hasboot=0;
- if (boardtype == BOARD_TYPE_NORMAL)
- return 2;
- /* raspi code */
- if (boardtype == BOARD_TYPE_RPI) {
- for (ext = mbri; ext; ext = ext->extended) {
- part = ext->mbr.mbr_parts;
- for (i=0, hasboot=0; i < MBR_PART_COUNT; part++, i++) {
- if (part->mbrp_type != MBR_PTYPE_FAT16L &&
- part->mbrp_type != MBR_PTYPE_FAT32L)
- continue;
- hasboot = 1;
- break;
- }
- }
- if (!hasboot) {
- if (quiet)
- return 2;
- msg_display(MSG_nomsdospart);
- return ask_reedit(parts);
+ for (ext = mbri; ext; ext = ext->extended) {
+ part = ext->mbr.mbr_parts;
+ for (i=0, hasboot=0; i < MBR_PART_COUNT; part++, i++) {
+ if (part->mbrp_type != MBR_PTYPE_FAT16L &&
+ part->mbrp_type != MBR_PTYPE_FAT32L)
+ continue;
+ hasboot = 1;
+ break;
}
}
+ if (!hasboot) {
+ if (quiet)
+ return 2;
+ msg_display(MSG_nomsdospart);
+ return ask_reedit(parts);
+ }
+
return 2;
}
bool
md_parts_use_wholedisk(struct disk_partitions *parts)
{
- part_id nbsd, boot;
- struct disk_part_info info;
- daddr_t offset;
-
- /*
- * XXX - set (U)EFI install depending on boardtype
- */
-
- if (boardtype == BOARD_TYPE_NORMAL) {
- /* this keeps it from creating /boot as msdos */
- pm->bootsize = 0;
- return parts_use_wholedisk(parts, 0, NULL);
- }
-
- /* raspi code */
- if (boardtype == BOARD_TYPE_RPI) {
-
- for (boot = 0; boot < parts->num_part; boot++) {
- if (!parts->pscheme->get_part_info(parts, boot, &info))
- continue;
- if (info.nat_type == NULL)
- continue;
- if (info.nat_type->generic_ptype == PT_FAT)
- break;
- }
-
- if (boot >= parts->num_part) {
- /* It's hopelessly corrupt, punt for now */
- msg_display(MSG_nomsdospart);
- process_menu(MENU_ok, NULL);
- return false;
- }
- pm->bootstart = info.start;
- pm->bootsize = info.size;
- offset = info.start + info.size + 1;
- memset(&info, 0, sizeof info);
- info.start = offset;
- info.size = parts->pscheme->max_free_space_at(parts, offset);
- info.nat_type = parts->pscheme->get_generic_part_type(PT_root);
- info.fs_type = FS_BSDFFS;
- info.fs_sub_type = 2;
-
- nbsd = parts->pscheme->add_partition(parts, &info, NULL);
- if (nbsd == NO_PART)
- return false;
-
- parts->pscheme->get_part_info(parts, nbsd, &info);
- pm->ptstart = info.start;
- pm->ptsize = info.size;
- return true;
- }
+ struct disk_part_info boot_part = {
+ .size = boardtype == BOARD_TYPE_NORMAL ?
+ PART_BOOT_LARGE/512 : PART_BOOT/512,
+ .fs_type = PART_BOOT_TYPE, .fs_sub_type = MBR_PTYPE_FAT16L,
+ };
- return parts_use_wholedisk(parts, 0, NULL);
+ return parts_use_wholedisk(parts, 1, &boot_part);
}
/* returns false if no write-back of parts is required */
@@ -353,3 +340,23 @@ md_gpt_post_write(struct disk_partitions
return true;
}
#endif
+
+void
+evbarm_part_defaults(struct pm_devs *my_pm, struct part_usage_info *infos,
+ size_t num_usage_infos)
+{
+ size_t i;
+
+ if (boardtype != BOARD_TYPE_NORMAL)
+ return;
+
+ for (i = 0; i < num_usage_infos; i++) {
+ if (infos[i].fs_type == PART_BOOT_TYPE &&
+ infos[i].mount != NULL &&
+ strcmp(infos[i].mount, PART_BOOT_MOUNT) == 0) {
+ infos[i].size = PART_BOOT_LARGE;
+ return;
+ }
+ }
+}
+
Index: src/usr.sbin/sysinst/arch/evbarm/md.h
diff -u src/usr.sbin/sysinst/arch/evbarm/md.h:1.4 src/usr.sbin/sysinst/arch/evbarm/md.h:1.5
--- src/usr.sbin/sysinst/arch/evbarm/md.h:1.4 Thu Jan 9 17:06:46 2020
+++ src/usr.sbin/sysinst/arch/evbarm/md.h Mon Jan 20 21:26:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: md.h,v 1.4 2020/01/09 17:06:46 martin Exp $ */
+/* $NetBSD: md.h,v 1.5 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -39,19 +39,30 @@
/* Constants and defines */
#define PART_BOOT (16*MEG)
+#define PART_BOOT_LARGE (32*MEG)
#define PART_BOOT_TYPE FS_MSDOS
+#define PART_BOOT_SUBT MBR_PTYPE_FAT16L
#define PART_BOOT_MOUNT "/boot"
/* Megs required for a full X installation. */
#define XNEEDMB 60
+#define DEFSWAPSIZE (-1)
+
+/* use UFS2 by default for ffs */
+#define DEFAULT_UFS2
+
#define HAVE_UFS2_BOOT
+/* allow using tmpfs for /tmp instead of mfs */
+#define HAVE_TMPFS
+
/*
* Default filesets to fetch and install during installation
* or upgrade. The standard sets are:
* base etc comp games man misc rescue tests text xbase xcomp xetc xfont xserver
*/
+#if 0 /* XXX */
#define SET_KERNEL_1_NAME "kern-ADI_BRH"
#define SET_KERNEL_2_NAME "kern-INTEGRATOR"
#define SET_KERNEL_3_NAME "kern-IQ80310"
@@ -61,7 +72,13 @@
#define SET_KERNEL_7_NAME "kern-TS7200"
#define SET_KERNEL_8_NAME "kern-RPI"
#define SET_KERNEL_9_NAME "kern-KUROBOX_PRO"
-#define SET_KERNEL_RPI SET_KERNEL_8
+#endif
+
+#ifdef _LP64
+#define SET_KERNEL_1_NAME "kern-GENERIC64"
+#else
+#define SET_KERNEL_1_NAME "kern-GENERIC"
+#endif
#define MD_SETS_SELECTED SET_SYSTEM
@@ -87,3 +104,17 @@ int boardtype;
*/
#define MD_GPT_INITIAL_SIZE (8*1024)
+
+#define HAVE_GPT_BOOT /* yes, u-boot can boot us from GPT */
+#define NO_DISKLABEL_BOOT /* ... but not directly from disklabel */
+
+#define MD_MAY_SWAP_TO(DISK) may_swap_if_not_sdmmc(DISK)
+
+int evbarm_extract_finalize(int);
+#define MD_SET_EXTRACT_FINALIZE(UP) evbarm_extract_finalize(UP)
+
+void evbarm_part_defaults(struct pm_devs*, struct part_usage_info*,
+ size_t num_usage_infos);
+
+#define MD_PART_DEFAULTS(A,B,C) evbarm_part_defaults(A,B,C)
+