;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; 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; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program 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 this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; SMP.ASM ; Simple message protocol implementation ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME smpbase ;;;;;;;;; INTERNAL PROCEDURES ;;;;;;;;;;; GateSize = 16 INCLUDE protseg.def INCLUDE ..\driver.def INCLUDE ..\user.def INCLUDE ..\os.def INCLUDE ..\user.inc INCLUDE ..\os.inc INCLUDE exec.def INCLUDE system.def INCLUDE system.inc INCLUDE ip.inc INCLUDE ipc.inc INCLUDE smp.inc Reverse MACRO xchg al,ah rol eax,16 xchg al,ah ENDM code SEGMENT byte public 'CODE' .386p assume cs:code extrn QueryMailslot:near extrn AllocateIpcHandle:near extrn QueueReset:near extrn HandleResponses:near extrn ReceiveRequest:near extrn ReceiveReply:near extrn GetSendMailslot:near extrn NameRequest:near extrn NameReply:near extrn ReceiveSupervise:near extrn SendSupervise:near extrn SendPerform:near extrn ResponseSupervise:near extrn ResponsePerform:near ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CalcChecksum ; ; DESCRIPTION: Calculate checksum for SMP ; ; PARAMETERS: AX Checksum in ; CX Size of data ; ES:DI Data ; ; RETURNS: AX Checksum out ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public CalcChecksum CalcChecksum Proc near push ds push cx push dx push si ; mov si,es mov ds,si mov si,di mov dx,ax shr cx,1 pushf clc checksum_loop: lodsw adc dx,ax loop checksum_loop adc dx,0 adc dx,0 popf jnc calc_checksum_done xor ah,ah lodsb add dx,ax adc dx,0 adc dx,0 calc_checksum_done: mov ax,dx ; pop si pop dx pop cx pop ds ret CalcChecksum Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FindHost ; ; DESCRIPTION: Find a SMP host ; ; PARAMETERS: EDX IP ; ; RETURNS: AX SMP host selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public FindHost FindHost Proc near push ds push es push bx push di ; LookupIpCache jc find_host_done ; mov ax,ipc_data_sel mov ds,ax EnterSection ds:ipc_section ; mov bx,ds:ipc_cache_offset mov ax,es:[bx] or ax,ax jnz find_host_buffered ; push fs mov ax,es mov fs,ax mov eax,SIZE smp_host_data AllocateSmallGlobalMem mov es:shd_mailslot_list,0 mov es:shd_response_list,0 mov es:shd_ip,edx mov es:shd_host,fs mov es:shd_sign,HOST_SIGN InitSection es:shd_section EnterSection ds:smp_host_section mov ax,ds:smp_host_list mov es:shd_link,ax mov ds:smp_host_list,es mov ax,es mov fs:[bx],ax pop fs LeaveSection ds:smp_host_section find_host_buffered: LeaveSection ds:ipc_section clc find_host_done: pop di pop bx pop es pop ds ret FindHost Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetRemoteMailslot ; ; DESCRIPTION: Get remote mailslot from host & name ; ; PARAMETERS: EDX IP address ; ES:(E)DI Mailslot name ; ; RETURNS: BX Mailslot handle ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_remote_mailslot_name DB 'Get Remote Mailslot',0 get_remote_mailslot32 Proc far call GetSendMailslot retf32 get_remote_mailslot32 Endp get_remote_mailslot16 Proc far push edi movzx edi,di call GetSendMailslot pop edi ret get_remote_mailslot16 Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Name: Receive ; ; Purpose: Receive notify from IP ; ; Parameters: AX Size of options ; ECX Size of data ; EDX Source IP address ; DS:ESI Options ; ES:EDI IP Data ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Receive Proc far push ax push cx push dx push si push di ; push di mov dx,cx xchg dl,dh add dx,7900h adc dx,0 adc dx,0 sub si,8 lodsw add dx,ax lodsw adc dx,ax lodsw adc dx,ax lodsw adc dx,ax mov ax,dx adc ax,0 adc ax,0 mov si,di call CalcChecksum not ax or al,ah pop di jnz receive_free ; mov dl,es:[di].sh_flags ; test dl,NAM jnz receive_name ; test dl,REQ jnz receive_request ; and dl,REQ OR RPY cmp dl,REQ OR RPY je receive_free ; test dl,RPY jnz receive_reply jmp receive_responses receive_name: and dl,REQ OR RPY cmp dl,REQ OR RPY je receive_free ; test dl,REQ jnz receive_name_request ; test dl,RPY jnz receive_name_reply jmp receive_responses receive_name_request: call HandleResponses jc receive_free ; call NameRequest jmp receive_free receive_name_reply: call HandleResponses jc receive_free ; call NameReply jmp receive_free receive_request: call HandleResponses jc receive_free ; call ReceiveRequest jmp receive_free receive_reply: call HandleResponses jc receive_free ; call ReceiveReply jmp receive_free receive_responses: call HandleResponses receive_free: xor ax,ax mov ds,ax FreeMem receive_done: pop di pop si pop dx pop cx pop ax ret Receive Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: add_host ; ; DESCRIPTION: add host from IP cache ; ; PARAMETERS: ES IP cache selector ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; add_host PROC far push ds push bx ; mov bx,ipc_data_sel mov ds,bx mov bx,ds:ipc_cache_offset mov word ptr es:[bx],0 ; pop bx pop ds ret add_host ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Supervise ; ; DESCRIPTION: Supervise send and response operations ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Supervise Proc near xor cx,cx ; mov ax,ipc_data_sel mov ds,ax EnterSection ds:smp_host_section mov ax,ds:smp_host_list supervise_loop: or ax,ax jz supervise_leave ; inc cx mov fs,ax push ds push cx call SendSupervise call ResponseSupervise pop cx pop ds mov ax,fs:shd_link jmp supervise_loop supervise_leave: xor ax,ax mov fs,ax LeaveSection ds:smp_host_section ; or cx,cx stc jz supervise_done ; call SendPerform call ResponsePerform clc supervise_done: ret Supervise Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: smp_thread ; ; DESCRIPTION: supervisor thread ; ; PARAMETERS: ; ; RETURNS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; smp_thread_name DB 'SMP',0 smp_thread_pr: mov ax,ipc_data_sel mov ds,ax mov gs,ax GetThread mov ds:smp_thread,ax mov ds:super_response_list,0 mov ds:super_mailslot_list,0 smp_thread_loop: mov eax,100 WaitMilliSec ; call ReceiveSupervise jc smp_thread_no_receive ; call Supervise jmp smp_thread_loop smp_thread_no_receive: call Supervise jnc smp_thread_loop ; WaitForSignal jmp smp_thread_loop PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init_system ; ; DESCRIPTION: Create supervisor thread ; ; PARAMETERS: ; ; RETURNS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_system Proc far push ds push es pusha ; mov ax,cs mov ds,ax mov es,ax mov si,OFFSET smp_thread_pr mov di,OFFSET smp_thread_name mov ax,4 mov cx,256 CreateThread ; popa pop es pop ds ret init_system Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init_smp ; ; DESCRIPTION: Init smp driver ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public init_smp init_smp PROC near mov ax,2 AllocateIpCacheMem mov ax,ipc_data_sel mov ds,ax mov ds:ipc_cache_offset,bx ; mov ax,cs mov ds,ax mov es,ax ; mov di,OFFSET init_system HookInitTasking ; mov al,79h mov di,OFFSET Receive HookIp ; mov di,OFFSET add_host HookIpCache ; mov bx,OFFSET get_remote_mailslot16 mov si,OFFSET get_remote_mailslot32 mov di,OFFSET get_remote_mailslot_name mov dx,virt_es_in mov ax,get_remote_mailslot_nr RegisterUserGate ret init_smp ENDP code ENDS END