From 4cbf0238eb60c969edddba6ff85c4020f8685444 Mon Sep 17 00:00:00 2001 From: Robert Nordier Date: Mon, 14 Sep 1998 10:37:00 +0000 Subject: [PATCH] Add BTX startup/interface code. --- sys/boot/i386/btx/Makefile | 4 +- sys/boot/i386/btx/lib/Makefile | 16 +++++++ sys/boot/i386/btx/lib/btxcsu.s | 42 +++++++++++++++++ sys/boot/i386/btx/lib/btxsys.s | 40 +++++++++++++++++ sys/boot/i386/btx/lib/btxv86.h | 53 ++++++++++++++++++++++ sys/boot/i386/btx/lib/btxv86.s | 82 ++++++++++++++++++++++++++++++++++ 6 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 sys/boot/i386/btx/lib/Makefile create mode 100644 sys/boot/i386/btx/lib/btxcsu.s create mode 100644 sys/boot/i386/btx/lib/btxsys.s create mode 100644 sys/boot/i386/btx/lib/btxv86.h create mode 100644 sys/boot/i386/btx/lib/btxv86.s diff --git a/sys/boot/i386/btx/Makefile b/sys/boot/i386/btx/Makefile index 3e2ea39a916..2da29d0b4ec 100644 --- a/sys/boot/i386/btx/Makefile +++ b/sys/boot/i386/btx/Makefile @@ -1,5 +1,5 @@ -# $Id: Makefile,v 1.1.1.1 1998/09/12 04:29:22 rnordier Exp $ +# $Id: Makefile,v 1.2 1998/09/12 06:30:10 rnordier Exp $ -SUBDIR= btx btxldr +SUBDIR= btx btxldr lib .include diff --git a/sys/boot/i386/btx/lib/Makefile b/sys/boot/i386/btx/lib/Makefile new file mode 100644 index 00000000000..2ab34fdcb4c --- /dev/null +++ b/sys/boot/i386/btx/lib/Makefile @@ -0,0 +1,16 @@ +# $Id:$ + +OBJS= btxcsu.o btxsys.o btxv86.o +LDFLAGS+= -elf +CLEANFILES+= crt0.o +INTERNALLIB= true +NOMAN= true +NOPIC= true +NOPROFILE= true + +all: crt0.o + +crt0.o: ${OBJS} + ${LD} ${LDFLAGS} -i -o ${.TARGET} ${OBJS} + +.include diff --git a/sys/boot/i386/btx/lib/btxcsu.s b/sys/boot/i386/btx/lib/btxcsu.s new file mode 100644 index 00000000000..daff6cfc91f --- /dev/null +++ b/sys/boot/i386/btx/lib/btxcsu.s @@ -0,0 +1,42 @@ +# +# Copyright (c) 1998 Robert Nordier +# All rights reserved. +# +# Redistribution and use in source and binary forms are freely +# permitted provided that the above copyright notice and this +# paragraph and the following disclaimer are duplicated in all +# such forms. +# +# This software is provided "AS IS" and without any express or +# implied warranties, including, without limitation, the implied +# warranties of merchantability and fitness for a particular +# purpose. +# + +# $Id:$ + +# +# BTX C startup code (ELF). +# + +# +# Globals. +# + .global _start +# +# Constants. +# + .set ARGSIZ,0x60 # Size of arguments +# +# Client entry point. +# +_start: movl %eax,__base # Set base address + subl $ARGSIZ,%esp # Set argument + movl %esp,__args # pointer + call main # Invoke client main() + call exit # Invoke client exit() +# +# Data. +# + .comm __base,4 # Client base address + .comm __args,4 # Client arguments diff --git a/sys/boot/i386/btx/lib/btxsys.s b/sys/boot/i386/btx/lib/btxsys.s new file mode 100644 index 00000000000..16e3228a50e --- /dev/null +++ b/sys/boot/i386/btx/lib/btxsys.s @@ -0,0 +1,40 @@ +# +# Copyright (c) 1998 Robert Nordier +# All rights reserved. +# +# Redistribution and use in source and binary forms are freely +# permitted provided that the above copyright notice and this +# paragraph and the following disclaimer are duplicated in all +# such forms. +# +# This software is provided "AS IS" and without any express or +# implied warranties, including, without limitation, the implied +# warranties of merchantability and fitness for a particular +# purpose. +# + +# $Id:$ + +# +# BTX system calls. +# + +# +# Globals. +# + .global __exit + .global __exec +# +# Constants. +# + .set INT_SYS,0x30 # Interrupt number +# +# System call: exit +# +__exit: xorl %eax,%eax # BTX system + int $INT_SYS # call 0x0 +# +# System call: exec +# +__exec: movl $0x1,%eax # BTX system + int $INT_SYS # call 0x1 diff --git a/sys/boot/i386/btx/lib/btxv86.h b/sys/boot/i386/btx/lib/btxv86.h new file mode 100644 index 00000000000..70c21879d39 --- /dev/null +++ b/sys/boot/i386/btx/lib/btxv86.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1998 Robert Nordier + * All rights reserved. + * + * Redistribution and use in source and binary forms are freely + * permitted provided that the above copyright notice and this + * paragraph and the following disclaimer are duplicated in all + * such forms. + * + * This software is provided "AS IS" and without any express or + * implied warranties, including, without limitation, the implied + * warranties of merchantability and fitness for a particular + * purpose. + */ + +/* + * $Id:$ + */ + +#ifndef _BTXV86_H_ +#define _BTXV86_H_ + +#include + +#define V86_ADDR 0x10000 /* Segment:offset address */ +#define V86_CALLF 0x20000 /* Emulate far call */ +#define V86_FLAGS 0x40000 /* Return flags */ + +struct __v86 { + uint32_t ctl; /* Control flags */ + uint32_t addr; /* Interrupt number or address */ + uint32_t es; /* V86 ES register */ + uint32_t ds; /* V86 DS register */ + uint32_t fs; /* V86 FS register */ + uint32_t gs; /* V86 GS register */ + uint32_t eax; /* V86 EAX register */ + uint32_t ecx; /* V86 ECX register */ + uint32_t edx; /* V86 EDX register */ + uint32_t ebx; /* V86 EBX register */ + uint32_t efl; /* V86 eflags register */ + uint32_t ebp; /* V86 EBP register */ + uint32_t esi; /* V86 ESI register */ + uint32_t edi; /* V86 EDI register */ +}; + +extern struct __v86 __v86; /* V86 interface structure */ + +void __exit(int); +void __exec(caddr_t, ...); + +void __v86int(void); + +#endif /* !_BTXV86_H_ */ diff --git a/sys/boot/i386/btx/lib/btxv86.s b/sys/boot/i386/btx/lib/btxv86.s new file mode 100644 index 00000000000..b67e873510e --- /dev/null +++ b/sys/boot/i386/btx/lib/btxv86.s @@ -0,0 +1,82 @@ +# +# Copyright (c) 1998 Robert Nordier +# All rights reserved. +# +# Redistribution and use in source and binary forms are freely +# permitted provided that the above copyright notice and this +# paragraph and the following disclaimer are duplicated in all +# such forms. +# +# This software is provided "AS IS" and without any express or +# implied warranties, including, without limitation, the implied +# warranties of merchantability and fitness for a particular +# purpose. +# + +# $Id:$ + +# +# BTX V86 interface. +# + +# +# Globals. +# + .global __v86int +# +# Fields in V86 interface structure. +# + .set V86_CTL,0x0 # Control flags + .set V86_ADDR,0x4 # Int number/address + .set V86_ES,0x8 # V86 ES + .set V86_DS,0xc # V86 DS + .set V86_FS,0x10 # V86 FS + .set V86_GS,0x14 # V86 GS + .set V86_EAX,0x18 # V86 EAX + .set V86_ECX,0x1c # V86 ECX + .set V86_EDX,0x20 # V86 EDX + .set V86_EBX,0x24 # V86 EBX + .set V86_EFL,0x28 # V86 eflags + .set V86_EBP,0x2c # V86 EBP + .set V86_ESI,0x30 # V86 ESI + .set V86_EDI,0x34 # V86 EDI +# +# Other constants. +# + .set INT_V86,0x31 # Interrupt number + .set SIZ_V86,0x38 # Size of V86 structure +# +# V86 interface function. +# +__v86int: pushl $__v86 # Push pointer + call __v86_swap # Load V86 registers + int $INT_V86 # To BTX + call __v86_swap # Load user registers + addl $0x4,%esp # Discard pointer + ret # To user +# +# Swap V86 and user registers. +# +__v86_swap: xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP + xchgl %eax,V86_EAX(%ebp) # Swap EAX + xchgl %ecx,V86_ECX(%ebp) # Swap ECX + xchgl %edx,V86_EDX(%ebp) # Swap EDX + xchgl %ebx,V86_EBX(%ebp) # Swap EBX + pushl %eax # Save + pushf # Put eflags + popl %eax # in EAX + xchgl %eax,V86_EFL(%ebp) # Swap + pushl %eax # Put EAX + popf # in eflags + movl 0x8(%esp,1),%eax # Load EBP + xchgl %eax,V86_EBP(%ebp) # Swap + movl %eax,0x8(%esp,1) # Save EBP + popl %eax # Restore + xchgl %esi,V86_ESI(%ebp) # Swap ESI + xchgl %edi,V86_EDI(%ebp) # Swap EDI + xchgl %ebp,0x4(%esp,1) # Swap pointer, EBP + ret # To caller +# +# V86 interface structure. +# + .comm __v86,SIZ_V86