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-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"
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
|