mirror of https://github.com/FDOS/kernel.git
Make CS the same for INIT and HMA text for Watcom. Move HMA text up
in kernel.asm. Use std for the memory move: helps if there's overlap (PCs with a very low amount of RAM). git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@860 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
e6e3b7a3a4
commit
147f4069e4
|
@ -330,22 +330,8 @@ void MoveKernel(unsigned NewKernelSegment)
|
||||||
|
|
||||||
if (NewKernelSegment < CurrentKernelSegment ||
|
if (NewKernelSegment < CurrentKernelSegment ||
|
||||||
NewKernelSegment == 0xffff)
|
NewKernelSegment == 0xffff)
|
||||||
{
|
fmemcpy(HMADest, HMASource, len);
|
||||||
unsigned i;
|
/* else it's the very first relocation: handled by kernel.asm */
|
||||||
UBYTE FAR *s, FAR * d;
|
|
||||||
|
|
||||||
for (i = 0, s = HMASource, d = HMADest; i < len; i++)
|
|
||||||
d[i] = s[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* might overlap */
|
|
||||||
unsigned i;
|
|
||||||
UBYTE FAR *s, FAR * d;
|
|
||||||
|
|
||||||
for (i = len, s = HMASource, d = HMADest; i != 0; i--)
|
|
||||||
d[i] = s[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
HMAFree = (FP_OFF(HMADest) + len + 0xf) & 0xfff0;
|
HMAFree = (FP_OFF(HMADest) + len + 0xf) & 0xfff0;
|
||||||
/* first free byte after HMA_TEXT on 16 byte boundary */
|
/* first free byte after HMA_TEXT on 16 byte boundary */
|
||||||
|
|
|
@ -109,7 +109,6 @@ segment INIT_TEXT
|
||||||
;
|
;
|
||||||
kernel_start:
|
kernel_start:
|
||||||
|
|
||||||
push ax
|
|
||||||
push bx
|
push bx
|
||||||
pushf
|
pushf
|
||||||
mov ax, 0e32h ; '2' Tracecode - kernel entered
|
mov ax, 0e32h ; '2' Tracecode - kernel entered
|
||||||
|
@ -117,13 +116,12 @@ kernel_start:
|
||||||
int 010h
|
int 010h
|
||||||
popf
|
popf
|
||||||
pop bx
|
pop bx
|
||||||
pop ax
|
|
||||||
|
|
||||||
mov ax,seg init_tos
|
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 init text+data to higher memory
|
||||||
mov cl,6
|
mov cl,6
|
||||||
shl ax,cl
|
shl ax,cl
|
||||||
mov dx,15 + init_end wrt INIT_TEXT
|
mov dx,15 + init_end wrt INIT_TEXT
|
||||||
|
@ -137,13 +135,43 @@ kernel_start:
|
||||||
mov ss,ax ; set SS to init data segment
|
mov ss,ax ; set SS to init data segment
|
||||||
sti ; now enable them
|
sti ; now enable them
|
||||||
mov ax,cs
|
mov ax,cs
|
||||||
|
mov dx,__InitTextStart wrt HMA_TEXT
|
||||||
|
%ifdef WATCOM
|
||||||
|
mov cx,dx
|
||||||
|
shr cx,4
|
||||||
|
add ax,cx
|
||||||
|
%endif
|
||||||
mov ds,ax
|
mov ds,ax
|
||||||
xor si,si
|
mov cx,-2 + init_end wrt INIT_TEXT
|
||||||
xor di,di
|
mov si,cx
|
||||||
mov cx,1 + init_end wrt INIT_TEXT
|
mov di,cx
|
||||||
shr cx,1
|
shr cx,1
|
||||||
cld
|
inc cx
|
||||||
|
std ; if there's overlap only std is safe
|
||||||
rep movsw
|
rep movsw
|
||||||
|
|
||||||
|
; move HMA_TEXT to higher memory
|
||||||
|
mov cx,dx ; cx = __InitTextStart wrt HMA_TEXT
|
||||||
|
shr dx,4
|
||||||
|
|
||||||
|
sub ax,dx
|
||||||
|
mov ds,ax ; ds = HMA_TEXT
|
||||||
|
mov ax,es
|
||||||
|
sub ax,dx
|
||||||
|
mov es,ax ; es = new HMA_TEXT
|
||||||
|
|
||||||
|
mov si,cx
|
||||||
|
dec si
|
||||||
|
dec si
|
||||||
|
mov di,si
|
||||||
|
shr cx,1
|
||||||
|
rep movsw
|
||||||
|
|
||||||
|
cld
|
||||||
|
%ifndef WATCOM ; for WATCOM: CS equal for HMA and INIT
|
||||||
|
add ax,dx
|
||||||
|
mov es,ax ; otherwise CS -> init_text
|
||||||
|
%endif
|
||||||
push es
|
push es
|
||||||
mov ax,cont
|
mov ax,cont
|
||||||
push ax
|
push ax
|
||||||
|
|
|
@ -227,7 +227,11 @@ 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 */
|
||||||
|
#ifdef __WATCOMC__
|
||||||
|
lpTop = MK_FP(_CS, 0);
|
||||||
|
#else
|
||||||
lpTop = MK_FP(_CS - (FP_OFF(_HMATextEnd) + 15) / 16, 0);
|
lpTop = MK_FP(_CS - (FP_OFF(_HMATextEnd) + 15) / 16, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
MoveKernel(FP_SEG(lpTop));
|
MoveKernel(FP_SEG(lpTop));
|
||||||
lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0);
|
lpTop = MK_FP(FP_SEG(lpTop) - 0xfff, 0xfff0);
|
||||||
|
|
|
@ -30,8 +30,12 @@
|
||||||
group PGROUP PSP
|
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
|
||||||
|
%ifdef WATCOM
|
||||||
|
group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END INIT_TEXT_START INIT_TEXT INIT_TEXT_END
|
||||||
|
%else
|
||||||
group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END
|
group TGROUP HMA_TEXT_START HMA_TEXT HMA_TEXT_END
|
||||||
group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END
|
group IGROUP INIT_TEXT_START INIT_TEXT INIT_TEXT_END
|
||||||
|
%endif
|
||||||
group I_GROUP ID_B ID ID_E IC IDATA ICONST ICONST2 I_DATA IB_B I_BSS IB IB_E
|
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
|
||||||
|
|
|
@ -62,7 +62,7 @@ MATH_INSERT=+i4m
|
||||||
#
|
#
|
||||||
|
|
||||||
ALLCFLAGS=-I..\hdr $(TARGETOPT) $(ALLCFLAGS)-zq-os-s-e5-j-zl-zp1-wx-we-zgf-zff-r
|
ALLCFLAGS=-I..\hdr $(TARGETOPT) $(ALLCFLAGS)-zq-os-s-e5-j-zl-zp1-wx-we-zgf-zff-r
|
||||||
INITCFLAGS=$(ALLCFLAGS)-ntINIT_TEXT-ndI
|
INITCFLAGS=$(ALLCFLAGS)-ntINIT_TEXT-gTGROUP-ndI
|
||||||
CFLAGS=$(ALLCFLAGS)-ntHMA_TEXT
|
CFLAGS=$(ALLCFLAGS)-ntHMA_TEXT
|
||||||
INITPATCH=..\utils\patchobj __U4D=_IU4D __U4M=_IU4M
|
INITPATCH=..\utils\patchobj __U4D=_IU4D __U4M=_IU4M
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue