| /* ----------------------------------------------------------------------- * |
| * |
| * Copyright 1998-2008 H. Peter Anvin - All Rights Reserved |
| * Copyright 2009 Intel Corporation; author: H. Peter Anvin |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
| * Boston MA 02111-1307, USA; either version 2 of the License, or |
| * (at your option) any later version; incorporated herein by reference. |
| * |
| * ----------------------------------------------------------------------- */ |
| |
| /* |
| * int 0x25 and 0x26 direct sector access |
| * |
| * Use assembly wrapper functions for these system calls, since unlike |
| * int 0x21 calls they are "dirty" and can destroy unrelated registers. |
| * |
| * NOTE: these all assume the data buffer is in the data segment, i.e. |
| * %ds == %es == dio.bufseg. |
| * |
| * Usage: int int25_read_sector(drive, dio) |
| * Usage: int int26_write_sector(drive, dio) |
| */ |
| |
| .code16gcc |
| .text |
| |
| .globl int25_read_sector |
| .type int25_read_sector, @function |
| int25_read_sector: |
| pushl %ebp |
| pushl %edi |
| pushl %esi |
| pushl %ebx |
| |
| decw %ax /* AL = drive number (0 = A:) */ |
| movw %dx, %bx /* BX = dio structure */ |
| movw 6(%bx), %dx /* DX = data buffer */ |
| movw $-1, %cx |
| int $0x25 |
| jc 1f |
| xorw %ax, %ax /* Error code: 0 = no error */ |
| 1: |
| popfw |
| movzwl %ax, %eax |
| popl %ebx |
| popl %esi |
| popl %edi |
| popl %ebp |
| retl |
| .size int25_read_sector, .-int25_read_sector |
| |
| .globl int26_write_sector |
| .type int26_write_sector, @function |
| int26_write_sector: |
| pushl %ebp |
| pushl %edi |
| pushl %esi |
| pushl %ebx |
| |
| decw %ax /* AL = drive number (0 = A:) */ |
| movw %dx, %bx /* BX = dio structure */ |
| movw 6(%bx), %dx /* DX = data buffer */ |
| movw $-1, %cx |
| int $0x26 |
| jc 1f |
| xorw %ax, %ax /* Error code: 0 = no error */ |
| 1: |
| popfw |
| movzwl %ax, %eax |
| popl %ebx |
| popl %esi |
| popl %edi |
| popl %ebp |
| retl |
| .size int26_write_sector, .-int26_write_sector |