265efa8b8b
EMM386 is available. This reduces device driver call overhead in terms of CPU and stack usage. Older EMM386 versions destroyed eax ebx ecx edi esi ebp fs gs, now go_driver_entry in emm386.asm saves those registers. Only the INIT was broken, but the execrh.asm patch protected ALL functions. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1184 6ac86273-5f31-0410-b378-82cca8765d1b
96 lines
2.7 KiB
NASM
96 lines
2.7 KiB
NASM
;
|
|
; File:
|
|
; execrh.asm
|
|
; Description:
|
|
; request handler for calling device drivers
|
|
;
|
|
; Copyright (c) 1995, 1998
|
|
; Pasquale J. Villani
|
|
; All Rights Reserved
|
|
;
|
|
; This file is part of DOS-C.
|
|
;
|
|
; DOS-C 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; either version
|
|
; 2, or (at your option) any later version.
|
|
;
|
|
; DOS-C is distributed in the hope that it will be useful, but
|
|
; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
|
; the GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public
|
|
; License along with DOS-C; see the file COPYING. If not,
|
|
; write to the Free Software Foundation, 675 Mass Ave,
|
|
; Cambridge, MA 02139, USA.
|
|
;
|
|
; $Id$
|
|
;
|
|
|
|
%include "segs.inc"
|
|
%include "stacks.inc"
|
|
|
|
segment HMA_TEXT
|
|
; EXECRH
|
|
; Execute Device Request
|
|
;
|
|
; execrh(rhp, dhp)
|
|
; request far *rhp;
|
|
; struct dhdr far *dhp;
|
|
;
|
|
;
|
|
; The stack is very critical in here.
|
|
;
|
|
global EXECRH
|
|
global INIT_EXECRH
|
|
|
|
%macro EXECRHM 0
|
|
push bp ; perform c entry
|
|
mov bp,sp
|
|
push si
|
|
push ds ; sp=bp-8
|
|
|
|
lds si,[bp+4] ; ds:si = device header
|
|
les bx,[bp+8] ; es:bx = request header
|
|
|
|
|
|
mov ax, [si+6] ; construct strategy address
|
|
mov [bp+4], ax
|
|
|
|
push si ; the bloody fucking RTSND.DOS
|
|
push di ; driver destroys SI,DI (tom 14.2.03)
|
|
|
|
call far[bp+4] ; call far the strategy
|
|
|
|
pop di
|
|
pop si
|
|
|
|
; Protect386Registers ; old free-EMM386 versions destroy regs in their INIT method
|
|
|
|
mov ax,[si+8] ; construct 'interrupt' address
|
|
mov [bp+4],ax ; construct interrupt address
|
|
call far[bp+4] ; call far the interrupt
|
|
|
|
; Restore386Registers ; less stack load and better performance...
|
|
|
|
sti ; damm driver turn off ints
|
|
cld ; has gone backwards
|
|
pop ds
|
|
pop si
|
|
pop bp
|
|
ret 8
|
|
%endmacro
|
|
|
|
EXECRH:
|
|
EXECRHM
|
|
|
|
%ifndef WATCOM
|
|
|
|
segment INIT_TEXT
|
|
|
|
INIT_EXECRH:
|
|
EXECRHM
|
|
|
|
%endif
|