Module Name:    src
Committed By:   charlotte
Date:           Tue Apr  2 22:30:04 UTC 2024

Modified Files:
        src/sys/arch/amd64/conf: ALL
        src/sys/arch/i386/conf: ALL
        src/sys/conf: files
        src/sys/dev: files.dev
Added Files:
        src/sys/dev/dkwedge: dkwedge_tos.c

Log Message:
dk(4): Add support for discovering Atari TOS partitions as wedges

Any partitioning scheme which conforms to the Atari AHDI 3.00 spec should be
recognized by the new DKWEDGE_METHOD_TOS.


To generate a diff of this commit:
cvs rdiff -u -r1.186 -r1.187 src/sys/arch/amd64/conf/ALL
cvs rdiff -u -r1.517 -r1.518 src/sys/arch/i386/conf/ALL
cvs rdiff -u -r1.1311 -r1.1312 src/sys/conf/files
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/files.dev
cvs rdiff -u -r0 -r1.1 src/sys/dev/dkwedge/dkwedge_tos.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/conf/ALL
diff -u src/sys/arch/amd64/conf/ALL:1.186 src/sys/arch/amd64/conf/ALL:1.187
--- src/sys/arch/amd64/conf/ALL:1.186	Thu Mar 21 02:36:01 2024
+++ src/sys/arch/amd64/conf/ALL	Tue Apr  2 22:30:03 2024
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.186 2024/03/21 02:36:01 riastradh Exp $
+# $NetBSD: ALL,v 1.187 2024/04/02 22:30:03 charlotte Exp $
 # From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
 #
 # ALL machine description file
@@ -17,7 +17,7 @@ include 	"arch/amd64/conf/std.amd64"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"ALL-$Revision: 1.186 $"
+#ident		"ALL-$Revision: 1.187 $"
 
 maxusers	64		# estimated number of users
 
@@ -164,6 +164,7 @@ options 	DKWEDGE_METHOD_BSDLABEL	# Suppo
 options 	DKWEDGE_METHOD_MBR	# Support MBR partitions as wedges
 options 	DKWEDGE_METHOD_APPLE	# Support Apple partitions as wedges
 options 	DKWEDGE_METHOD_RDB	# Support RDB partitions as wedges
+options 	DKWEDGE_METHOD_TOS	# Support Atari "TOS" partitions as wedges
 
 # File systems
 file-system	FFS		# UFS

Index: src/sys/arch/i386/conf/ALL
diff -u src/sys/arch/i386/conf/ALL:1.517 src/sys/arch/i386/conf/ALL:1.518
--- src/sys/arch/i386/conf/ALL:1.517	Thu Mar 21 02:36:01 2024
+++ src/sys/arch/i386/conf/ALL	Tue Apr  2 22:30:03 2024
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.517 2024/03/21 02:36:01 riastradh Exp $
+# $NetBSD: ALL,v 1.518 2024/04/02 22:30:03 charlotte Exp $
 # From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
 #
 # ALL machine description file
@@ -17,7 +17,7 @@ include 	"arch/i386/conf/std.i386"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"ALL-$Revision: 1.517 $"
+#ident		"ALL-$Revision: 1.518 $"
 
 maxusers	64		# estimated number of users
 
@@ -151,6 +151,7 @@ options 	DKWEDGE_METHOD_GPT	# Supports G
 #options 	DKWEDGE_METHOD_MBR	# Support MBR partitions as wedges
 options 	DKWEDGE_METHOD_APPLE	# Support Apple partitions as wedges
 options 	DKWEDGE_METHOD_RDB	# Support RDB partitions as wedges
+options 	DKWEDGE_METHOD_TOS	# Support Atari "TOS" partitions as wedges
 
 # File systems
 file-system	FFS		# UFS

Index: src/sys/conf/files
diff -u src/sys/conf/files:1.1311 src/sys/conf/files:1.1312
--- src/sys/conf/files:1.1311	Fri Feb  9 22:08:34 2024
+++ src/sys/conf/files	Tue Apr  2 22:30:03 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1311 2024/02/09 22:08:34 andvar Exp $
+#	$NetBSD: files,v 1.1312 2024/04/02 22:30:03 charlotte Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20171118
@@ -105,6 +105,7 @@ defflag	opt_dkwedge.h		DKWEDGE_AUTODISCO
 				DKWEDGE_METHOD_MBR
 				DKWEDGE_METHOD_APPLE
 				DKWEDGE_METHOD_RDB
+				DKWEDGE_METHOD_TOS
 
 defflag	opt_veriexec.h		VERIFIED_EXEC_FP_SHA256
 				VERIFIED_EXEC_FP_SHA384

Index: src/sys/dev/files.dev
diff -u src/sys/dev/files.dev:1.9 src/sys/dev/files.dev:1.10
--- src/sys/dev/files.dev:1.9	Sat Jun  4 03:31:10 2022
+++ src/sys/dev/files.dev	Tue Apr  2 22:30:03 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: files.dev,v 1.9 2022/06/04 03:31:10 pgoyette Exp $
+#	$NetBSD: files.dev,v 1.10 2024/04/02 22:30:03 charlotte Exp $
 
 file	dev/bio.c			bio			needs-flag
 file	dev/ccd.c			ccd
@@ -13,6 +13,7 @@ file	dev/dkwedge/dkwedge_bsdlabel.c	dkwe
 file	dev/dkwedge/dkwedge_gpt.c	dkwedge_method_gpt
 file	dev/dkwedge/dkwedge_mbr.c	dkwedge_method_mbr
 file	dev/dkwedge/dkwedge_rdb.c	dkwedge_method_rdb
+file	dev/dkwedge/dkwedge_tos.c	dkwedge_method_tos
 file	dev/firmload.c			firmload
 file	dev/fss.c			fss
 file	dev/keylock.c			keylock

Added files:

Index: src/sys/dev/dkwedge/dkwedge_tos.c
diff -u /dev/null src/sys/dev/dkwedge/dkwedge_tos.c:1.1
--- /dev/null	Tue Apr  2 22:30:04 2024
+++ src/sys/dev/dkwedge/dkwedge_tos.c	Tue Apr  2 22:30:03 2024
@@ -0,0 +1,175 @@
+/* $NetBSD: dkwedge_tos.c,v 1.1 2024/04/02 22:30:03 charlotte Exp $ */
+
+/*
+ * Copyright (c) 2024 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charlotte Koch.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * dk(4) support for Atari "TOS" partition schemes.
+ *
+ * Technical details taken from:
+ *
+ * - "Atari Hard Disk File Systems Reference Guide" v1.2b by Jean
+ * Louis-Guerin (DrCoolZic) (September 2014)
+ *
+ * https://info-coach.fr/atari/documents/_mydoc/Atari_HD_File_Sytem_Reference_Guide.pdf
+ */
+
+#include <sys/buf.h>
+#include <sys/disk.h>
+#include <sys/endian.h>
+#include <sys/vnode.h>
+
+#define TOS_PART_TYPE_LEN	3
+#define TOS_GEM_PARTITION	"GEM"
+#define TOS_BGM_PARTITION	"BGM"
+#define TOS_XGM_PARTITION	"XGM"
+
+#define TOS_CXNMETHOD_SASI	0x00
+#define TOS_CXNMETHOD_SCSI	0xFF
+
+#define TOS_MAX_PART_COUNT	4
+#define TOS_SECTOR_SIZE		512
+
+struct tos_partition {
+	uint8_t status;
+	char type[TOS_PART_TYPE_LEN];
+	uint32_t offset;
+	uint32_t size;
+} __packed;
+__CTASSERT(sizeof(struct tos_partition) == 12);
+
+struct tos_root_sector {
+	uint8_t unused1[441];
+	uint8_t connection_method;
+	uint8_t unused2[8];
+	uint32_t size;
+	struct tos_partition parts[TOS_MAX_PART_COUNT];
+	uint8_t unused3[10];
+} __packed;
+__CTASSERT(sizeof(struct tos_root_sector) == TOS_SECTOR_SIZE);
+
+static int dkwedge_discover_tos(struct disk *pdk, struct vnode *vp);
+
+static int
+dkwedge_discover_tos(struct disk *pdk, struct vnode *vp)
+{
+	struct dkwedge_info dkw;
+	int error = 0;
+	size_t i;
+	char safe_type[4];
+
+	/* Get ourselves a fistful of memory. */
+	buf_t *bp = geteblk(TOS_SECTOR_SIZE);
+
+	error = dkwedge_read(pdk, vp, 0L, bp->b_data, TOS_SECTOR_SIZE);
+	if (error) {
+		aprint_error("unable to read TOS Root Sector: error = %d",
+		    error);
+		goto out;
+	}
+
+	struct tos_root_sector *trs = bp->b_data;
+
+	/*
+	 * If the "connection method" isn't recognized, then this is
+	 * probably NOT an Atari-style partition, so get outta here. Note
+	 * that there really isn't a magic number we can rely on; this check
+	 * is somewhat made up. But at least it's better than nothing.
+	 */
+	switch (trs->connection_method) {
+	case TOS_CXNMETHOD_SASI: /* FALLTHROUGH */
+	case TOS_CXNMETHOD_SCSI:
+		; /* OK */
+		break;
+	default:
+		error = ESRCH;
+		goto out;
+	}
+
+	/*
+	 * Make a wedge for each partition that exists (i.e., has the "exist"
+	 * bit set).
+	 */
+	for (i = 0; i < TOS_MAX_PART_COUNT; i++) {
+		struct tos_partition part = trs->parts[i];
+
+		if (!(part.status & 0x01))
+			continue;
+
+		/* Ignore if we see it's an extended "XGM" partition. */
+		if (!strncmp(part.type, TOS_XGM_PARTITION, TOS_PART_TYPE_LEN)) {
+			aprint_normal(
+			    "WARNING: XGM partitions are not yet supported\n");
+			continue;
+		}
+
+		/*
+		 * Otherwise, get outta here if it's not the partition-types
+		 * we *do* support.
+		 */
+		if (strncmp(part.type, TOS_GEM_PARTITION, TOS_PART_TYPE_LEN) &&
+		    strncmp(part.type, TOS_BGM_PARTITION, TOS_PART_TYPE_LEN)) {
+			error = ESRCH;
+			goto out;
+		}
+
+		memset(&dkw, 0, sizeof(dkw));
+		memset(safe_type, 0, sizeof(safe_type));
+
+		/*
+		 * The partition type string is NOT NUL-terminated, so let's
+		 * play it safe.
+		 */
+		memcpy(safe_type, part.type, TOS_PART_TYPE_LEN);
+		safe_type[TOS_PART_TYPE_LEN] = '\0';
+
+		/* Finally, make the wedge. */
+		snprintf(dkw.dkw_wname, sizeof(dkw.dkw_wname), "ATARI_%s_%02lu",
+		    safe_type, i);
+		dkw.dkw_offset = be32toh(trs->parts[i].offset);
+		dkw.dkw_size = be32toh(trs->parts[i].size);
+		strlcpy(dkw.dkw_ptype, DKW_PTYPE_FAT, sizeof(dkw.dkw_ptype));
+		strlcpy(dkw.dkw_parent, pdk->dk_name, sizeof(dkw.dkw_parent));
+		error = dkwedge_add(&dkw);
+
+		if (error == EEXIST) {
+			aprint_error("partition named \"%s\" already exists",
+			    dkw.dkw_wname);
+			goto out;
+		}
+	}
+
+	error = 0;
+
+out:
+	brelse(bp, 0);
+	return error;
+}
+
+DKWEDGE_DISCOVERY_METHOD_DECL(TOS, 10, dkwedge_discover_tos);

Reply via email to