xref: /netbsd-src/sys/arch/ews4800mips/stand/common/diskutil.c (revision c2e8ce644bcf0a6856a25f9a8b5bf45c845b918e)
1*c2e8ce64Stsutsui /*	$NetBSD: diskutil.c,v 1.5 2011/12/25 06:09:09 tsutsui Exp $	*/
204faabf0Stsutsui 
304faabf0Stsutsui /*-
404faabf0Stsutsui  * Copyright (c) 2004 The NetBSD Foundation, Inc.
504faabf0Stsutsui  * All rights reserved.
604faabf0Stsutsui  *
704faabf0Stsutsui  * This code is derived from software contributed to The NetBSD Foundation
804faabf0Stsutsui  * by UCHIYAMA Yasushi.
904faabf0Stsutsui  *
1004faabf0Stsutsui  * Redistribution and use in source and binary forms, with or without
1104faabf0Stsutsui  * modification, are permitted provided that the following conditions
1204faabf0Stsutsui  * are met:
1304faabf0Stsutsui  * 1. Redistributions of source code must retain the above copyright
1404faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer.
1504faabf0Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
1604faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer in the
1704faabf0Stsutsui  *    documentation and/or other materials provided with the distribution.
1804faabf0Stsutsui  *
1904faabf0Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2004faabf0Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2104faabf0Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2204faabf0Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2304faabf0Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2404faabf0Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2504faabf0Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2604faabf0Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2704faabf0Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2804faabf0Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2904faabf0Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
3004faabf0Stsutsui  */
3104faabf0Stsutsui 
3204faabf0Stsutsui #include <lib/libsa/stand.h>
3304faabf0Stsutsui #include <lib/libsa/ufs.h>
3404faabf0Stsutsui #include <lib/libkern/libkern.h>
3504faabf0Stsutsui 
3604faabf0Stsutsui #include <machine/pdinfo.h>
3704faabf0Stsutsui #include <machine/vtoc.h>
3804faabf0Stsutsui #include <machine/bfs.h>
3904faabf0Stsutsui 
4004faabf0Stsutsui #include "cmd.h"
4104faabf0Stsutsui #include "local.h"
4204faabf0Stsutsui 
4304faabf0Stsutsui struct pdinfo_sector pdinfo;
4404faabf0Stsutsui struct vtoc_sector vtoc;
4504faabf0Stsutsui int vtoc_readed;
4604faabf0Stsutsui 
4704faabf0Stsutsui void bfs_ls(void);
4804faabf0Stsutsui 
4904faabf0Stsutsui int
cmd_disklabel(int argc,char * argp[],int interactive)5004faabf0Stsutsui cmd_disklabel(int argc, char *argp[], int interactive)
5104faabf0Stsutsui {
5204faabf0Stsutsui 	struct ux_partition *partition;
5304faabf0Stsutsui 	int i;
5404faabf0Stsutsui 
5504faabf0Stsutsui 	if (!read_vtoc())
5604faabf0Stsutsui 		return 1;
5704faabf0Stsutsui 
5804faabf0Stsutsui 	partition = vtoc.partition;
5904faabf0Stsutsui 	printf("Tag\tFlags\tStart\tCount\n");
6004faabf0Stsutsui 	for (i = 0; i < VTOC_MAXPARTITIONS; i++, partition++)
6104faabf0Stsutsui 		printf("   %d %d   %d\t%d\t%d\n", i, partition->tag,
6204faabf0Stsutsui 		    partition->flags, partition->start_sector,
6304faabf0Stsutsui 		    partition->nsectors);
6404faabf0Stsutsui 
6504faabf0Stsutsui 	return 0;
6604faabf0Stsutsui }
6704faabf0Stsutsui 
6804faabf0Stsutsui int
cmd_ls(int argc,char * argp[],int interactive)6904faabf0Stsutsui cmd_ls(int argc, char *argp[], int interactive)
7004faabf0Stsutsui {
7104faabf0Stsutsui 	int i;
7204faabf0Stsutsui 
7304faabf0Stsutsui 	if (argc < 2) {
7404faabf0Stsutsui 		printf("ls partition\n");
7504faabf0Stsutsui 		return 1;
7604faabf0Stsutsui 	}
7704faabf0Stsutsui 
7804faabf0Stsutsui 	if (!read_vtoc())
7904faabf0Stsutsui 		return 1;
8004faabf0Stsutsui 
8104faabf0Stsutsui 	i = strtoul(argp[1], 0, 0);
8204faabf0Stsutsui 	if (i < 0 || i >= VTOC_MAXPARTITIONS)
8304faabf0Stsutsui 		return 1;
8404faabf0Stsutsui 
8504faabf0Stsutsui 	if (!device_attach(-1, -1, i))
8604faabf0Stsutsui 		return 1;
8704faabf0Stsutsui 	switch (fstype(i)) {
8804faabf0Stsutsui 	case FSTYPE_BFS:
8904faabf0Stsutsui 		bfs_ls();
9004faabf0Stsutsui 		break;
9104faabf0Stsutsui 	default:
92*c2e8ce64Stsutsui 		ls("/");
93*c2e8ce64Stsutsui 		break;
9404faabf0Stsutsui 	}
9504faabf0Stsutsui 
9604faabf0Stsutsui 	return 0;
9704faabf0Stsutsui }
9804faabf0Stsutsui 
9904faabf0Stsutsui void
bfs_ls(void)10004faabf0Stsutsui bfs_ls(void)
10104faabf0Stsutsui {
10204faabf0Stsutsui 	struct bfs *bfs;
10304faabf0Stsutsui 	struct bfs_dirent *file;
10404faabf0Stsutsui 	struct bfs_inode *inode;
10504faabf0Stsutsui 	int i;
10604faabf0Stsutsui 
10704faabf0Stsutsui 	if (!DEVICE_CAPABILITY.disk_enabled)
10804faabf0Stsutsui 		return;
10904faabf0Stsutsui 
11004faabf0Stsutsui 	if (bfs_init(&bfs) != 0)
11104faabf0Stsutsui 		return;
11204faabf0Stsutsui 
11304faabf0Stsutsui 	for (file = bfs->dirent, i = 0; i < bfs->max_dirent; i++, file++) {
11404faabf0Stsutsui 		if (file->inode != 0) {
11504faabf0Stsutsui 			inode = &bfs->inode[file->inode - BFS_ROOT_INODE];
11604faabf0Stsutsui 			printf("%s\t%d (%d-%d)\n", file->name,
11704faabf0Stsutsui 			    bfs_file_size(inode), inode->start_sector,
11804faabf0Stsutsui 			    inode->end_sector);
11904faabf0Stsutsui 		}
12004faabf0Stsutsui 	}
12104faabf0Stsutsui 
12204faabf0Stsutsui 	bfs_fini(bfs);
12304faabf0Stsutsui }
12404faabf0Stsutsui 
12504faabf0Stsutsui int
fstype(int partition)12604faabf0Stsutsui fstype(int partition)
12704faabf0Stsutsui {
12804faabf0Stsutsui 	struct ux_partition *p;
12904faabf0Stsutsui 
13004faabf0Stsutsui 	if (!read_vtoc())
13104faabf0Stsutsui 		return -1;
13204faabf0Stsutsui 
13304faabf0Stsutsui 	if (partition < 0 || partition >= VTOC_MAXPARTITIONS)
13404faabf0Stsutsui 		return -1;
13504faabf0Stsutsui 
13604faabf0Stsutsui 	p = &vtoc.partition[partition];
13704faabf0Stsutsui 	if (p->tag == VTOC_TAG_STAND)
13804faabf0Stsutsui 		return FSTYPE_BFS;
13904faabf0Stsutsui 
14004faabf0Stsutsui 	if ((p->flags & VTOC_FLAG_UNMOUNT) == 0)
14104faabf0Stsutsui 		return FSTYPE_UFS; /* possibly */
14204faabf0Stsutsui 
14304faabf0Stsutsui 	return -1;
14404faabf0Stsutsui }
14504faabf0Stsutsui 
146712239e3Sthorpej bool
find_partition_start(int partition,int * sector)14704faabf0Stsutsui find_partition_start(int partition,  int *sector)
14804faabf0Stsutsui {
14904faabf0Stsutsui 
15004faabf0Stsutsui 	if (!read_vtoc())
15116ed6645Sthorpej 		return false;
15204faabf0Stsutsui 
15304faabf0Stsutsui 	*sector = pdinfo.logical_sector +
15404faabf0Stsutsui 	    vtoc.partition[partition].start_sector;
15504faabf0Stsutsui 	printf("[partition=%d, start sector=%d]", partition, *sector);
15604faabf0Stsutsui 
15716ed6645Sthorpej 	return true;
15804faabf0Stsutsui }
15904faabf0Stsutsui 
160712239e3Sthorpej bool
read_vtoc(void)16104faabf0Stsutsui read_vtoc(void)
16204faabf0Stsutsui {
16304faabf0Stsutsui 
16404faabf0Stsutsui 	if (!DEVICE_CAPABILITY.disk_enabled)
16516ed6645Sthorpej 		return false;
16604faabf0Stsutsui 
16704faabf0Stsutsui 	if (vtoc_readed)
16816ed6645Sthorpej 		return true;
16904faabf0Stsutsui 
17004faabf0Stsutsui 	if (!pdinfo_sector(0, &pdinfo)) {
17104faabf0Stsutsui 		printf("no PDINFO\n");
17216ed6645Sthorpej 		return false;
17304faabf0Stsutsui 	}
17404faabf0Stsutsui 
17504faabf0Stsutsui 	if (!vtoc_sector(0, &vtoc, pdinfo.logical_sector)) {
17604faabf0Stsutsui 		printf("no VTOC\n");
17716ed6645Sthorpej 		return false;
17804faabf0Stsutsui 	}
17916ed6645Sthorpej 	vtoc_readed = true;
18004faabf0Stsutsui 
18116ed6645Sthorpej 	return true;
18204faabf0Stsutsui }
183