disk.s revision 64183
1# Copyright (c) KATO Takenori, 1999, 2000. 2# 3# All rights reserved. Unpublished rights reserved under the copyright 4# laws of Japan. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer as 12# the first lines of this file unmodified. 13# 2. Redistributions in binary form must reproduce the above copyright 14# notice, this list of conditions and the following disclaimer in the 15# documentation and/or other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27# 28# $FreeBSD: head/sys/boot/pc98/boot0.5/disk.s 64183 2000-08-03 09:00:19Z kato $ 29# 30 31 .code16 32 .text 33# 34# Check magic number at the end of the sector 0 35# 36check_magic: 37 movw curdevice, %si 38 shlw %si 39 movw secsize(%si), %bx 40 decw %bx 41 decw %bx 42 movw iplbuf(%bx), %ax 43 cmpw $0xaa55, %ax 44 je magic_ok 45 movw $1, %ax 46 ret 47magic_ok: 48 xorw %ax, %ax 49 ret 50 51# 52# Copy partition table from buffer to parttable. 53# 54setup_partition: 55 push %cs 56 pop %es 57 movw curdevice, %bx 58 shlw %bx 59 movw maxpart(%bx), %cx # %cx = max num of partitions 60 movw partoff(%bx), %di 61 movw %di, %bx # %bx = offset to partition table 62 xorw %dx, %dx # %dx = partition number 63setup_partition_loop: 64 push %cx 65 movw %dx, %si 66 movb $5, %cl 67 shlw %cl, %si 68 addw %bx, %si 69 movb iplbuf(%si), %al 70 orb %al, %al 71 jz unused_partition 72 addw $iplbuf, %si 73 movw npartition, %ax 74 movw %ax, %di 75 movb $5, %cl 76 shlw %cl, %di 77 addw $parttable, %di 78 movw $32, %cx 79 rep 80 movsb 81 movw %ax, %di 82 addw $partnum, %di 83 movb %dl, (%di) 84 incw npartition 85unused_partition: 86 incw %dx 87 pop %cx 88 loop setup_partition_loop 89 ret 90 91# 92# Read IPL and partition table in the current device. 93# 94 .global read_ipl 95read_ipl: 96 movw curdevice, %ax 97 movw %ax, %si # %si = device number 98 movw %ax, %di 99 shlw %di 100 101 movw %cs, %ax 102 movw %ax, %es 103 movb $6, %ah 104 movb daua(%si), %al 105 movw $0x400, %bx 106 xorw %cx, %cx 107 xorw %dx, %dx 108 movw $iplbuf, %bp 109 int $0x1b 110 jc read_ipl_error 111 movw defflagoff(%di), %bx 112 movb iplbuf(%bx), %al 113 movb %al, defpartflag 114 incw %bx 115 movb iplbuf(%bx), %al 116 movb %al, defpartnum 117 movw $0, npartition 118 call check_magic 119 orw %ax, %ax 120 jnz no_magic 121 call setup_partition 122no_magic: 123 xorw %ax, %ax 124read_ipl_error: 125 xorw %bx, %bx 126 movw %bx, %es 127 ret 128 129# 130# Restore IPL from the buffer 131# 132 .global write_ipl 133write_ipl: 134 movw curdevice, %ax 135 movw %ax, %si 136 movw %ax, %di 137 shlw %di 138 139 # Restore default boot partition info. 140 movw defflagoff(%di), %bx 141 movb defpartflag, %al 142 movb %al, iplbuf(%bx) 143 incw %bx 144 movb defpartnum, %al 145 movb %al, iplbuf(%bx) 146 147 movw %cs, %ax 148 movw %ax, %es 149 movb $5, %ah 150 movb daua(%si), %al 151 movw secsize(%di), %bx 152 xorw %cx, %cx 153 xorw %dx, %dx 154 movw $iplbuf, %bp 155 int $0x1b 156 jc write_ipl_error 157 xorw %ax, %ax 158write_ipl_error: 159 xorw %bx, %bx 160 movw %bx, %es 161 ret 162 163# 164# Scan HDD devices 165# 166 .global scan_sasi, scan_scsi 167 # Scan SASI disk 168scan_sasi: 169 # SASI Disk 170 movw $4, %cx 171 movw $0x0001, %ax # %ah = unit number, %al = for bit operation 172 173sasi_loop: 174 movw %si, %di 175 shlw %di 176 movw $0x55d, %bx # DISK_EQUIP 177 call read_biosparam 178 testb %al, %dl 179 jz no_sasi_unit 180 movb $0x80, %dh 181 addb %ah, %dh 182 movb %dh, daua(%si) 183 movw $0x457, %bx # capacity & sector size of IDE HDD 184 call read_biosparam 185 orb %ah, %ah 186 jz sasi_1 187 cmpb $1, %ah 188 jz sasi_2 189 190 # SASI #3/#4 191 movw $512, %dx # XXX 192 jmp found_sasi_unit 193 194sasi_1: 195 # SASI #1 196 testb $0x80, %dl 197 jz sasi_256 198 jmp sasi_512 199sasi_2: 200 # SASI #2 201 testb $0x80, %dl 202 jz sasi_256 203 jmp sasi_512 204 205sasi_256: 206 movw $256, %dx 207 jmp found_sasi_unit 208sasi_512: 209 movw $512, %dx 210found_sasi_unit: 211 movw %dx, secsize(%di) 212 incw %si 213no_sasi_unit: 214 incb %ah 215 shlb %al 216 loop sasi_loop 217 ret 218 219# 220# Scan SCSI disk 221# SI number of disks 222# destroyed: %ax, %bx, %cx, %dx 223scan_scsi: 224 movw $8, %cx 225 movw $0x0001, %ax # %ah = ID number, %al = for bit operation 226scsi_loop: 227 # Check whether drive exist. 228 movw %si, %di 229 shlw %di 230 movw $0x482, %bx # DISK_EQUIPS 231 call read_biosparam 232 testb %al, %dl 233 jz no_scsi_unit 234 xorw %bx, %bx 235 movb %ah, %bl 236 shlw %bx 237 shlw %bx 238 addw $0x460, %bx # SCSI paramter block 239 call read_biosparam 240 orb %dl, %dl 241 jz no_scsi_unit 242 243 # SCSI harddrive found. 244 movb $0xa0, %dh 245 addb %ah, %dh 246 movb %dh, daua(%si) 247 248 # Check sector size. 249 addw $3, %bx 250 call read_biosparam 251 andb $0x30, %dl 252 cmpb $0x20, %dl 253 je scsi_1024 254 cmpb $0x10, %dl 255 je scsi_512 256 movw $256, %dx 257 jmp found_scsi 258scsi_1024: 259 movw $1024, %dx 260 jmp found_scsi 261scsi_512: 262 movw $512, %dx 263found_scsi: 264 movw %dx, secsize(%di) 265 incw %si 266no_scsi_unit: 267 incb %ah 268 shlb %al 269 loop scsi_loop 270 ret 271 272 .data 273 .global partnum, parttable, defpartflag, defpartnum, npartition 274partnum: .space 32 # Index of parttable 275parttable: .space 1024 # Copy of valid partition table 276defpartflag: .byte 0 277defpartnum: .byte 0 278npartition: .word 0 # number of partitions 279 .bss 280iplbuf: .space 0x400 281