summaryrefslogtreecommitdiff
path: root/sys/arch/vax/stand/rom.c
blob: cdbd70f545b0532c46d4c14e5ab867d985742d2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*	$OpenBSD: rom.c,v 1.2 1997/05/29 00:04:24 niklas Exp $ */
/*	$NetBSD: rom.c,v 1.1 1996/08/02 11:22:21 ragge Exp $ */
/*
 * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
 * All rights reserved.
 *
 * This code is derived from software contributed to Ludd by
 * Bertram Barth.
 *
 * 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.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed at Ludd, University of 
 *      Lule}, Sweden and its contributors.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 */

#include "sys/param.h"
#include "sys/reboot.h"
#include "sys/disklabel.h"

#include "lib/libsa/stand.h"
#include "lib/libsa/ufs.h"

#include "../include/pte.h"
#include "../include/sid.h"
#include "../include/mtpr.h"
#include "../include/reg.h"
#include "../include/rpb.h"

#include "data.h"
#include "vaxstand.h"

extern unsigned *bootregs;
extern struct rpb *rpb;

struct rom_softc {
	int part;
	int unit;
};

int	romstrategy(), romopen();
struct	disklabel romlabel;
struct  rom_softc rom_softc;
char	io_buf[MAXBSIZE];

romopen(f, adapt, ctlr, unit, part)
	struct open_file *f;
        int ctlr, unit, part;
{
	char *msg;
	struct disklabel *lp = &romlabel;
	volatile struct rom_softc *rsc = &rom_softc;
	int i,err;

	bootregs[11] = XXRPB;
	rpb = (void*)XXRPB;
	bqo = (void*)rpb->iovec;

	if (rpb->unit > 0 && (rpb->unit % 100) == 0) {
		printf ("changing rpb->unit from %d ", rpb->unit);
		rpb->unit /= 100;
		printf ("to %d\n", rpb->unit);
	}

	bzero(lp, sizeof(struct disklabel));
	rsc->unit = unit;
	rsc->part = part;

	err = romstrategy(rsc, F_READ, LABELSECTOR, DEV_BSIZE, io_buf, &i);
	if (err) {
		printf("reading disklabel: %s\n",strerror(err));
		return 0;
	}
	msg = getdisklabel(io_buf+LABELOFFSET, lp);
	if (msg)
		printf("getdisklabel: %s\n",msg);
	f->f_devdata = (void*)rsc;
	return(0);
}

romstrategy (rsc, func, dblk, size, buf, rsize)
	struct  rom_softc *rsc;
	int     func;
	daddr_t dblk;
	char    *buf;
	int     size, *rsize;
{
	struct	disklabel *lp;
	int	block;

	lp = &romlabel;
	block = dblk + lp->d_partitions[rsc->part].p_offset;
	if (rsc->unit >= 0 && rsc->unit < 10)
		rpb->unit = rsc->unit;

	if (func == F_WRITE)
		romwrite_uvax(block, size, buf, bootregs);
	else
		romread_uvax(block, size, buf, bootregs);

	*rsize = size;
	return 0;
}