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);