summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/force386/startup/ldsegs.s
blob: 0085e1d38a71e91432e31ef6d3e1878a0e294584 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*  _load_segments
 *
 *  This file assists the board independent startup code by
 *  loading the proper segment register values.  The values
 *  loaded are board dependent.
 *
 *  NOTE:  No stack has been established when this routine
 *         is invoked.  It returns by jumping back to bspentry.
 *
 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
 *  On-Line Applications Research Corporation (OAR).
 *  All rights assigned to U.S. Government, 1994.
 *
 *  This material may be reproduced by or for the U.S. Government pursuant
 *  to the copyright license under the clause at DFARS 252.227-7013.  This
 *  notice must appear in all copies of this file and its derivatives.
 *
 *  $Id$
 */

#include "asm.h"

BEGIN_CODE

/*
 *  FORCEBUG loads us into a virtual address space which
 *  really starts at PHYSICAL_ADDRESS_BASE.
 */

.set PHYSICAL_ADDRESS_BASE,    0x00002000

/*
 *  At reset time, FORCEBUG normally has the segment selectors preloaded.
 *  If a human resets the instruction pointer, this will not have occurred.
 *  However, no guarantee can be made of the other registers if cs:ip was
 *  modified to restart the program.  Because of this, the BSP reloads all
 *  segment registers (except cs) with the values they have following
 *  a reset.
 */


.set RESET_SS, 0x40        # initial value of stack segment register
.set RESET_DS, 0x40        # initial value of data segment register
.set RESET_ES, 0x40        # initial value of extra segment register
.set RESET_FS, 0x40        # initial value of "f" segment register
.set RESET_GS, 0x30        # initial value of "g" segment register


#define LOAD_SEGMENTS(_value,_segment) \
        movw      $ ## _value, ax ; \
        movw      ax, _segment

        EXTERN (establish_stack)

        PUBLIC (_load_segments)
SYM (_load_segments):
        LOAD_SEGMENTS( RESET_SS, ss )
        LOAD_SEGMENTS( RESET_DS, ds )
        LOAD_SEGMENTS( RESET_ES, es )
        LOAD_SEGMENTS( RESET_FS, fs )
        LOAD_SEGMENTS( RESET_GS, gs )

        jmp     SYM (_establish_stack)  # return to the bsp entry code

        PUBLIC (_return_to_monitor)
SYM (_return_to_monitor):

        call    SYM (Clock_exit)
        movb    $0,al
        int     $0x20                   # restart FORCEbug
        jmp     SYM (start)             # FORCEbug does not reset PC

END_CODE

BEGIN_DATA

        PUBLIC (_Do_Load_IDT)
SYM (_Do_Load_IDT):
       .byte 1

        PUBLIC (_Do_Load_GDT)
SYM (_Do_Load_GDT):
       .byte 0

END_DATA
END