From 4e01c9c496fd823cf8846ed21d401f6df0717814 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Sat, 21 Mar 1998 15:44:26 +0000 Subject: Added BSP specific start since it had become VERY complex to attempt to share the start code across i386 BSPs. --- c/src/lib/libbsp/i386/force386/Makefile.in | 2 +- c/src/lib/libbsp/i386/force386/start/Makefile.in | 57 +++++ c/src/lib/libbsp/i386/force386/start/start.s | 267 +++++++++++++++++++++++ 3 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libbsp/i386/force386/start/Makefile.in create mode 100644 c/src/lib/libbsp/i386/force386/start/start.s (limited to 'c/src/lib/libbsp') diff --git a/c/src/lib/libbsp/i386/force386/Makefile.in b/c/src/lib/libbsp/i386/force386/Makefile.in index 7a8d6260ed..47328bffdf 100644 --- a/c/src/lib/libbsp/i386/force386/Makefile.in +++ b/c/src/lib/libbsp/i386/force386/Makefile.in @@ -13,4 +13,4 @@ include $(RTEMS_ROOT)/make/directory.cfg # wrapup is the one that actually builds and installs the library # from the individual .rel files built in other directories -SUB_DIRS=include startup clock console shmsupp timer wrapup +SUB_DIRS=include start startup clock console shmsupp timer wrapup diff --git a/c/src/lib/libbsp/i386/force386/start/Makefile.in b/c/src/lib/libbsp/i386/force386/start/Makefile.in new file mode 100644 index 0000000000..388e25b482 --- /dev/null +++ b/c/src/lib/libbsp/i386/force386/start/Makefile.in @@ -0,0 +1,57 @@ +# +# $Id$ +# + +@SET_MAKE@ +srcdir = @srcdir@ +VPATH = @srcdir@ +RTEMS_ROOT = @top_srcdir@ +PROJECT_ROOT = @PROJECT_ROOT@ + +PGMS=${ARCH}/start.o + +# C source names, if any, go here -- minus the .c +C_PIECES= +C_FILES=$(C_PIECES:%=%.c) +C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) + +H_FILES= + +# Assembly source names, if any, go here -- minus the .s +S_PIECES=start +S_FILES=$(S_PIECES:%=%.s) +S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o) + +SRCS=$(C_FILES) $(H_FILES) $(S_FILES) +OBJS=$(C_O_FILES) $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg +include $(RTEMS_ROOT)/make/leaf.cfg + +# +# (OPTIONAL) Add local stuff here using += +# + +DEFINES += +CPPFLAGS += +CFLAGS += + +LD_PATHS += +LD_LIBS += +LDFLAGS += + +# +# Add your list of files to delete here. The config files +# already know how to delete some stuff, so you may want +# to just run 'make clean' first to see what gets missed. +# 'make clobber' already includes 'make clean' +# + +CLEAN_ADDITIONS += +CLOBBER_ADDITIONS += + +all: ${ARCH} $(SRCS) $(OBJS) $(PGM) + $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib + +# Install the program(s), appending _g or _p as appropriate. +# for include files, just use $(INSTALL) diff --git a/c/src/lib/libbsp/i386/force386/start/start.s b/c/src/lib/libbsp/i386/force386/start/start.s new file mode 100644 index 0000000000..c1d0ffd099 --- /dev/null +++ b/c/src/lib/libbsp/i386/force386/start/start.s @@ -0,0 +1,267 @@ +/* start.s + * + * This file contains the entry point for the application. + * The name of this entry point is compiler dependent. + * It jumps to the BSP which is responsible for performing + * all initialization. + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include "asm.h" + +/* + * A Descriptor table register has the following format + */ + +.set DTR_LIMIT, 0 # offset of two byte limit +.set DTR_BASE, 2 # offset of four byte base address +.set DTR_SIZE, 6 # size of DTR register + + BEGIN_DATA + EXTERN (Do_Load_IDT) + EXTERN (Do_Load_GDT) + END_DATA + + BEGIN_CODE + + PUBLIC (start) # GNU default entry point + + EXTERN (boot_card) + EXTERN (load_segments) + EXTERN (exit) + +SYM (start): + nop + cli # DISABLE INTERRUPTS!!! +/* + * Load the segment registers + * + * NOTE: Upon return, gs will contain the segment descriptor for + * a segment which maps directly to all of physical memory. + */ + jmp SYM (_load_segments) # load board dependent segments + +/* + * Set up the stack + */ + + PUBLIC (_establish_stack) +SYM (_establish_stack): + + movl $end,eax # eax = end of bss/start of heap + addl $heap_size,eax # eax = end of heap + movl eax,stack_start # Save for brk() routine + addl $stack_size,eax # make room for stack + andl $0xffffffc0,eax # align it on 16 byte boundary + movl eax,esp # set stack pointer + movl eax,ebp # set base pointer +/* + * Zero out the BSS segment + */ +SYM (zero_bss): + cld # make direction flag count up + movl $ SYM (end),ecx # find end of .bss + movl $ SYM (_bss_start),edi # edi = beginning of .bss + subl edi,ecx # ecx = size of .bss in bytes + shrl ecx # size of .bss in longs + shrl ecx + xorl eax,eax # value to clear out memory + repne # while ecx != 0 + stosl # clear a long in the bss + +/* + * Copy the Global Descriptor Table to our space + */ + + sgdt SYM (_Original_GDTR) # save original GDT + movzwl SYM (_Original_GDTR)+DTR_LIMIT,ecx + /* size of GDT in bytes; limit is */ + /* 8192 entries * 8 bytes per */ + + /* + * make ds:esi point to the original GDT + */ + + movl SYM (_Original_GDTR)+DTR_BASE,esi + push ds # save ds + movw gs,ax + movw ax,ds + + /* + * make es:edi point to the new (our copy) GDT + */ + + movl $ SYM (_Global_descriptor_table),edi + + rep + movsb # copy the GDT (ds:esi -> es:edi) + + pop ds # restore ds + + /* + * Build and load new contents of GDTR + */ + movw SYM (_Original_GDTR)+DTR_LIMIT,ecx # set new limit + movw cx, SYM (_New_GDTR)+DTR_LIMIT + + push $ SYM (_Global_descriptor_table) + push es + call SYM (i386_Logical_to_physical) + addl $6,esp + movl eax, SYM (_New_GDTR)+DTR_BASE # set new base + + cmpb $0, SYM (_Do_Load_GDT) # Should the new GDT be loaded? + je SYM (no_gdt_load) # NO, then branch + lgdt SYM (_New_GDTR) # load the new GDT +SYM (no_gdt_load): + +/* + * Copy the Interrupt Descriptor Table to our space + */ + + sidt SYM (_Original_IDTR) # save original IDT + movzwl SYM (_Original_IDTR)+DTR_LIMIT,ecx + /* size of IDT in bytes; limit is */ + /* 256 entries * 8 bytes per */ + + + /* + * make ds:esi point to the original IDT + */ + movl SYM (_Original_IDTR)+DTR_BASE,esi + + push ds # save ds + movw gs,ax + movw ax,ds + + /* + * make es:edi point to the new (our copy) IDT + */ + movl $ SYM (Interrupt_descriptor_table),edi + + rep + movsb # copy the IDT (ds:esi -> es:edi) + pop ds # restore ds + + /* + * Build and load new contents of IDTR + */ + movw SYM (_Original_IDTR+DTR_LIMIT),ecx # set new limit + movw cx,SYM (_New_IDTR)+DTR_LIMIT + + push $ SYM (Interrupt_descriptor_table) + push es + call SYM (i386_Logical_to_physical) + addl $6,esp + movl eax, SYM (_New_IDTR)+DTR_BASE # set new base + + cmpb $0, SYM (_Do_Load_IDT) # Should the new IDT be loaded? + je SYM (no_idt_load) # NO, then branch + lidt SYM (_New_IDTR) # load the new IDT +SYM (no_idt_load): + +/* + * Initialize the i387. + * + * Using the NO WAIT form of the instruction insures that + * if it is not present the board will not lock up or get an + * exception. + */ + + fninit # MUST USE NO-WAIT FORM + +/* + * Transfer control to User's Board Support Package + */ + pushl $0 # environp + pushl $0 # argv + pushl $0 # argc + call SYM (boot_card) + addl $12,esp + +/* + * Clean up + */ + + EXTERN (return_to_monitor) + + PUBLIC (Bsp_cleanup) +SYM (Bsp_cleanup): + cmpb $0, SYM (_Do_Load_IDT) # Was the new IDT loaded? + je SYM (no_idt_restore) # NO, then branch + lidt SYM (_Original_IDTR) # restore the new IDT +SYM (no_idt_restore): + + cmpb $0, SYM (_Do_Load_GDT) # Was the new GDT loaded? + je SYM (no_gdt_restore) # NO, then branch + lgdt SYM (_Original_GDTR) # restore the new GDT +SYM (no_gdt_restore): + jmp SYM (_return_to_monitor) + +END_CODE + +BEGIN_DATA + + .align 2 + PUBLIC (start_frame) +SYM (start_frame): + .long 0 + + PUBLIC (stack_start) +SYM (stack_start): + .long 0 + +END_DATA + +BEGIN_BSS + + PUBLIC(heap_size) + .set heap_size,0x2000 + + PUBLIC(stack_size) + .set stack_size,0x1000 + + PUBLIC (Interrupt_descriptor_table) +SYM (Interrupt_descriptor_table): + .space 256*8 + + PUBLIC (_Original_IDTR) +SYM (_Original_IDTR): + .space DTR_SIZE + + PUBLIC (_New_IDTR) +SYM (_New_IDTR): + .space DTR_SIZE + + PUBLIC (_Global_descriptor_table) +SYM (_Global_descriptor_table): + .space 8192*8 + + PUBLIC (_Original_GDTR) +SYM (_Original_GDTR): + .space DTR_SIZE + + PUBLIC (_New_GDTR) +SYM (_New_GDTR): + .space DTR_SIZE + + PUBLIC (_Physical_base_of_ds) +SYM (_Physical_base_of_ds): + .space 4 + + PUBLIC (_Physical_base_of_cs) +SYM (_Physical_base_of_cs): + .space 4 + +END_BSS +END -- cgit v1.2.3