Use the "small" model for the init code (split code/data). This will enable

us to use the same CS for resident and init code for Watcom (Borland's
too big), and share a bit.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@859 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-04-10 10:59:57 +00:00
parent 512f48e962
commit e6e3b7a3a4
4 changed files with 27 additions and 19 deletions

View File

@ -82,8 +82,13 @@ void __int__(int);
#define VA_CDECL #define VA_CDECL
#define PASCAL pascal #define PASCAL pascal
#define __int__(intno) asm int intno; #define __int__(intno) asm int intno;
#define _SS SS() #define _CS getCS()
static unsigned short __inline SS(void) static unsigned short __inline getCS(void)
{
asm mov ax, cs;
}
#define _SS getSS()
static unsigned short __inline getSS(void)
{ {
asm mov ax, ss; asm mov ax, ss;
} }
@ -97,9 +102,12 @@ static unsigned short __inline SS(void)
#define CDECL __cdecl #define CDECL __cdecl
#define VA_CDECL #define VA_CDECL
#define PASCAL pascal #define PASCAL pascal
#define _SS SS() #define _CS getCS()
unsigned short SS(void); unsigned short getCS(void);
#pragma aux SS = "mov dx,ss" value [dx]; #pragma aux getCS = "mov dx,cs" value [dx] modify exact[dx];
#define _SS getSS()
unsigned short getSS(void);
#pragma aux getSS = "mov dx,ss" value [dx] modify exact[dx];
/* enable Possible loss of precision warning for compatibility with Borland */ /* enable Possible loss of precision warning for compatibility with Borland */
#pragma enable_message(130) #pragma enable_message(130)

View File

@ -119,23 +119,28 @@ kernel_start:
pop bx pop bx
pop ax pop ax
mov ax,cs mov ax,seg init_tos
cli cli
mov ss,ax mov ss,ax
mov sp,init_tos mov sp,init_tos
int 12h ; move the init code to higher memory int 12h ; move the init code to higher memory
mov cl,6 mov cl,6
shl ax,cl shl ax,cl
mov dx,init_end+15 mov dx,15 + init_end wrt INIT_TEXT
mov cl,4 mov cl,4
shr dx,cl shr dx,cl
sub ax,dx sub ax,dx
mov es,ax mov es,ax
mov dx,__INIT_DATA_START wrt INIT_TEXT
shr dx,cl
add ax,dx
mov ss,ax ; set SS to init data segment
sti ; now enable them
mov ax,cs mov ax,cs
mov ds,ax mov ds,ax
xor si,si xor si,si
xor di,di xor di,di
mov cx,init_end+1 mov cx,1 + init_end wrt INIT_TEXT
shr cx,1 shr cx,1
cld cld
rep movsw rep movsw
@ -143,14 +148,10 @@ kernel_start:
mov ax,cont mov ax,cont
push ax push ax
retf retf
cont: mov ax,cs cont: ; Now set up call frame
mov ss,ax
; Now set up call frame
mov ds,[cs:_INIT_DGROUP] mov ds,[cs:_INIT_DGROUP]
mov bp,sp ; and set up stack frame for c mov bp,sp ; and set up stack frame for c
sti ; now enable them
push ax
push bx push bx
pushf pushf
mov ax, 0e33h ; '3' Tracecode - kernel entered mov ax, 0e33h ; '3' Tracecode - kernel entered
@ -158,7 +159,6 @@ cont: mov ax,cs
int 010h int 010h
popf popf
pop bx pop bx
pop ax
mov byte [_BootDrive],bl ; tell where we came from mov byte [_BootDrive],bl ; tell where we came from

View File

@ -227,8 +227,7 @@ STATIC void init_kernel(void)
ram_top = init_oem(); ram_top = init_oem();
/* move kernel to high conventional RAM, just below the init code */ /* move kernel to high conventional RAM, just below the init code */
lpTop = MK_FP(ram_top * 64 - (FP_OFF(_init_end) + 15) / 16 - lpTop = MK_FP(_CS - (FP_OFF(_HMATextEnd) + 15) / 16, 0);
(FP_OFF(_HMATextEnd) + 15) / 16, 0);
MoveKernel(FP_SEG(lpTop)); MoveKernel(FP_SEG(lpTop));
lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0); lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0);

View File

@ -31,7 +31,8 @@ group PGROUP PSP
group LGROUP _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT group LGROUP _LOWTEXT _IO_TEXT _IO_FIXED_DATA _TEXT
group DGROUP _FIXED_DATA _BSS _DATA _DATAEND CONST CONST2 DCONST DYN_DATA group DGROUP _FIXED_DATA _BSS _DATA _DATAEND CONST CONST2 DCONST DYN_DATA
group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END
group I_GROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END ID_B ID ID_E IC IDATA ICONST ICONST2 I_DATA IB_B I_BSS IB IB_E group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END
group I_GROUP ID_B ID ID_E IC IDATA ICONST ICONST2 I_DATA IB_B I_BSS IB IB_E
segment PSP class=PSP segment PSP class=PSP
segment _LOWTEXT class=LCODE segment _LOWTEXT class=LCODE
@ -54,7 +55,7 @@ segment HMA_TEXT_END class=CODE
segment INIT_TEXT_START class=CODE align=16 segment INIT_TEXT_START class=CODE align=16
segment INIT_TEXT class=CODE segment INIT_TEXT class=CODE
segment INIT_TEXT_END class=CODE segment INIT_TEXT_END class=CODE
segment ID_B class=ID align=2 segment ID_B class=ID align=16
segment ID class=ID align=2 segment ID class=ID align=2
segment ID_E class=ID align=2 segment ID_E class=ID align=2
segment IDATA class=ID align=2 segment IDATA class=ID align=2