129,10 → 129,14 |
public _rd_root |
public _rd_root_end |
|
|
extrn __edata |
|
extrn _16bit_start |
extrn _16bit_end |
|
extrn _enter_bootscreen |
extrn _poweroff |
|
extrn _init |
extrn _init_mm |
213,31 → 217,6 |
mov [cpu_caps], eax |
mov [cpu_caps+4], eax |
|
pushfd |
pop eax |
mov ecx, eax |
xor eax, 0x40000 |
push eax |
popfd |
pushfd |
pop eax |
xor eax, ecx |
mov [cpu_type], CPU_386 |
jz .end_cpuid |
push ecx |
popfd |
|
mov [cpu_type], CPU_486 |
mov eax, ecx |
xor eax, 0x200000 |
push eax |
popfd |
pushfd |
pop eax |
xor eax, ecx |
je .end_cpuid |
mov [cpu_id], 1 |
|
xor eax, eax |
cpuid |
|
299,6 → 278,9 |
endp |
|
align 4 |
_copy_pg_balloc dd 0 |
|
|
_high_code: |
|
mov ax,os_stack |
331,6 → 313,9 |
call test_cpu |
call _init |
|
mov eax, [_pg_balloc] |
mov [_copy_pg_balloc], eax |
|
mov [tss._ss0], os_stack |
mov [tss._esp0], __os_stack |
mov [tss._esp], __os_stack |
351,6 → 336,8 |
mov ax,tss0 |
ltr ax |
|
__core_restart: |
|
mov ecx, 1280*1024 |
fastcall _balloc |
mov [_display_data], eax |
5171,128 → 5158,77 |
call sys_cd_audio |
|
yes_shutdown_param: |
|
cli |
|
mov eax, kernel_file ; load kernel.mnt to 0x7000:0 |
push 12 |
pop esi |
xor ebx,ebx |
or ecx,-1 |
mov edx, OS_BASE+0x70000 |
call fileread |
cmp byte [BOOT_VAR+0x9030], 3 |
je _sys_reboot |
|
; mov esi, restart_kernel_4000+OS_BASE+0x10000 ; move kernel re-starter to 0x4000:0 |
; mov edi,OS_BASE+0x40000 |
; mov ecx,1000 |
; rep movsb |
cmp byte [BOOT_VAR+0x9030], 4 |
je _sys_restart |
|
cld |
mov esi, BOOT_VAR ; restore 0x0 - 0xffff |
mov edi, OS_BASE |
mov ecx,0x10000/4 |
cld |
rep movsd |
|
call restorefatchain |
mov esi, _16bit_start + OS_BASE |
mov ecx, _16bit_end |
shr ecx, 2 |
mov edi, _16BIT_BASE + OS_BASE |
rep movsd |
|
mov al, 0xFF |
out 0x21, al |
out 0xA1, al |
mov dword [_sys_pdbr], PG_LARGE+PG_SW |
mov eax, _sys_pdbr + (0x100000000-OS_BASE) |
mov cr3, eax |
|
if 1 |
; mov word [OS_BASE+0x467+0],pr_mode_exit |
; mov word [OS_BASE+0x467+2],0x1000 |
jmp far 0x60:_poweroff; |
|
mov al,0x0F |
out 0x70,al |
mov al,0x05 |
out 0x71,al |
|
mov al,0xFE |
out 0x64,al |
_sys_restart: |
|
hlt |
mov ax,os_stack |
mov dx,app_data |
mov ss,ax |
mov esp, __os_stack |
|
else |
cmp byte [OS_BASE + 0x9030], 2 |
jnz no_acpi_power_off |
mov ds, dx |
mov es, dx |
mov fs, dx |
mov gs, dx |
|
; scan for RSDP |
; 1) The first 1 Kb of the Extended BIOS Data Area (EBDA). |
movzx eax, word [OS_BASE + 0x40E] |
shl eax, 4 |
jz @f |
mov ecx, 1024/16 |
call scan_rsdp |
jnc .rsdp_found |
@@: |
; 2) The BIOS read-only memory space between 0E0000h and 0FFFFFh. |
mov eax, 0xE0000 |
mov ecx, 0x2000 |
call scan_rsdp |
jc no_acpi_power_off |
.rsdp_found: |
mov esi, [eax+16] ; esi contains physical address of the RSDT |
mov ebp, [ipc_tmp] |
stdcall map_page, ebp, esi, PG_MAP |
lea eax, [esi+1000h] |
lea edx, [ebp+1000h] |
stdcall map_page, edx, eax, PG_MAP |
and esi, 0xFFF |
add esi, ebp |
cmp dword [esi], 'RSDT' |
jnz no_acpi_power_off |
mov ecx, [esi+4] |
sub ecx, 24h |
jbe no_acpi_power_off |
call restorefatchain |
|
cld |
mov esi, BOOT_VAR ; restore 0x0 - 0xffff |
mov edi, OS_BASE |
mov ecx,0x10000/4 |
rep movsd |
|
mov eax, [_copy_pg_balloc] |
mov [_pg_balloc], eax |
|
mov dword [_sys_pdbr], PG_LARGE+PG_SW |
mov eax, _sys_pdbr + (0x100000000-OS_BASE) |
mov cr3, eax |
|
mov ecx, LAST_PAGE |
mov edi, cur_saved_data |
sub edi, OS_BASE |
sub ecx, edi |
shr ecx, 2 |
add esi, 24h |
.scan_fadt: |
lodsd |
mov ebx, eax |
lea eax, [ebp+2000h] |
stdcall map_page, eax, ebx, PG_MAP |
lea eax, [ebp+3000h] |
add ebx, 0x1000 |
stdcall map_page, eax, ebx, PG_MAP |
and ebx, 0xFFF |
lea ebx, [ebx+ebp+2000h] |
cmp dword [ebx], 'FACP' |
jz .fadt_found |
loop .scan_fadt |
jmp no_acpi_power_off |
.fadt_found: |
; ebx is linear address of FADT |
mov edx, [ebx+48] |
test edx, edx |
jz .nosmi |
mov al, [ebx+52] |
out dx, al |
mov edx, [ebx+64] |
@@: |
in ax, dx |
test al, 1 |
jz @b |
.nosmi: |
mov edx, [ebx+64] |
in ax, dx |
and ax, 203h |
or ax, 3C00h |
out dx, ax |
mov edx, [ebx+68] |
test edx, edx |
jz @f |
in ax, dx |
and ax, 203h |
or ax, 3C00h |
out dx, ax |
@@: |
jmp $ |
xor eax, eax |
rep stosd |
|
call test_cpu |
|
no_acpi_power_off: |
mov word [OS_BASE+0x467+0],pr_mode_exit |
mov word [OS_BASE+0x467+2],0x1000 |
; jmp __core_restart |
|
_sys_reboot: |
mov word [OS_BASE+0x467+0],0xFFF0 |
mov word [OS_BASE+0x467+2],0xF000 |
|
mov al,0x0F |
out 0x70,al |
mov al,0x05 |
5303,30 → 5239,6 |
|
hlt |
|
scan_rsdp: |
add eax, OS_BASE |
.s: |
cmp dword [eax], 'RSD ' |
jnz .n |
cmp dword [eax+4], 'PTR ' |
jnz .n |
xor edx, edx |
xor esi, esi |
@@: |
add dl, [eax+esi] |
inc esi |
cmp esi, 20 |
jnz @b |
test dl, dl |
jz .ok |
.n: |
add eax, 10h |
loop .s |
stc |
.ok: |
ret |
end if |
|
include "data32.inc" |
|
__REV__ = __REV |