forked from KolibriOS/kolibrios
sync with trunk #913
git-svn-id: svn://kolibrios.org@914 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a26689b104
commit
c01a33cfa5
@ -277,18 +277,22 @@ int sys_exec(char *path, char *cmdline, u32_t flags)
|
|||||||
( raw[1] == 0x30305445) ) )
|
( raw[1] == 0x30305445) ) )
|
||||||
|
|
||||||
{
|
{
|
||||||
DBG("leagacy Kolibri application\n");
|
DBG("leagacy Kolibri application");
|
||||||
int tmp = mnt_exec(raw, raw_size, path, cmdline, flags);
|
int tmp = mnt_exec(raw, raw_size, path, cmdline, flags);
|
||||||
|
DBG(" pid %x\n",tmp);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ! validate_pe(raw, raw_size) )
|
if( ! validate_pe(raw, raw_size, true) )
|
||||||
{
|
{
|
||||||
DBG("invalid executable file %s\n", path);
|
DBG("invalid executable file %s\n", path);
|
||||||
mem_free(raw);
|
mem_free(raw);
|
||||||
return -31;
|
return -31;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dos = (PIMAGE_DOS_HEADER)raw;
|
||||||
|
nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
|
||||||
|
|
||||||
pathsize = strlen(path)+1;
|
pathsize = strlen(path)+1;
|
||||||
|
|
||||||
if( cmdline )
|
if( cmdline )
|
||||||
@ -359,8 +363,7 @@ int sys_exec(char *path, char *cmdline, u32_t flags)
|
|||||||
DBG("create stack at %x\n\tpath %x\n\tcmdline %x\n",
|
DBG("create stack at %x\n\tpath %x\n\tcmdline %x\n",
|
||||||
ex_stack, ex_stack->path, ex_stack->cmdline);
|
ex_stack, ex_stack->path, ex_stack->cmdline);
|
||||||
|
|
||||||
pe_app_param(path, raw, ex_pg_dir, ex_stack);
|
return pe_app_param(path, raw, ex_pg_dir, ex_stack);
|
||||||
return 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define master_tab (page_tabs+ (page_tabs>>10))
|
#define master_tab (page_tabs+ (page_tabs>>10))
|
||||||
@ -394,6 +397,10 @@ void sys_app_entry(addr_t raw, thr_stack_t *thr_stack, exec_stack_t *ex_stack)
|
|||||||
|
|
||||||
size_t img_size;
|
size_t img_size;
|
||||||
count_t img_pages;
|
count_t img_pages;
|
||||||
|
size_t stack_size;
|
||||||
|
addr_t img_stack;
|
||||||
|
addr_t *pte;
|
||||||
|
|
||||||
count_t i;
|
count_t i;
|
||||||
u32_t tmp;
|
u32_t tmp;
|
||||||
|
|
||||||
@ -408,18 +415,26 @@ void sys_app_entry(addr_t raw, thr_stack_t *thr_stack, exec_stack_t *ex_stack)
|
|||||||
|
|
||||||
list_initialize(¤t_slot->dll_list);
|
list_initialize(¤t_slot->dll_list);
|
||||||
|
|
||||||
|
pte = (addr_t*)page_tabs;
|
||||||
img_pages = img_size >> 12;
|
img_pages = img_size >> 12;
|
||||||
|
|
||||||
for(i = 0; i < img_pages; i++)
|
stack_size = (nt->OptionalHeader.SizeOfStackReserve + 4095) & ~4095;
|
||||||
{
|
img_stack = 0x7FFFF000 - stack_size;
|
||||||
addr_t page = core_alloc(0);
|
stack_size>>= 12;
|
||||||
((u32_t*)page_tabs)[i] = page | 7; /* FIXME */
|
|
||||||
}
|
while (img_pages--)
|
||||||
|
*pte++ = 2;
|
||||||
|
|
||||||
|
pte = &((addr_t*)page_tabs)[img_stack>>12];
|
||||||
|
|
||||||
|
while(stack_size--)
|
||||||
|
*pte++ = 0x02;
|
||||||
|
|
||||||
addr_t stack_page = ((addr_t)ex_stack-OS_BASE) & ~4095;
|
addr_t stack_page = ((addr_t)ex_stack-OS_BASE) & ~4095;
|
||||||
((u32_t*)page_tabs)[0x7FFFF000>>12] = stack_page | 7;
|
|
||||||
|
|
||||||
create_image(0, raw);
|
*pte = stack_page | 7;
|
||||||
|
|
||||||
|
create_image(0, raw, false);
|
||||||
|
|
||||||
init_user_heap();
|
init_user_heap();
|
||||||
|
|
||||||
@ -430,6 +445,7 @@ void sys_app_entry(addr_t raw, thr_stack_t *thr_stack, exec_stack_t *ex_stack)
|
|||||||
"int $0x40"::"a"(-1));
|
"int $0x40"::"a"(-1));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// __asm__ __volatile__ (
|
// __asm__ __volatile__ (
|
||||||
// "xchgw %bx, %bx");
|
// "xchgw %bx, %bx");
|
||||||
|
|
||||||
@ -481,7 +497,7 @@ dll_t* __fastcall load_dll(const char *path)
|
|||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
if( ! validate_pe(raw, raw_size) )
|
if( ! validate_pe(raw, raw_size, false) )
|
||||||
{
|
{
|
||||||
DBG("invalid pe file %s\n", path);
|
DBG("invalid pe file %s\n", path);
|
||||||
mem_free(raw);
|
mem_free(raw);
|
||||||
@ -508,7 +524,7 @@ dll_t* __fastcall load_dll(const char *path)
|
|||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
create_image(img_base, (addr_t)raw);
|
create_image(img_base, (addr_t)raw, false);
|
||||||
|
|
||||||
mem_free(raw);
|
mem_free(raw);
|
||||||
|
|
||||||
@ -609,20 +625,22 @@ bool link_pe(addr_t img_base)
|
|||||||
{
|
{
|
||||||
PIMAGE_IMPORT_BY_NAME ord;
|
PIMAGE_IMPORT_BY_NAME ord;
|
||||||
addr_t addr;
|
addr_t addr;
|
||||||
|
*iat=0;
|
||||||
|
|
||||||
if ( thunk->u1.AddressOfData == 0 )
|
if ( thunk->u1.AddressOfData == 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
|
if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
|
||||||
{
|
{
|
||||||
// printf(" %4u\n", thunk->u1.Ordinal & 0xFFFF);
|
u16_t ordinal;
|
||||||
|
ordinal = thunk->u1.Ordinal & 0xFFFF;
|
||||||
|
*iat = functions[ordinal-exp->Base] + exp_dll->img_base;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
|
ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
|
||||||
thunk->u1.AddressOfData, img_base);
|
thunk->u1.AddressOfData, img_base);
|
||||||
*iat=0;
|
|
||||||
|
|
||||||
DBG("import %s ", ord->Name);
|
DBG("import %s ", ord->Name);
|
||||||
|
|
||||||
@ -639,7 +657,7 @@ bool link_pe(addr_t img_base)
|
|||||||
{
|
{
|
||||||
u16_t ordinal;
|
u16_t ordinal;
|
||||||
ordinal = ordinals[ind];
|
ordinal = ordinals[ind];
|
||||||
DBG(" \t\tat %x\n", functions[ordinal] + exp_dll->img_base);
|
DBG("ordinal %d\t\tat %x\n", ordinal, functions[ordinal] + exp_dll->img_base);
|
||||||
*iat = functions[ordinal] + exp_dll->img_base;
|
*iat = functions[ordinal] + exp_dll->img_base;
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
|
|
||||||
.section .drectve
|
.section .drectve
|
||||||
.ascii " -export:CreateImage" # cdecl
|
# .ascii " -export:CreateImage" # cdecl
|
||||||
.ascii " -export:LoadFile" # stdcall
|
.ascii " -export:LoadFile" # stdcall
|
||||||
|
|
||||||
.ascii " -export:Kmalloc" # eax FIXME
|
.ascii " -export:Kmalloc" # eax FIXME
|
||||||
|
@ -32,20 +32,20 @@ init_heap:
|
|||||||
sub eax, 4096
|
sub eax, 4096
|
||||||
ret
|
ret
|
||||||
@@:
|
@@:
|
||||||
mov esi, [ebx+APPDATA.mem_size]
|
mov edx, [ebx+APPDATA.mem_size]
|
||||||
add esi, 4095
|
add edx, 4095
|
||||||
and esi, not 4095
|
and edx, not 4095
|
||||||
mov [ebx+APPDATA.mem_size], esi
|
mov [ebx+APPDATA.mem_size], edx
|
||||||
mov eax, HEAP_TOP
|
mov eax, HEAP_TOP
|
||||||
mov [ebx+APPDATA.heap_base], esi
|
mov [ebx+APPDATA.heap_base], edx
|
||||||
mov [ebx+APPDATA.heap_top], eax
|
mov [ebx+APPDATA.heap_top], eax
|
||||||
|
|
||||||
sub eax, esi
|
sub eax, edx
|
||||||
shr esi, 10
|
shr edx, 10
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
sub eax, 4096
|
sub eax, 4096
|
||||||
or ecx, FREE_BLOCK
|
or ecx, FREE_BLOCK
|
||||||
mov [page_tabs+esi], ecx
|
mov [page_tabs+edx], ecx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
@ -40,7 +40,6 @@ static inline void sec_clear(addr_t dst, size_t len)
|
|||||||
|
|
||||||
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
|
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
|
||||||
void __export create_image(addr_t img_base, addr_t raw) asm ("CreateImage");
|
|
||||||
bool link_image(addr_t img_base);
|
bool link_image(addr_t img_base);
|
||||||
|
|
||||||
md_t* __fastcall load_image(const char *path);
|
md_t* __fastcall load_image(const char *path);
|
||||||
@ -59,7 +58,7 @@ void* __fastcall load_pe(const char *path)
|
|||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool validate_pe(void *raw, size_t raw_size)
|
bool validate_pe(void *raw, size_t raw_size, bool is_exec)
|
||||||
{
|
{
|
||||||
PIMAGE_DOS_HEADER dos;
|
PIMAGE_DOS_HEADER dos;
|
||||||
PIMAGE_NT_HEADERS32 nt;
|
PIMAGE_NT_HEADERS32 nt;
|
||||||
@ -80,9 +79,18 @@ bool validate_pe(void *raw, size_t raw_size)
|
|||||||
if(nt->Signature != IMAGE_NT_SIGNATURE)
|
if(nt->Signature != IMAGE_NT_SIGNATURE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if(nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(is_exec && (nt->FileHeader.Characteristics & IMAGE_FILE_DLL))
|
||||||
|
return false;
|
||||||
|
|
||||||
if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
|
if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if( is_exec && nt->OptionalHeader.ImageBase != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE)
|
if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE)
|
||||||
{
|
{
|
||||||
if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
|
if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
|
||||||
@ -127,7 +135,7 @@ md_t* __fastcall load_image(const char *path)
|
|||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
if( ! validate_pe(raw, raw_size) )
|
if( ! validate_pe(raw, raw_size, false) )
|
||||||
{
|
{
|
||||||
DBG("invalid pe file %s\n", path);
|
DBG("invalid pe file %s\n", path);
|
||||||
mem_free(raw);
|
mem_free(raw);
|
||||||
@ -150,7 +158,7 @@ md_t* __fastcall load_image(const char *path)
|
|||||||
|
|
||||||
img_base = img_md->base;
|
img_base = img_md->base;
|
||||||
|
|
||||||
create_image(img_base, (addr_t)raw);
|
create_image(img_base, (addr_t)raw, true);
|
||||||
|
|
||||||
mem_free(raw);
|
mem_free(raw);
|
||||||
|
|
||||||
@ -190,7 +198,7 @@ addr_t get_proc_addr(addr_t module, char *name)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
void create_image(addr_t img_base, addr_t raw)
|
void create_image(addr_t img_base, addr_t raw, bool force_clear)
|
||||||
{
|
{
|
||||||
PIMAGE_DOS_HEADER dos;
|
PIMAGE_DOS_HEADER dos;
|
||||||
PIMAGE_NT_HEADERS32 nt;
|
PIMAGE_NT_HEADERS32 nt;
|
||||||
@ -223,13 +231,16 @@ void create_image(addr_t img_base, addr_t raw)
|
|||||||
if(img_sec->SizeOfRawData)
|
if(img_sec->SizeOfRawData)
|
||||||
sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
|
sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
|
||||||
|
|
||||||
|
if(force_clear)
|
||||||
|
{
|
||||||
sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align;
|
sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align;
|
||||||
|
|
||||||
if(sec_size > img_sec->SizeOfRawData)
|
if(sec_size > img_sec->SizeOfRawData)
|
||||||
sec_clear(dest_ptr + img_sec->SizeOfRawData,
|
sec_clear(dest_ptr + img_sec->SizeOfRawData,
|
||||||
sec_size - img_sec->SizeOfRawData);
|
sec_size - img_sec->SizeOfRawData);
|
||||||
|
};
|
||||||
img_sec++;
|
img_sec++;
|
||||||
}
|
};
|
||||||
|
|
||||||
if(nt->OptionalHeader.DataDirectory[5].Size)
|
if(nt->OptionalHeader.DataDirectory[5].Size)
|
||||||
{
|
{
|
||||||
|
@ -146,11 +146,12 @@ proc mnt_exec stdcall file_base:dword, file_size:dword, \
|
|||||||
test al, al
|
test al, al
|
||||||
jnz @b
|
jnz @b
|
||||||
|
|
||||||
|
lea edi, [cmdline]
|
||||||
|
mov dword [edi],0
|
||||||
mov esi, [cmd_line]
|
mov esi, [cmd_line]
|
||||||
test esi, esi
|
test esi, esi
|
||||||
jz .no_cmdline
|
jz .no_cmdline
|
||||||
|
|
||||||
lea edi, [cmdline]
|
|
||||||
lea ecx, [edi+255]
|
lea ecx, [edi+255]
|
||||||
mov [edi+252], dword 0
|
mov [edi+252], dword 0
|
||||||
@@:
|
@@:
|
||||||
@ -226,8 +227,8 @@ proc mnt_exec stdcall file_base:dword, file_size:dword, \
|
|||||||
|
|
||||||
mov ecx, [hdr_mem]
|
mov ecx, [hdr_mem]
|
||||||
mov edi, [file_size]
|
mov edi, [file_size]
|
||||||
add edi, 4095
|
; add edi, 4095
|
||||||
and edi, not 4095
|
; and edi, not 4095
|
||||||
sub ecx, edi
|
sub ecx, edi
|
||||||
jna @F
|
jna @F
|
||||||
|
|
||||||
@ -246,8 +247,8 @@ proc mnt_exec stdcall file_base:dword, file_size:dword, \
|
|||||||
mov eax, [save_cr3]
|
mov eax, [save_cr3]
|
||||||
call set_cr3
|
call set_cr3
|
||||||
|
|
||||||
mov [application_table_status], 0 ;unlock application_table_status mutex
|
|
||||||
mov eax,[process_number] ;set result
|
mov eax,[process_number] ;set result
|
||||||
|
mov [application_table_status], 0 ;unlock application_table_status mutex
|
||||||
|
|
||||||
pop edi
|
pop edi
|
||||||
pop esi
|
pop esi
|
||||||
@ -433,8 +434,8 @@ proc pe_app_param stdcall path:dword, raw:dword, ex_pg_dir:dword, ex_stack:dword
|
|||||||
|
|
||||||
DEBUGF 1,"%s",new_process_running
|
DEBUGF 1,"%s",new_process_running
|
||||||
.err:
|
.err:
|
||||||
mov [application_table_status], 0 ;unlock application_table_status mutex
|
|
||||||
mov eax,[process_number] ;set result
|
mov eax,[process_number] ;set result
|
||||||
|
mov [application_table_status], 0 ;unlock application_table_status mutex
|
||||||
|
|
||||||
pop edi
|
pop edi
|
||||||
pop esi
|
pop esi
|
||||||
|
@ -3402,9 +3402,9 @@ IPC
|
|||||||
* ebx = 㪠§ â¥«ì ¨§®¡à ¦¥¨¥
|
* ebx = 㪠§ â¥«ì ¨§®¡à ¦¥¨¥
|
||||||
* ecx = [à §¬¥à ¯® ®á¨ x]*65536 + [à §¬¥à ¯® ®á¨ y]
|
* ecx = [à §¬¥à ¯® ®á¨ x]*65536 + [à §¬¥à ¯® ®á¨ y]
|
||||||
* edx = [ª®®à¤¨ â ¯® ®á¨ x]*65536 + [ª®®à¤¨ â ¯® ®á¨ y]
|
* edx = [ª®®à¤¨ â ¯® ®á¨ x]*65536 + [ª®®à¤¨ â ¯® ®á¨ y]
|
||||||
* esi = ç¨á«® ¡¨â ¯¨ªá¥«ì, ¤®«¦® ¡ëâì 8, 16, 24 ¨«¨ 32
|
* esi = ç¨á«® ¡¨â ¯¨ªá¥«ì, ¤®«¦® ¡ëâì 1, 4, 8, 15, 16, 24 ¨«¨ 32
|
||||||
* edi = 㪠§ â¥«ì ¯ «¨âàã (256 梥⮢ 0x00RRGGBB);
|
* edi = 㪠§ â¥«ì ¯ «¨âàã (2 ¢ á⥯¥¨ esi 梥⮢ 0x00RRGGBB);
|
||||||
¨£®à¨àã¥âáï ¯à¨ esi = 16, 24 ¨ 32
|
¨£®à¨àã¥âáï ¯à¨ esi > 8
|
||||||
* ebp = ᬥ饨¥ ¤ ëå ª ¦¤®© á«¥¤ãî饩 áâப¨ ¨§®¡à ¦¥¨ï
|
* ebp = ᬥ饨¥ ¤ ëå ª ¦¤®© á«¥¤ãî饩 áâப¨ ¨§®¡à ¦¥¨ï
|
||||||
®â®á¨â¥«ì® ¯à¥¤ë¤ã饩
|
®â®á¨â¥«ì® ¯à¥¤ë¤ã饩
|
||||||
‚®§¢à é ¥¬®¥ § 票¥:
|
‚®§¢à é ¥¬®¥ § 票¥:
|
||||||
@ -3413,13 +3413,23 @@ IPC
|
|||||||
* Š®®à¤¨ âë ¨§®¡à ¦¥¨ï - íâ® ª®®à¤¨ âë ¢¥à奣® «¥¢®£® 㣫
|
* Š®®à¤¨ âë ¨§®¡à ¦¥¨ï - íâ® ª®®à¤¨ âë ¢¥à奣® «¥¢®£® 㣫
|
||||||
¨§®¡à ¦¥¨ï ®â®á¨â¥«ì® ®ª .
|
¨§®¡à ¦¥¨ï ®â®á¨â¥«ì® ®ª .
|
||||||
* <20> §¬¥à ¨§®¡à ¦¥¨ï ¢ ¡ ©â å ¥áâì xsize*ysize.
|
* <20> §¬¥à ¨§®¡à ¦¥¨ï ¢ ¡ ©â å ¥áâì xsize*ysize.
|
||||||
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 1 ¡¨â®¬ ¯¨ªá¥«ì: ª ¦¤ë© ¡ ©â ¨§®¡à ¦¥¨ï,
|
||||||
|
§ ¨áª«î票¥¬, ¡ëâì ¬®¦¥â, ¯®á«¥¤¨å ¡ ©â®¢ áâப, ᮤ¥à¦¨â
|
||||||
|
¨ä®à¬ æ¨î ® 梥⥠8 ¯¨ªá¥«¥©, áâ à訩 ¡¨â ᮮ⢥âáâ¢ã¥â ¯¥à¢®¬ã
|
||||||
|
¯¨ªá¥«î.
|
||||||
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 4 ¡¨â ¬¨ ¯¨ªá¥«ì: ª ¦¤ë© ¡ ©â ¨§®¡à ¦¥¨ï,
|
||||||
|
§ ¨áª«î票¥¬ ¯®á«¥¤¨å ¡ ©â®¢ áâப (¥á«¨ è¨à¨ ¨§®¡à ¦¥¨ï
|
||||||
|
¥çñâ ), ᮤ¥à¦¨â ¨ä®à¬ æ¨î ® 梥⥠2 ¯¨ªá¥«¥©, áâ àè ï â¥âà ¤
|
||||||
|
ᮮ⢥âáâ¢ã¥â ¯¥à¢®¬ã ¯¨ªá¥«î.
|
||||||
* ”®à¬ â ¨§®¡à ¦¥¨ï á 8 ¡¨â ¬¨ ¯¨ªá¥«ì: ª ¦¤ë© ¡ ©â ¨§®¡à ¦¥¨ï
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 8 ¡¨â ¬¨ ¯¨ªá¥«ì: ª ¦¤ë© ¡ ©â ¨§®¡à ¦¥¨ï
|
||||||
à áᬠâਢ ¥âáï ª ª ¨¤¥ªá ¢ ¯ «¨âà¥.
|
à áᬠâਢ ¥âáï ª ª ¨¤¥ªá ¢ ¯ «¨âà¥.
|
||||||
* …᫨ ¨§®¡à ¦¥¨¥ ¨á¯®«ì§ã¥â ¥ ¢á¥ 256 梥⮢, ¬¥ìè¥,
|
* …᫨ ¨§®¡à ¦¥¨¥ ¨á¯®«ì§ã¥â ¥ ¢á¥ 256 梥⮢, ¬¥ìè¥,
|
||||||
à §¬¥à ¯ «¨âàë ¬®¦¥â ¡ëâì ¬¥ìè¥ 256.
|
à §¬¥à ¯ «¨âàë ¬®¦¥â ¡ëâì ¬¥ìè¥ 256.
|
||||||
* ”®à¬ â ¨§®¡à ¦¥¨ï á 16 ¡¨â ¬¨ ¯¨ªá¥«ì: 梥⠪ ¦¤®£® ¯¨ªá¥«ï
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 15 ¡¨â ¬¨ ¯¨ªá¥«ì: 梥⠪ ¦¤®£® ¯¨ªá¥«ï
|
||||||
ª®¤¨àã¥âáï ª ª (¢ ¡¨â®¢®¬ ¯à¥¤áâ ¢«¥¨¨) 0RRRRRGGGGGBBBBB -
|
ª®¤¨àã¥âáï ª ª (¢ ¡¨â®¢®¬ ¯à¥¤áâ ¢«¥¨¨) 0RRRRRGGGGGBBBBB -
|
||||||
¯® 5 ¯¨ªá¥«¥© ª ¦¤ë© 梥â.
|
¯® 5 ¯¨ªá¥«¥© ª ¦¤ë© 梥â.
|
||||||
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 16 ¡¨â ¬¨ ¯¨ªá¥«ì: 梥⠪ ¦¤®£® ¯¨ªá¥«ï
|
||||||
|
ª®¤¨àã¥âáï ª ª RRRRRGGGGGGBBBBB (á奬 5+6+5).
|
||||||
* ”®à¬ â ¨§®¡à ¦¥¨ï á 24 ¡¨â ¬¨ ¯¨ªá¥«ì: 梥⠪ ¦¤®£® ¯¨ªá¥«ï
|
* ”®à¬ â ¨§®¡à ¦¥¨ï á 24 ¡¨â ¬¨ ¯¨ªá¥«ì: 梥⠪ ¦¤®£® ¯¨ªá¥«ï
|
||||||
ª®¤¨àã¥âáï âà¥¬ï ¡ ©â ¬¨ - ¯®á«¥¤®¢ â¥«ì® á¨ïï, §¥«ñ ï,
|
ª®¤¨àã¥âáï âà¥¬ï ¡ ©â ¬¨ - ¯®á«¥¤®¢ â¥«ì® á¨ïï, §¥«ñ ï,
|
||||||
ªà á ï á®áâ ¢«ïî騥 梥â .
|
ªà á ï á®áâ ¢«ïî騥 梥â .
|
||||||
|
@ -1195,61 +1195,185 @@ devices:
|
|||||||
dd (0x5D4D shl 16)+VID_ATI, init_r200 ;R480 X850
|
dd (0x5D4D shl 16)+VID_ATI, init_r200 ;R480 X850
|
||||||
dd (0x5D52 shl 16)+VID_ATI, init_r200 ;R480 X850
|
dd (0x5D52 shl 16)+VID_ATI, init_r200 ;R480 X850
|
||||||
|
|
||||||
dd (0x791E shl 16)+VID_ATI, init_r500 ;RS690 X1200
|
dd (0x7100 shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
|
dd (0x7101 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1800 XT
|
||||||
dd (0x7140 shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7102 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1800
|
||||||
dd (0x7142 shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7103 shl 16)+VID_ATI, init_r500 ;Mobility FireGL V7200
|
||||||
dd (0x7146 shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7104 shl 16)+VID_ATI, init_r500 ;FireGL V7200
|
||||||
dd (0x714D shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7105 shl 16)+VID_ATI, init_r500 ;FireGL V5300
|
||||||
dd (0x714E shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7106 shl 16)+VID_ATI, init_r500 ;Mobility FireGL V7100
|
||||||
|
dd (0x7108 shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
dd (0x7183 shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x7109 shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
dd (0x7187 shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x710A shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
dd (0x718F shl 16)+VID_ATI, init_r500 ;RV515 X1300
|
dd (0x710B shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
|
dd (0x710C shl 16)+VID_ATI, init_r500 ;Radeon X1800
|
||||||
dd (0x7143 shl 16)+VID_ATI, init_r500 ;RV515 X1550
|
dd (0x710E shl 16)+VID_ATI, init_r500 ;FireGL V7300
|
||||||
dd (0x7147 shl 16)+VID_ATI, init_r500 ;RV515 X1550
|
dd (0x710F shl 16)+VID_ATI, init_r500 ;FireGL V7350
|
||||||
dd (0x715F shl 16)+VID_ATI, init_r500 ;RV515 X1550
|
dd (0x7140 shl 16)+VID_ATI, init_r500 ;Radeon X1600/X1550
|
||||||
dd (0x7193 shl 16)+VID_ATI, init_r500 ;RV515 X1550
|
dd (0x7141 shl 16)+VID_ATI, init_r500 ;RV505
|
||||||
dd (0x719F shl 16)+VID_ATI, init_r500 ;RV515 X1550
|
dd (0x7142 shl 16)+VID_ATI, init_r500 ;Radeon X1300/X1550
|
||||||
|
dd (0x7143 shl 16)+VID_ATI, init_r500 ;Radeon X1550
|
||||||
dd (0x71C0 shl 16)+VID_ATI, init_r500 ;RV530 X1600
|
dd (0x7144 shl 16)+VID_ATI, init_r500 ;M54-GL
|
||||||
dd (0x71C1 shl 16)+VID_ATI, init_r500 ;RV535 X1650
|
dd (0x7145 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1400
|
||||||
dd (0x71C2 shl 16)+VID_ATI, init_r500 ;RV530 X1600
|
dd (0x7146 shl 16)+VID_ATI, init_r500 ;Radeon X1300/X1550
|
||||||
dd (0x71C3 shl 16)+VID_ATI, init_r500 ;RV535 X1600
|
dd (0x7147 shl 16)+VID_ATI, init_r500 ;Radeon X1550 64-bit
|
||||||
dd (0x71C6 shl 16)+VID_ATI, init_r500 ;RV530 X1600
|
dd (0x7149 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1300
|
||||||
dd (0x71C7 shl 16)+VID_ATI, init_r500 ;RV534 X1650
|
dd (0x714A shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1300
|
||||||
|
dd (0x714B shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1300
|
||||||
dd (0x7181 shl 16)+VID_ATI, init_r500 ;RV515 X1600
|
dd (0x714C shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1300
|
||||||
dd (0x71CD shl 16)+VID_ATI, init_r500 ;RV530 X1600
|
dd (0x714D shl 16)+VID_ATI, init_r500 ;Radeon X1300
|
||||||
|
dd (0x714E shl 16)+VID_ATI, init_r500 ;Radeon X1300
|
||||||
dd (0x7291 shl 16)+VID_ATI, init_r500 ;R580 X1650
|
dd (0x714F shl 16)+VID_ATI, init_r500 ;RV505
|
||||||
dd (0x7293 shl 16)+VID_ATI, init_r500 ;R580 X1650
|
dd (0x7151 shl 16)+VID_ATI, init_r500 ;RV505
|
||||||
|
dd (0x7152 shl 16)+VID_ATI, init_r500 ;FireGL V3300
|
||||||
dd (0x7100 shl 16)+VID_ATI, init_r500 ;RV520 X1800
|
dd (0x7153 shl 16)+VID_ATI, init_r500 ;FireGL V3350
|
||||||
dd (0x7109 shl 16)+VID_ATI, init_r500 ;RV520 X1800
|
dd (0x715E shl 16)+VID_ATI, init_r500 ;Radeon X1300
|
||||||
dd (0x710A shl 16)+VID_ATI, init_r500 ;RV520 X1800 GTO
|
dd (0x715F shl 16)+VID_ATI, init_r500 ;Radeon X1550 64-bit
|
||||||
|
dd (0x7180 shl 16)+VID_ATI, init_r500 ;Radeon X1300/X1550
|
||||||
dd (0x7249 shl 16)+VID_ATI, init_r500 ;RV580 X1900
|
dd (0x7181 shl 16)+VID_ATI, init_r500 ;Radeon X1600
|
||||||
dd (0x724B shl 16)+VID_ATI, init_r500 ;RV580 X1900 GT
|
dd (0x7183 shl 16)+VID_ATI, init_r500 ;Radeon X1300/X1550
|
||||||
|
dd (0x7186 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1450
|
||||||
dd (0x7240 shl 16)+VID_ATI, init_r500 ;RV580 X1950
|
dd (0x7187 shl 16)+VID_ATI, init_r500 ;Radeon X1300/X1550
|
||||||
dd (0x7244 shl 16)+VID_ATI, init_r500 ;RV580 X1950
|
dd (0x7188 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X2300
|
||||||
dd (0x7248 shl 16)+VID_ATI, init_r500 ;RV580 X1950
|
dd (0x718A shl 16)+VID_ATI, init_r500 ;Mobility Radeon X2300
|
||||||
|
dd (0x718B shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1350
|
||||||
dd (0x7288 shl 16)+VID_ATI, init_r500 ;R580 X1950 GT
|
dd (0x718C shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1350
|
||||||
dd (0x7280 shl 16)+VID_ATI, init_r500 ;R580 X1950 PRO
|
dd (0x718D shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1450
|
||||||
|
dd (0x718F shl 16)+VID_ATI, init_r500 ;Radeon X1300
|
||||||
dd (0x94C3 shl 16)+VID_ATI, init_r500 ;RV610 HD 2400 PRO
|
dd (0x7193 shl 16)+VID_ATI, init_r500 ;Radeon X1550
|
||||||
dd (0x94C1 shl 16)+VID_ATI, init_r500 ;RV610 HD 2400 XT
|
dd (0x7196 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1350
|
||||||
|
dd (0x719B shl 16)+VID_ATI, init_r500 ;FireMV 2250
|
||||||
dd (0x9589 shl 16)+VID_ATI, init_r500 ;RV630 HD 2600 PRO
|
dd (0x719F shl 16)+VID_ATI, init_r500 ;Radeon X1550 64-bit
|
||||||
dd (0x958A shl 16)+VID_ATI, init_r500 ;RV630 HD 2600 X2
|
dd (0x71C0 shl 16)+VID_ATI, init_r500 ;Radeon X1600
|
||||||
dd (0x9588 shl 16)+VID_ATI, init_r500 ;RV630 HD 2600 XT
|
dd (0x71C1 shl 16)+VID_ATI, init_r500 ;Radeon X1650
|
||||||
|
dd (0x71C2 shl 16)+VID_ATI, init_r500 ;Radeon X1600
|
||||||
dd (0x9403 shl 16)+VID_ATI, init_r500 ;R600 HD 2900 PRO
|
dd (0x71C3 shl 16)+VID_ATI, init_r500 ;Radeon X1600
|
||||||
dd (0x9409 shl 16)+VID_ATI, init_r500 ;R600 HD 2900 XT
|
dd (0x71C4 shl 16)+VID_ATI, init_r500 ;Mobility FireGL V5200
|
||||||
|
dd (0x71C5 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1600
|
||||||
|
dd (0x71C6 shl 16)+VID_ATI, init_r500 ;Radeon X1650
|
||||||
|
dd (0x71C7 shl 16)+VID_ATI, init_r500 ;Radeon X1650
|
||||||
|
dd (0x71CD shl 16)+VID_ATI, init_r500 ;Radeon X1600
|
||||||
|
dd (0x71CE shl 16)+VID_ATI, init_r500 ;Radeon X1300 XT/X1600 Pro
|
||||||
|
dd (0x71D2 shl 16)+VID_ATI, init_r500 ;FireGL V3400
|
||||||
|
dd (0x71D4 shl 16)+VID_ATI, init_r500 ;Mobility FireGL V5250
|
||||||
|
dd (0x71D5 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1700
|
||||||
|
dd (0x71D6 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1700 XT
|
||||||
|
dd (0x71DA shl 16)+VID_ATI, init_r500 ;FireGL V5200
|
||||||
|
dd (0x71DE shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1700
|
||||||
|
dd (0x7200 shl 16)+VID_ATI, init_r500 ;Radeon X2300HD
|
||||||
|
dd (0x7210 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2300
|
||||||
|
dd (0x7211 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2300
|
||||||
|
dd (0x7240 shl 16)+VID_ATI, init_r500 ;Radeon X1950
|
||||||
|
dd (0x7243 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7244 shl 16)+VID_ATI, init_r500 ;Radeon X1950
|
||||||
|
dd (0x7245 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7246 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7247 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7248 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7249 shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x724A shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x724B shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x724C shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x724D shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x724E shl 16)+VID_ATI, init_r500 ;AMD Stream Processor
|
||||||
|
dd (0x724F shl 16)+VID_ATI, init_r500 ;Radeon X1900
|
||||||
|
dd (0x7280 shl 16)+VID_ATI, init_r500 ;Radeon X1950
|
||||||
|
dd (0x7281 shl 16)+VID_ATI, init_r500 ;RV560
|
||||||
|
dd (0x7283 shl 16)+VID_ATI, init_r500 ;RV560
|
||||||
|
dd (0x7284 shl 16)+VID_ATI, init_r500 ;Mobility Radeon X1900
|
||||||
|
dd (0x7287 shl 16)+VID_ATI, init_r500 ;RV560
|
||||||
|
dd (0x7288 shl 16)+VID_ATI, init_r500 ;Radeon X1950 GT
|
||||||
|
dd (0x7289 shl 16)+VID_ATI, init_r500 ;RV570
|
||||||
|
dd (0x728B shl 16)+VID_ATI, init_r500 ;RV570
|
||||||
|
dd (0x728C shl 16)+VID_ATI, init_r500 ;ATI FireGL V7400
|
||||||
|
dd (0x7290 shl 16)+VID_ATI, init_r500 ;RV560
|
||||||
|
dd (0x7291 shl 16)+VID_ATI, init_r500 ;Radeon X1650
|
||||||
|
dd (0x7293 shl 16)+VID_ATI, init_r500 ;Radeon X1650
|
||||||
|
dd (0x7297 shl 16)+VID_ATI, init_r500 ;RV560
|
||||||
|
dd (0x791E shl 16)+VID_ATI, init_r500 ;Radeon X1200
|
||||||
|
dd (0x791F shl 16)+VID_ATI, init_r500 ;Radeon X1200
|
||||||
|
dd (0x793F shl 16)+VID_ATI, init_r500 ;Radeon Xpress 1200
|
||||||
|
dd (0x7941 shl 16)+VID_ATI, init_r500 ;Radeon Xpress 1200
|
||||||
|
dd (0x7942 shl 16)+VID_ATI, init_r500 ;Radeon Xpress 1200 (M)
|
||||||
|
dd (0x796C shl 16)+VID_ATI, init_r500 ;RS740
|
||||||
|
dd (0x796D shl 16)+VID_ATI, init_r500 ;RS740M
|
||||||
|
dd (0x796E shl 16)+VID_ATI, init_r500 ;ATI Radeon 2100 RS740
|
||||||
|
dd (0x796F shl 16)+VID_ATI, init_r500 ;RS740M
|
||||||
|
dd (0x9400 shl 16)+VID_ATI, init_r500 ;Radeon HD 2900 XT
|
||||||
|
dd (0x9401 shl 16)+VID_ATI, init_r500 ;Radeon HD 2900 XT
|
||||||
|
dd (0x9402 shl 16)+VID_ATI, init_r500 ;Radeon HD 2900 XT
|
||||||
|
dd (0x9403 shl 16)+VID_ATI, init_r500 ;Radeon HD 2900 Pro
|
||||||
|
dd (0x9405 shl 16)+VID_ATI, init_r500 ;Radeon HD 2900 GT
|
||||||
|
dd (0x940A shl 16)+VID_ATI, init_r500 ;FireGL V8650
|
||||||
|
dd (0x940B shl 16)+VID_ATI, init_r500 ;FireGL V8600
|
||||||
|
dd (0x940F shl 16)+VID_ATI, init_r500 ;FireGL V7600
|
||||||
|
dd (0x94C0 shl 16)+VID_ATI, init_r500 ;RV610
|
||||||
|
dd (0x94C1 shl 16)+VID_ATI, init_r500 ;Radeon HD 2400 XT
|
||||||
|
dd (0x94C3 shl 16)+VID_ATI, init_r500 ;Radeon HD 2400 Pro
|
||||||
|
dd (0x94C4 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2400 PRO AGP
|
||||||
|
dd (0x94C5 shl 16)+VID_ATI, init_r500 ;FireGL V4000
|
||||||
|
dd (0x94C6 shl 16)+VID_ATI, init_r500 ;RV610
|
||||||
|
dd (0x94C7 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2350
|
||||||
|
dd (0x94C8 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2400 XT
|
||||||
|
dd (0x94C9 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2400
|
||||||
|
dd (0x94CB shl 16)+VID_ATI, init_r500 ;ATI RADEON E2400
|
||||||
|
dd (0x94CC shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2400
|
||||||
|
dd (0x9500 shl 16)+VID_ATI, init_r500 ;RV670
|
||||||
|
dd (0x9501 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD3870
|
||||||
|
dd (0x9504 shl 16)+VID_ATI, init_r500 ;ATI Mobility Radeon HD 3850
|
||||||
|
dd (0x9505 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD3850
|
||||||
|
dd (0x9506 shl 16)+VID_ATI, init_r500 ;ATI Mobility Radeon HD 3850 X2
|
||||||
|
dd (0x9507 shl 16)+VID_ATI, init_r500 ;RV670
|
||||||
|
dd (0x9508 shl 16)+VID_ATI, init_r500 ;ATI Mobility Radeon HD 3870
|
||||||
|
dd (0x9509 shl 16)+VID_ATI, init_r500 ;ATI Mobility Radeon HD 3870 X2
|
||||||
|
dd (0x950F shl 16)+VID_ATI, init_r500 ;ATI Radeon HD3870 X2
|
||||||
|
dd (0x9511 shl 16)+VID_ATI, init_r500 ;ATI FireGL V7700
|
||||||
|
dd (0x9515 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3850 AGP
|
||||||
|
dd (0x9517 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3960
|
||||||
|
dd (0x9519 shl 16)+VID_ATI, init_r500 ;FireStream 9170
|
||||||
|
dd (0x9580 shl 16)+VID_ATI, init_r500 ;RV630
|
||||||
|
dd (0x9581 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2600
|
||||||
|
dd (0x9583 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 2600 XT
|
||||||
|
dd (0x9586 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2600 XT AGP
|
||||||
|
dd (0x9587 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2600 Pro AGP
|
||||||
|
dd (0x9588 shl 16)+VID_ATI, init_r500 ;Radeon HD 2600 XT
|
||||||
|
dd (0x9589 shl 16)+VID_ATI, init_r500 ;Radeon HD 2600 Pro
|
||||||
|
dd (0x958A shl 16)+VID_ATI, init_r500 ;Gemini RV630
|
||||||
|
dd (0x958B shl 16)+VID_ATI, init_r500 ;Gemini ATI Mobility Radeon HD 2600 XT
|
||||||
|
dd (0x958C shl 16)+VID_ATI, init_r500 ;FireGL V5600
|
||||||
|
dd (0x958D shl 16)+VID_ATI, init_r500 ;FireGL V3600
|
||||||
|
dd (0x958E shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 2600 LE
|
||||||
|
dd (0x958F shl 16)+VID_ATI, init_r500 ;ATI Mobility FireGL Graphics Processor
|
||||||
|
dd (0x9590 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3600 Series
|
||||||
|
dd (0x9591 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 3650
|
||||||
|
dd (0x9593 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 3670
|
||||||
|
dd (0x9595 shl 16)+VID_ATI, init_r500 ;Mobility FireGL V5700
|
||||||
|
dd (0x9596 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3650 AGP
|
||||||
|
dd (0x9597 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3600 Series
|
||||||
|
dd (0x9598 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3670
|
||||||
|
dd (0x9599 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3600 Series
|
||||||
|
dd (0x959B shl 16)+VID_ATI, init_r500 ;Mobility FireGL Graphics Processor
|
||||||
|
dd (0x95C0 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3470
|
||||||
|
dd (0x95C2 shl 16)+VID_ATI, init_r500 ;ATI Mobility Radeon HD 3430 (M82)
|
||||||
|
dd (0x95C4 shl 16)+VID_ATI, init_r500 ;Mobility Radeon HD 3400 Series (M82)
|
||||||
|
dd (0x95C5 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3450
|
||||||
|
dd (0x95C7 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3430
|
||||||
|
dd (0x95CC shl 16)+VID_ATI, init_r500 ;Fire PRO Professional Graphics ASIC
|
||||||
|
dd (0x95CD shl 16)+VID_ATI, init_r500 ;ATI FireMV 2450
|
||||||
|
dd (0x95CE shl 16)+VID_ATI, init_r500 ;ATI FireMV 2260
|
||||||
|
dd (0x95CF shl 16)+VID_ATI, init_r500 ;ATI FireMV 2260
|
||||||
|
dd (0x9610 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3200 Graphics
|
||||||
|
dd (0x9611 shl 16)+VID_ATI, init_r500 ;ATI Radeon 3100 Graphics
|
||||||
|
dd (0x9612 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3200 Graphics
|
||||||
|
dd (0x9613 shl 16)+VID_ATI, init_r500 ;ATI Radeon 3100 Graphics
|
||||||
|
dd (0x9614 shl 16)+VID_ATI, init_r500 ;ATI Radeon HD 3300 Graphics
|
||||||
|
dd (0x9440 shl 16)+VID_ATI, init_r500 ;ATI Radeon 4800 Series
|
||||||
|
dd (0x9441 shl 16)+VID_ATI, init_r500 ;ATI Radeon 4870 X2
|
||||||
|
dd (0x9442 shl 16)+VID_ATI, init_r500 ;ATI Radeon 4800 Series
|
||||||
|
dd (0x9444 shl 16)+VID_ATI, init_r500 ;Everest ATI FirePro Graphics Accelerator
|
||||||
|
dd (0x9446 shl 16)+VID_ATI, init_r500 ;K2 ATI FirePro Graphics Accelerator
|
||||||
|
dd (0x944E shl 16)+VID_ATI, init_r500 ;RV770
|
||||||
|
dd (0x9456 shl 16)+VID_ATI, init_r500 ;Denali ATI FirePro Graphics
|
||||||
|
|
||||||
dd 0 ;terminator
|
dd 0 ;terminator
|
||||||
|
|
||||||
|
@ -5,6 +5,10 @@ if 0
|
|||||||
The below code is a rework from code in
|
The below code is a rework from code in
|
||||||
xf86-video-radeonhd/src/r5xx_accel.c, xf86-video-radeonhd/src/r5xx_xaa.c
|
xf86-video-radeonhd/src/r5xx_accel.c, xf86-video-radeonhd/src/r5xx_xaa.c
|
||||||
|
|
||||||
|
git://anongit.freedesktop.org/git/nouveau/xf86-video-radeonhd
|
||||||
|
git://anongit.freedesktop.org/git/xorg/driver/xf86-video-ati
|
||||||
|
|
||||||
|
|
||||||
Copyright 2008 Luc Verhaegen <lverhaegen@novell.com>
|
Copyright 2008 Luc Verhaegen <lverhaegen@novell.com>
|
||||||
Copyright 2008 Matthias Hopf <mhopf@novell.com>
|
Copyright 2008 Matthias Hopf <mhopf@novell.com>
|
||||||
Copyright 2008 Egbert Eich <eich@novell.com>
|
Copyright 2008 Egbert Eich <eich@novell.com>
|
||||||
@ -662,7 +666,7 @@ proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
|
|||||||
or edx, [rhd.control]
|
or edx, [rhd.control]
|
||||||
or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
|
||||||
|
|
||||||
; Save for later clipping */
|
; Save for later clipping
|
||||||
mov [rhd.control_saved], edx
|
mov [rhd.control_saved], edx
|
||||||
|
|
||||||
mov eax, 4
|
mov eax, 4
|
||||||
|
72
kernel/branches/kolibri_pe/drivers/sb16/README.TXT
Normal file
72
kernel/branches/kolibri_pe/drivers/sb16/README.TXT
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
Nable 21.05.2008.
|
||||||
|
This driver is my contribution (or donation) to KolibriOS. This is provided
|
||||||
|
AS IS in hope it'll be useful, but WITHOUT ANY WARRANTY! No responcibility
|
||||||
|
for any hardware damage or data loss. Use at your own risk!
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;Changelog:
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
v0.2 - DEV_SET(GET)_MASTERVOL functions are unlocked and implemented.
|
||||||
|
|
||||||
|
v0.1 - first release.
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
;Tiny FAQ for sound driver by Nable for SB16 sound card.
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;What is it?--------------------------------------------------------------------
|
||||||
|
As you may know there is a sound subsystem ('INFINITY') in KolibriOS.
|
||||||
|
This subsystem includes mixer and separate interface for soundplayer
|
||||||
|
program and driver, so player application don't need to know what soundcard
|
||||||
|
is installed and how to cope with it, all work with card do the driver.
|
||||||
|
Before this time there were drivers only for AC97 integrated sound, but I
|
||||||
|
don't have such at home and if I would upgrade my computer with a newest
|
||||||
|
hardware, with 100% probability integrated sound will be HD Codec, nowadays
|
||||||
|
AC97 is not actual (2008 year is at calendar). But I'm not planning to upgrade
|
||||||
|
my computer so much now (and in next 5-6 years), writing the driver for my PCI
|
||||||
|
ESS Maestro1 card is difficult for me (may be some time later), so I decided
|
||||||
|
to write a driver for SB16. At first it is easy, there are many working
|
||||||
|
examples for DOS, there are heaps of good documentation and as an ISA device
|
||||||
|
SB16 can be programmed through I/O ports (about 5 ports are used), that is
|
||||||
|
more easy than PCI access. Now, enough lirics, lets go to physics :-)
|
||||||
|
If you still don't understand what stuff is it, I'll tell this in brief:
|
||||||
|
with this driver you can play MP3 and WAV music (using AC97SND player) and
|
||||||
|
sounds (some games and DOSBOX can produce sound output through sound
|
||||||
|
subsystem) in KolibriOS.
|
||||||
|
|
||||||
|
;Yeah! I need sound in Kolibri and I have SB16 card. Whats then?----------------
|
||||||
|
At first copy my SOUND.OBJ to /sys/drivers at your Kolibri system. Note,
|
||||||
|
that if you have AC97 card and it's driver started - then new driver won't
|
||||||
|
run until reboot. Then run BOARD and go to 'user' tab. Then try to run
|
||||||
|
AC97SND player. At BOARD you will see the following (if you had a proper
|
||||||
|
card):
|
||||||
|
|----------------------------|
|
||||||
|
|detecting hardware... | <- detector startup message
|
||||||
|
|DSP found at port 220h | <- if you have a proper card, it'll be
|
||||||
|
|DSP version 4.13 - SB16 | autodetected. Numbers may be different.
|
||||||
|
|failed to attach IRQ5 | <- don't mention. Old kernels reserve IRQ5
|
||||||
|
|owner's handler: 0x80D74284 | see below how to fix it.
|
||||||
|
|----------------------------|
|
||||||
|
At first, note that DSP version must be 4.xx or higher. Older cards are not
|
||||||
|
supported in this first release, maybe some time later. If nothing detected
|
||||||
|
but PNP/BIOS or some other OS detects your card - I'm sorry, it's perverted
|
||||||
|
PNP card like OPTi16, that is like HD Codec - until you init it through
|
||||||
|
PCI->ISA bridge (HD Codec of course through PCI->PCI bridge), map it, etc,
|
||||||
|
you can't use it in any way. I'd rather write a PCI device driver, than
|
||||||
|
for this extreme perversion. If your card detected and has a proper version
|
||||||
|
but you see 'failed to attach IRQ' - delete stroke 'mov [irq_owner+4*5],1' from the
|
||||||
|
file kernel.asm of your kernel source, save it, rebuild kernel, copy new
|
||||||
|
kernel to /sys/ (did you rename 'kernel' to 'kernel.mnt'? You should do it),
|
||||||
|
restart kernel (Ctrl+Alt+F12, Home). THE EASIER WAY IS TO USE A NEWER KERNEL,
|
||||||
|
since SVN802 it's fixed.
|
||||||
|
Now everything should be OK.
|
||||||
|
|
||||||
|
;It works for a part of the second and then stops, but system doesn't hang------
|
||||||
|
Go to 'config.inc' of my driver and change 'sb_irq_num' value from 5 to 7.
|
||||||
|
Then save, rebuild driver (compile 'sound.asm'), put 'sound' to /sys/drivers/
|
||||||
|
(you need to rename file 'sound' to 'sound.obj'), restart kernel and try again
|
||||||
|
to produce sound.
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------------
|
||||||
|
Ask your questions at KolibriOS forum: board.kolibrios.org
|
||||||
|
I'll try to answer you if possible.
|
@ -432,11 +432,12 @@ file_system_lfn:
|
|||||||
push ebx
|
push ebx
|
||||||
|
|
||||||
call _sys_exec
|
call _sys_exec
|
||||||
mov [image_of_eax], eax
|
|
||||||
add esp, 12
|
add esp, 12
|
||||||
|
mov [image_of_eax], eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; handlers for devices
|
; handlers for devices
|
||||||
; in: ecx = 0 => query virtual directory /xxx
|
; in: ecx = 0 => query virtual directory /xxx
|
||||||
; in: ecx = partition number
|
; in: ecx = partition number
|
||||||
|
@ -46,6 +46,10 @@ typedef struct _IMAGE_FILE_HEADER
|
|||||||
WORD Characteristics;
|
WORD Characteristics;
|
||||||
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
|
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
|
||||||
|
|
||||||
|
#define IMAGE_FILE_DLL 0x2000
|
||||||
|
|
||||||
|
#define IMAGE_FILE_MACHINE_I386 0x014c /* Intel 386 or later processors
|
||||||
|
and compatible processors */
|
||||||
typedef struct _IMAGE_DATA_DIRECTORY {
|
typedef struct _IMAGE_DATA_DIRECTORY {
|
||||||
DWORD VirtualAddress;
|
DWORD VirtualAddress;
|
||||||
DWORD Size;
|
DWORD Size;
|
||||||
@ -192,12 +196,13 @@ extern dll_t core_dll;
|
|||||||
|
|
||||||
#define MakePtr( cast, ptr, addValue ) (cast)( (addr_t)(ptr) + (addr_t)(addValue) )
|
#define MakePtr( cast, ptr, addValue ) (cast)( (addr_t)(ptr) + (addr_t)(addValue) )
|
||||||
|
|
||||||
|
bool validate_pe(void *raw, size_t raw_size, bool is_exec);
|
||||||
|
|
||||||
dll_t * find_dll(link_t *list, const char *name);
|
dll_t * find_dll(link_t *list, const char *name);
|
||||||
|
|
||||||
|
|
||||||
md_t* __fastcall load_image(const char *path);
|
md_t* __fastcall load_image(const char *path);
|
||||||
|
|
||||||
void __export create_image(addr_t img_base, addr_t image) asm ("CreateImage");
|
void create_image(addr_t img_base, addr_t raw, bool force_clear) asm ("CreateImage");
|
||||||
|
|
||||||
|
|
||||||
|
@ -4314,12 +4314,42 @@ sys_putimage_palette:
|
|||||||
add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
|
add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
|
||||||
rol edx, 16
|
rol edx, 16
|
||||||
.forced:
|
.forced:
|
||||||
|
cmp esi, 1
|
||||||
|
jnz @f
|
||||||
|
push edi
|
||||||
|
mov eax, [edi+4]
|
||||||
|
sub eax, [edi]
|
||||||
|
push eax
|
||||||
|
push dword [edi]
|
||||||
|
push 0ffffff80h
|
||||||
|
mov edi, esp
|
||||||
|
call put_mono_image
|
||||||
|
add esp, 12
|
||||||
|
pop edi
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp esi, 4
|
||||||
|
jnz @f
|
||||||
|
push edi
|
||||||
|
push 0ffffff80h
|
||||||
|
mov edi, esp
|
||||||
|
call put_4bit_image
|
||||||
|
pop eax
|
||||||
|
pop edi
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
push ebp esi ebp
|
push ebp esi ebp
|
||||||
cmp esi, 8
|
cmp esi, 8
|
||||||
jnz @f
|
jnz @f
|
||||||
mov ebp, putimage_get8bpp
|
mov ebp, putimage_get8bpp
|
||||||
mov esi, putimage_init8bpp
|
mov esi, putimage_init8bpp
|
||||||
jmp sys_putimage_bpp
|
jmp sys_putimage_bpp
|
||||||
|
@@:
|
||||||
|
cmp esi, 15
|
||||||
|
jnz @f
|
||||||
|
mov ebp, putimage_get15bpp
|
||||||
|
mov esi, putimage_init15bpp
|
||||||
|
jmp sys_putimage_bpp
|
||||||
@@:
|
@@:
|
||||||
cmp esi, 16
|
cmp esi, 16
|
||||||
jnz @f
|
jnz @f
|
||||||
@ -4342,15 +4372,28 @@ sys_putimage_palette:
|
|||||||
pop ebp esi ebp
|
pop ebp esi ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
put_mono_image:
|
||||||
|
push ebp esi ebp
|
||||||
|
mov ebp, putimage_get1bpp
|
||||||
|
mov esi, putimage_init1bpp
|
||||||
|
jmp sys_putimage_bpp
|
||||||
|
put_4bit_image:
|
||||||
|
push ebp esi ebp
|
||||||
|
mov ebp, putimage_get4bpp
|
||||||
|
mov esi, putimage_init4bpp
|
||||||
|
jmp sys_putimage_bpp
|
||||||
|
|
||||||
putimage_init24bpp:
|
putimage_init24bpp:
|
||||||
lea eax, [eax*3]
|
lea eax, [eax*3]
|
||||||
putimage_init8bpp:
|
putimage_init8bpp:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
align 16
|
||||||
putimage_get24bpp:
|
putimage_get24bpp:
|
||||||
mov eax, [esi]
|
mov eax, [esi]
|
||||||
add esi, 3
|
add esi, 3
|
||||||
ret 4
|
ret 4
|
||||||
|
align 16
|
||||||
putimage_get8bpp:
|
putimage_get8bpp:
|
||||||
movzx eax, byte [esi]
|
movzx eax, byte [esi]
|
||||||
push edx
|
push edx
|
||||||
@ -4360,17 +4403,79 @@ putimage_get8bpp:
|
|||||||
inc esi
|
inc esi
|
||||||
ret 4
|
ret 4
|
||||||
|
|
||||||
|
putimage_init1bpp:
|
||||||
|
add eax, ecx
|
||||||
|
push ecx
|
||||||
|
add eax, 7
|
||||||
|
add ecx, 7
|
||||||
|
shr eax, 3
|
||||||
|
shr ecx, 3
|
||||||
|
sub eax, ecx
|
||||||
|
pop ecx
|
||||||
|
ret
|
||||||
|
align 16
|
||||||
|
putimage_get1bpp:
|
||||||
|
push edx
|
||||||
|
mov edx, [esp+8]
|
||||||
|
mov al, [edx]
|
||||||
|
add al, al
|
||||||
|
jnz @f
|
||||||
|
lodsb
|
||||||
|
adc al, al
|
||||||
|
@@:
|
||||||
|
mov [edx], al
|
||||||
|
sbb eax, eax
|
||||||
|
and eax, [edx+8]
|
||||||
|
add eax, [edx+4]
|
||||||
|
pop edx
|
||||||
|
ret 4
|
||||||
|
|
||||||
|
putimage_init4bpp:
|
||||||
|
add eax, ecx
|
||||||
|
push ecx
|
||||||
|
add ecx, 1
|
||||||
|
add eax, 1
|
||||||
|
shr ecx, 1
|
||||||
|
shr eax, 1
|
||||||
|
sub eax, ecx
|
||||||
|
pop ecx
|
||||||
|
ret
|
||||||
|
align 16
|
||||||
|
putimage_get4bpp:
|
||||||
|
push edx
|
||||||
|
mov edx, [esp+8]
|
||||||
|
add byte [edx], 80h
|
||||||
|
jc @f
|
||||||
|
movzx eax, byte [edx+1]
|
||||||
|
mov edx, [edx+4]
|
||||||
|
and eax, 0x0F
|
||||||
|
mov eax, [edx+eax*4]
|
||||||
|
pop edx
|
||||||
|
ret 4
|
||||||
|
@@:
|
||||||
|
movzx eax, byte [esi]
|
||||||
|
add esi, 1
|
||||||
|
mov [edx+1], al
|
||||||
|
shr eax, 4
|
||||||
|
mov edx, [edx+4]
|
||||||
|
mov eax, [edx+eax*4]
|
||||||
|
pop edx
|
||||||
|
ret 4
|
||||||
|
|
||||||
putimage_init32bpp:
|
putimage_init32bpp:
|
||||||
shl eax, 2
|
shl eax, 2
|
||||||
ret
|
ret
|
||||||
|
align 16
|
||||||
putimage_get32bpp:
|
putimage_get32bpp:
|
||||||
lodsd
|
lodsd
|
||||||
ret 4
|
ret 4
|
||||||
|
|
||||||
|
putimage_init15bpp:
|
||||||
putimage_init16bpp:
|
putimage_init16bpp:
|
||||||
add eax, eax
|
add eax, eax
|
||||||
ret
|
ret
|
||||||
putimage_get16bpp:
|
align 16
|
||||||
|
putimage_get15bpp:
|
||||||
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
|
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
|
||||||
push ecx edx
|
push ecx edx
|
||||||
movzx eax, word [esi]
|
movzx eax, word [esi]
|
||||||
@ -4386,7 +4491,26 @@ putimage_get16bpp:
|
|||||||
or eax, ecx
|
or eax, ecx
|
||||||
or eax, edx
|
or eax, edx
|
||||||
pop edx ecx
|
pop edx ecx
|
||||||
ret
|
ret 4
|
||||||
|
|
||||||
|
align 16
|
||||||
|
putimage_get16bpp:
|
||||||
|
; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000
|
||||||
|
push ecx edx
|
||||||
|
movzx eax, word [esi]
|
||||||
|
add esi, 2
|
||||||
|
mov ecx, eax
|
||||||
|
mov edx, eax
|
||||||
|
and eax, 0x1F
|
||||||
|
and ecx, 0x3F shl 5
|
||||||
|
and edx, 0x1F shl 11
|
||||||
|
shl eax, 3
|
||||||
|
shl ecx, 5
|
||||||
|
shl edx, 8
|
||||||
|
or eax, ecx
|
||||||
|
or eax, edx
|
||||||
|
pop edx ecx
|
||||||
|
ret 4
|
||||||
|
|
||||||
; eax x beginning
|
; eax x beginning
|
||||||
; ebx y beginning
|
; ebx y beginning
|
||||||
|
@ -46,6 +46,7 @@ H_SRC:= \
|
|||||||
include/link.h \
|
include/link.h \
|
||||||
include/core.h \
|
include/core.h \
|
||||||
include/mm.h \
|
include/mm.h \
|
||||||
|
include/pe.h \
|
||||||
include/slab.h
|
include/slab.h
|
||||||
|
|
||||||
PE_OBJS = $(patsubst %.s, bin/%.obj, $(patsubst %.asm, bin/%.obj,\
|
PE_OBJS = $(patsubst %.s, bin/%.obj, $(patsubst %.asm, bin/%.obj,\
|
||||||
|
2683
kernel/branches/kolibri_pe/network/eth_drv/drivers/forcedeth.inc
Normal file
2683
kernel/branches/kolibri_pe/network/eth_drv/drivers/forcedeth.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
@ -339,7 +339,7 @@ rtl8169_txb rb NUM_TX_DESC * RX_BUF_SIZE
|
|||||||
|
|
||||||
; Define the RX Descriptor
|
; Define the RX Descriptor
|
||||||
align 256
|
align 256
|
||||||
rtl8169_rx_ring rb NUM_RX_DESC * sizeof.rtl8169_TxDesc
|
rtl8169_rx_ring rb NUM_RX_DESC * sizeof.rtl8169_RxDesc
|
||||||
|
|
||||||
; Create a static buffer of size RX_BUF_SZ for each
|
; Create a static buffer of size RX_BUF_SZ for each
|
||||||
; RX Descriptor All descriptors point to a
|
; RX Descriptor All descriptors point to a
|
||||||
@ -524,20 +524,20 @@ endp
|
|||||||
; Also adjust PCI latency timer to a reasonable value, 32.
|
; Also adjust PCI latency timer to a reasonable value, 32.
|
||||||
proc adjust_pci_device
|
proc adjust_pci_device
|
||||||
|
|
||||||
DEBUGF 1,"K : adjust_pci_device\n"
|
; DEBUGF 1,"K : adjust_pci_device\n"
|
||||||
|
|
||||||
stdcall pci_read_config_word,PCI_COMMAND
|
stdcall pci_read_config_word,PCI_COMMAND
|
||||||
mov bx,ax
|
mov bx,ax
|
||||||
or bx,PCI_COMMAND_MASTER or PCI_COMMAND_IO
|
or bx,PCI_COMMAND_MASTER or PCI_COMMAND_IO
|
||||||
cmp ax,bx
|
cmp ax,bx
|
||||||
je @f
|
je @f
|
||||||
DEBUGF 1,"K : adjust_pci_device: The PCI BIOS has not enabled this device!\nK : Updating PCI command %x->%x. pci_bus %x pci_device_fn %x\n",ax,bx,[pci_bus]:2,[pci_dev]:2
|
; DEBUGF 1,"K : adjust_pci_device: The PCI BIOS has not enabled this device!\nK : Updating PCI command %x->%x. pci_bus %x pci_device_fn %x\n",ax,bx,[pci_bus]:2,[pci_dev]:2
|
||||||
stdcall pci_write_config_word,PCI_COMMAND,ebx
|
stdcall pci_write_config_word,PCI_COMMAND,ebx
|
||||||
@@:
|
@@:
|
||||||
stdcall pci_read_config_byte,PCI_LATENCY_TIMER
|
stdcall pci_read_config_byte,PCI_LATENCY_TIMER
|
||||||
cmp al,32
|
cmp al,32
|
||||||
jae @f
|
jae @f
|
||||||
DEBUGF 1,"K : adjust_pci_device: PCI latency timer (CFLT) is unreasonably low at %d.\nK : Setting to 32 clocks.\n",al
|
; DEBUGF 1,"K : adjust_pci_device: PCI latency timer (CFLT) is unreasonably low at %d.\nK : Setting to 32 clocks.\n",al
|
||||||
stdcall pci_write_config_byte,PCI_LATENCY_TIMER,32
|
stdcall pci_write_config_byte,PCI_LATENCY_TIMER,32
|
||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
@ -559,7 +559,7 @@ proc pci_bar_start,index:dword
|
|||||||
stdcall pci_read_config_dword,eax
|
stdcall pci_read_config_dword,eax
|
||||||
or eax,eax
|
or eax,eax
|
||||||
jz .not64
|
jz .not64
|
||||||
DEBUGF 1,"K : pci_bar_start: Unhandled 64bit BAR\n"
|
; DEBUGF 1,"K : pci_bar_start: Unhandled 64bit BAR\n"
|
||||||
add esp,4
|
add esp,4
|
||||||
or eax,-1
|
or eax,-1
|
||||||
ret
|
ret
|
||||||
@ -572,7 +572,7 @@ endp
|
|||||||
|
|
||||||
proc rtl8169_init_board
|
proc rtl8169_init_board
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_init_board\n"
|
; DEBUGF 1,"K : rtl8169_init_board\n"
|
||||||
|
|
||||||
call adjust_pci_device
|
call adjust_pci_device
|
||||||
|
|
||||||
@ -592,7 +592,7 @@ proc rtl8169_init_board
|
|||||||
; identify config method
|
; identify config method
|
||||||
RTL_R32 RTL8169_REG_TxConfig
|
RTL_R32 RTL8169_REG_TxConfig
|
||||||
and eax,0x7c800000
|
and eax,0x7c800000
|
||||||
DEBUGF 1,"K : rtl8169_init_board: TxConfig & 0x7c800000 = 0x%x\n",eax
|
; DEBUGF 1,"K : rtl8169_init_board: TxConfig & 0x7c800000 = 0x%x\n",eax
|
||||||
mov esi,mac_info-8
|
mov esi,mac_info-8
|
||||||
@@: add esi,8
|
@@: add esi,8
|
||||||
mov ecx,eax
|
mov ecx,eax
|
||||||
@ -625,9 +625,9 @@ proc rtl8169_init_board
|
|||||||
jmp .match
|
jmp .match
|
||||||
@@:
|
@@:
|
||||||
; if unknown chip, assume array element #0, original RTL-8169 in this case
|
; if unknown chip, assume array element #0, original RTL-8169 in this case
|
||||||
DEBUGF 1,"K : rtl8169_init_board: PCI device: unknown chip version, assuming RTL-8169\n"
|
; DEBUGF 1,"K : rtl8169_init_board: PCI device: unknown chip version, assuming RTL-8169\n"
|
||||||
RTL_R32 RTL8169_REG_TxConfig
|
RTL_R32 RTL8169_REG_TxConfig
|
||||||
DEBUGF 1,"K : rtl8169_init_board: PCI device: TxConfig = 0x%x\n",eax
|
; DEBUGF 1,"K : rtl8169_init_board: PCI device: TxConfig = 0x%x\n",eax
|
||||||
|
|
||||||
mov [rtl8169_tpc.chipset],0
|
mov [rtl8169_tpc.chipset],0
|
||||||
|
|
||||||
@ -642,7 +642,7 @@ endp
|
|||||||
|
|
||||||
proc rtl8169_hw_PHY_config
|
proc rtl8169_hw_PHY_config
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_hw_PHY_config: priv.mcfg=%d, priv.pcfg=%d\n",[rtl8169_tpc.mcfg],[rtl8169_tpc.pcfg]
|
; DEBUGF 1,"K : rtl8169_hw_PHY_config: priv.mcfg=%d, priv.pcfg=%d\n",[rtl8169_tpc.mcfg],[rtl8169_tpc.pcfg]
|
||||||
|
|
||||||
; DBG_PRINT("priv->mcfg=%d, priv->pcfg=%d\n", tpc->mcfg, tpc->pcfg);
|
; DBG_PRINT("priv->mcfg=%d, priv->pcfg=%d\n", tpc->mcfg, tpc->pcfg);
|
||||||
|
|
||||||
@ -705,7 +705,7 @@ proc rtl8169_hw_PHY_config
|
|||||||
jmp .exit
|
jmp .exit
|
||||||
.not_2_or_3:
|
.not_2_or_3:
|
||||||
; DBG_PRINT("tpc->mcfg=%d. Discard hw PHY config.\n", tpc->mcfg);
|
; DBG_PRINT("tpc->mcfg=%d. Discard hw PHY config.\n", tpc->mcfg);
|
||||||
DEBUGF 1,"K : tpc.mcfg=%d, discard hw PHY config\n",[rtl8169_tpc.mcfg]
|
; DEBUGF 1,"K : tpc.mcfg=%d, discard hw PHY config\n",[rtl8169_tpc.mcfg]
|
||||||
.exit:
|
.exit:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -716,21 +716,21 @@ endp
|
|||||||
|
|
||||||
proc RTL8169_WRITE_GMII_REG,RegAddr:byte,value:dword
|
proc RTL8169_WRITE_GMII_REG,RegAddr:byte,value:dword
|
||||||
|
|
||||||
DEBUGF 1,"K : RTL8169_WRITE_GMII_REG: 0x%x 0x%x\n",[RegAddr]:2,[value]
|
;;; DEBUGF 1,"K : RTL8169_WRITE_GMII_REG: 0x%x 0x%x\n",[RegAddr]:2,[value]
|
||||||
|
|
||||||
movzx eax,[RegAddr]
|
movzx eax,[RegAddr]
|
||||||
shl eax,16
|
shl eax,16
|
||||||
or eax,[value]
|
or eax,[value]
|
||||||
or eax,0x80000000
|
or eax,0x80000000
|
||||||
RTL_W32 RTL8169_REG_PHYAR,eax
|
RTL_W32 RTL8169_REG_PHYAR,eax
|
||||||
stdcall udelay,1000
|
stdcall udelay,1 ;;;1000
|
||||||
|
|
||||||
mov ecx,2000
|
mov ecx,2000
|
||||||
; Check if the RTL8169 has completed writing to the specified MII register
|
; Check if the RTL8169 has completed writing to the specified MII register
|
||||||
@@: RTL_R32 RTL8169_REG_PHYAR
|
@@: RTL_R32 RTL8169_REG_PHYAR
|
||||||
test eax,0x80000000
|
test eax,0x80000000
|
||||||
jz .exit
|
jz .exit
|
||||||
stdcall udelay,100
|
stdcall udelay,1 ;;;100
|
||||||
loop @b
|
loop @b
|
||||||
.exit:
|
.exit:
|
||||||
ret
|
ret
|
||||||
@ -738,21 +738,21 @@ endp
|
|||||||
|
|
||||||
proc RTL8169_READ_GMII_REG,RegAddr:byte
|
proc RTL8169_READ_GMII_REG,RegAddr:byte
|
||||||
|
|
||||||
DEBUGF 1,"K : RTL8169_READ_GMII_REG: 0x%x\n",[RegAddr]:2
|
;;; DEBUGF 1,"K : RTL8169_READ_GMII_REG: 0x%x\n",[RegAddr]:2
|
||||||
|
|
||||||
push ecx
|
push ecx
|
||||||
movzx eax,[RegAddr]
|
movzx eax,[RegAddr]
|
||||||
shl eax,16
|
shl eax,16
|
||||||
; or eax,0x0
|
; or eax,0x0
|
||||||
RTL_W32 RTL8169_REG_PHYAR,eax
|
RTL_W32 RTL8169_REG_PHYAR,eax
|
||||||
stdcall udelay,1000
|
stdcall udelay,1 ;;;1000
|
||||||
|
|
||||||
mov ecx,2000
|
mov ecx,2000
|
||||||
; Check if the RTL8169 has completed retrieving data from the specified MII register
|
; Check if the RTL8169 has completed retrieving data from the specified MII register
|
||||||
@@: RTL_R32 RTL8169_REG_PHYAR
|
@@: RTL_R32 RTL8169_REG_PHYAR
|
||||||
test eax,0x80000000
|
test eax,0x80000000
|
||||||
jnz .exit
|
jnz .exit
|
||||||
stdcall udelay,100
|
stdcall udelay,1 ;;;100
|
||||||
loop @b
|
loop @b
|
||||||
|
|
||||||
or eax,-1
|
or eax,-1
|
||||||
@ -767,7 +767,7 @@ endp
|
|||||||
|
|
||||||
proc rtl8169_set_rx_mode
|
proc rtl8169_set_rx_mode
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_set_rx_mode\n"
|
; DEBUGF 1,"K : rtl8169_set_rx_mode\n"
|
||||||
|
|
||||||
; IFF_ALLMULTI
|
; IFF_ALLMULTI
|
||||||
; Too many to filter perfectly -- accept all multicasts
|
; Too many to filter perfectly -- accept all multicasts
|
||||||
@ -785,7 +785,7 @@ endp
|
|||||||
|
|
||||||
proc rtl8169_init_ring
|
proc rtl8169_init_ring
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_init_ring\n"
|
; DEBUGF 1,"K : rtl8169_init_ring\n"
|
||||||
|
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
mov [rtl8169_tpc.cur_rx],eax
|
mov [rtl8169_tpc.cur_rx],eax
|
||||||
@ -820,6 +820,7 @@ proc rtl8169_init_ring
|
|||||||
mov ecx,NUM_RX_DESC
|
mov ecx,NUM_RX_DESC
|
||||||
@@: mov [esi],eax
|
@@: mov [esi],eax
|
||||||
mov [edi+rtl8169_RxDesc.buf_addr],eax
|
mov [edi+rtl8169_RxDesc.buf_addr],eax
|
||||||
|
sub [edi+rtl8169_RxDesc.buf_addr],OS_BASE ; shurf 28.09.2008
|
||||||
mov [edi+rtl8169_RxDesc.status],RTL8169_DSB_OWNbit or RX_BUF_SIZE
|
mov [edi+rtl8169_RxDesc.status],RTL8169_DSB_OWNbit or RX_BUF_SIZE
|
||||||
add esi,4
|
add esi,4
|
||||||
add edi,sizeof.rtl8169_RxDesc
|
add edi,sizeof.rtl8169_RxDesc
|
||||||
@ -833,7 +834,7 @@ endp
|
|||||||
|
|
||||||
proc rtl8169_hw_start
|
proc rtl8169_hw_start
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_hw_start\n"
|
; DEBUGF 1,"K : rtl8169_hw_start\n"
|
||||||
|
|
||||||
; Soft reset the chip
|
; Soft reset the chip
|
||||||
RTL_W8 RTL8169_REG_ChipCmd,RTL8169_CMD_Reset
|
RTL_W8 RTL8169_REG_ChipCmd,RTL8169_CMD_Reset
|
||||||
@ -879,8 +880,14 @@ proc rtl8169_hw_start
|
|||||||
RTL_W16 0xE2,0x0000
|
RTL_W16 0xE2,0x0000
|
||||||
|
|
||||||
MOV [rtl8169_tpc.cur_rx],0
|
MOV [rtl8169_tpc.cur_rx],0
|
||||||
RTL_W32 RTL8169_REG_TxDescStartAddr,[rtl8169_tpc.TxDescArray]
|
push eax ; shurf 28.09.2008
|
||||||
RTL_W32 RTL8169_REG_RxDescStartAddr,[rtl8169_tpc.RxDescArray]
|
mov eax, [rtl8169_tpc.TxDescArray] ; shurf 28.09.2008
|
||||||
|
sub eax, OS_BASE ; shurf 28.09.2008
|
||||||
|
RTL_W32 RTL8169_REG_TxDescStartAddr,eax ;[rtl8169_tpc.TxDescArray] ; shurf 28.09.2008
|
||||||
|
mov eax, [rtl8169_tpc.RxDescArray] ; shurf 28.09.2008
|
||||||
|
sub eax, OS_BASE ; shurf 28.09.2008
|
||||||
|
RTL_W32 RTL8169_REG_RxDescStartAddr,eax ;[rtl8169_tpc.RxDescArray] ; shurf 28.09.2008
|
||||||
|
pop eax ; shurf 28.09.2008
|
||||||
RTL_W8 RTL8169_REG_Cfg9346,RTL8169_CFG_9346_Lock
|
RTL_W8 RTL8169_REG_Cfg9346,RTL8169_CFG_9346_Lock
|
||||||
stdcall udelay,10
|
stdcall udelay,10
|
||||||
RTL_W32 RTL8169_REG_RxMissed,0
|
RTL_W32 RTL8169_REG_RxMissed,0
|
||||||
@ -913,7 +920,7 @@ endp
|
|||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
proc rtl8169_probe
|
proc rtl8169_probe
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_probe: 0x%x : 0x%x 0x%x\n",[io_addr]:8,[pci_bus]:2,[pci_dev]:2
|
; DEBUGF 1,"K : rtl8169_probe: 0x%x : 0x%x 0x%x\n",[io_addr]:8,[pci_bus]:2,[pci_dev]:2
|
||||||
|
|
||||||
call rtl8169_init_board
|
call rtl8169_init_board
|
||||||
|
|
||||||
@ -928,7 +935,7 @@ proc rtl8169_probe
|
|||||||
inc ebx
|
inc ebx
|
||||||
loop @b
|
loop @b
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_probe: MAC = %x-%x-%x-%x-%x-%x\n",[node_addr+0]:2,[node_addr+1]:2,[node_addr+2]:2,[node_addr+3]:2,[node_addr+4]:2,[node_addr+5]:2
|
; DEBUGF 1,"K : rtl8169_probe: MAC = %x-%x-%x-%x-%x-%x\n",[node_addr+0]:2,[node_addr+1]:2,[node_addr+2]:2,[node_addr+3]:2,[node_addr+4]:2,[node_addr+5]:2
|
||||||
|
|
||||||
; Config PHY
|
; Config PHY
|
||||||
stdcall rtl8169_hw_PHY_config
|
stdcall rtl8169_hw_PHY_config
|
||||||
@ -988,7 +995,7 @@ endp
|
|||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
proc rtl8169_reset
|
proc rtl8169_reset
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_reset: 0x%x : 0x%x 0x%x\n",[io_addr]:8,[pci_bus]:2,[pci_dev]:2
|
; DEBUGF 1,"K : rtl8169_reset: 0x%x : 0x%x 0x%x\n",[io_addr]:8,[pci_bus]:2,[pci_dev]:2
|
||||||
|
|
||||||
mov [rtl8169_tpc.TxDescArrays],rtl8169_tx_ring
|
mov [rtl8169_tpc.TxDescArrays],rtl8169_tx_ring
|
||||||
; Tx Desscriptor needs 256 bytes alignment
|
; Tx Desscriptor needs 256 bytes alignment
|
||||||
@ -1033,7 +1040,7 @@ endp
|
|||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
proc rtl8169_transmit
|
proc rtl8169_transmit
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_transmit\n" ;: 0x%x : 0x%x 0x%x 0x%x 0x%x\n",[io_addr]:8,edi,bx,ecx,esi
|
; DEBUGF 1,"K : rtl8169_transmit\n" ;: 0x%x : 0x%x 0x%x 0x%x 0x%x\n",[io_addr]:8,edi,bx,ecx,esi
|
||||||
|
|
||||||
push ecx edx esi
|
push ecx edx esi
|
||||||
mov eax,MAX_ETH_FRAME_SIZE
|
mov eax,MAX_ETH_FRAME_SIZE
|
||||||
@ -1087,6 +1094,7 @@ proc rtl8169_transmit
|
|||||||
add eax,[rtl8169_tpc.TxDescArray]
|
add eax,[rtl8169_tpc.TxDescArray]
|
||||||
xchg eax,ebx
|
xchg eax,ebx
|
||||||
mov [ebx + rtl8169_TxDesc.buf_addr],eax
|
mov [ebx + rtl8169_TxDesc.buf_addr],eax
|
||||||
|
sub [ebx + rtl8169_TxDesc.buf_addr],OS_BASE ; shurf 28.09.2008
|
||||||
|
|
||||||
mov eax,ecx
|
mov eax,ecx
|
||||||
cmp eax,ETH_ZLEN
|
cmp eax,ETH_ZLEN
|
||||||
@ -1110,7 +1118,7 @@ proc rtl8169_transmit
|
|||||||
jnz @f
|
jnz @f
|
||||||
stdcall udelay,10
|
stdcall udelay,10
|
||||||
loop @b
|
loop @b
|
||||||
DEBUGF 1,"K : rtl8169_transmit: TX Time Out\n"
|
; DEBUGF 1,"K : rtl8169_transmit: TX Time Out\n"
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
ret
|
ret
|
||||||
@ -1168,7 +1176,7 @@ proc rtl8169_poll
|
|||||||
add eax,-4
|
add eax,-4
|
||||||
mov [eth_rx_data_len],ax
|
mov [eth_rx_data_len],ax
|
||||||
|
|
||||||
DEBUGF 1,"K : rtl8169_poll: data length = %u\n",ax
|
; DEBUGF 1,"K : rtl8169_poll: data length = %u\n",ax
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
mov ecx,eax
|
mov ecx,eax
|
||||||
@ -1190,9 +1198,10 @@ proc rtl8169_poll
|
|||||||
@@: mov [ebx + rtl8169_RxDesc.status],eax
|
@@: mov [ebx + rtl8169_RxDesc.status],eax
|
||||||
|
|
||||||
mov [ebx + rtl8169_RxDesc.buf_addr],edx
|
mov [ebx + rtl8169_RxDesc.buf_addr],edx
|
||||||
|
sub [ebx + rtl8169_RxDesc.buf_addr],OS_BASE ; shurf 28.09.2008
|
||||||
jmp @f
|
jmp @f
|
||||||
.else:
|
.else:
|
||||||
DEBUGF 1,"K : rtl8169_poll: Rx Error\n"
|
; DEBUGF 1,"K : rtl8169_poll: Rx Error\n"
|
||||||
; FIXME: shouldn't I reset the status on an error
|
; FIXME: shouldn't I reset the status on an error
|
||||||
@@:
|
@@:
|
||||||
inc [rtl8169_tpc.cur_rx]
|
inc [rtl8169_tpc.cur_rx]
|
||||||
|
@ -104,6 +104,7 @@ include "drivers/3c59x.inc"
|
|||||||
include "drivers/sis900.inc"
|
include "drivers/sis900.inc"
|
||||||
include "drivers/pcnet32.inc"
|
include "drivers/pcnet32.inc"
|
||||||
include "drivers/rtl8169.inc"
|
include "drivers/rtl8169.inc"
|
||||||
|
include "drivers/forcedeth.inc"
|
||||||
|
|
||||||
; PCICards
|
; PCICards
|
||||||
; ========
|
; ========
|
||||||
@ -153,6 +154,7 @@ dd 0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
|||||||
dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
dd 0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
||||||
dd 0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
dd 0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
||||||
dd 0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
dd 0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
||||||
|
dd 0x816710ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
|
||||||
|
|
||||||
dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
|
dd 0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
|
||||||
dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
|
dd 0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
|
||||||
@ -200,6 +202,23 @@ dd 0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
|
|||||||
;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
|
;dd 0x08001516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
|
||||||
;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
|
;dd 0x08911516, mtd80x_probe, mtd80x_reset, mtd80x_poll, mtd80x_transmit, mtd80x_cable
|
||||||
|
|
||||||
|
dd 0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; nVidia Corporation nForce2 Ethernet Controller
|
||||||
|
dd 0x01c310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x00D610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x008610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x008c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x00e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x00df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x005610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x005710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x003710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x003810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x026810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x026910de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x037210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
dd 0x037310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
|
||||||
|
|
||||||
|
|
||||||
rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove
|
rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove
|
||||||
endg
|
endg
|
||||||
|
|
||||||
@ -334,6 +353,9 @@ endp
|
|||||||
; All registers may be destroyed
|
; All registers may be destroyed
|
||||||
;
|
;
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
|
uglobal
|
||||||
|
ether_IP_handler_cnt dd ?
|
||||||
|
endg
|
||||||
ether_IP_handler:
|
ether_IP_handler:
|
||||||
mov eax, EMPTY_QUEUE
|
mov eax, EMPTY_QUEUE
|
||||||
call dequeue
|
call dequeue
|
||||||
@ -357,6 +379,9 @@ ether_IP_handler:
|
|||||||
cld
|
cld
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
|
; inc [ether_IP_handler_cnt]
|
||||||
|
; DEBUGF 1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt]
|
||||||
|
|
||||||
; And finally, place the buffer in the IPRX queue
|
; And finally, place the buffer in the IPRX queue
|
||||||
pop ebx
|
pop ebx
|
||||||
mov eax, IPIN_QUEUE
|
mov eax, IPIN_QUEUE
|
||||||
@ -443,16 +468,18 @@ eth_rx:
|
|||||||
cmp ax, ETHER_ARP
|
cmp ax, ETHER_ARP
|
||||||
je .is_arp ; It is ARP
|
je .is_arp ; It is ARP
|
||||||
|
|
||||||
|
DEBUGF 1,"K : eth_rx - dumped (%u)\n", ax
|
||||||
|
inc [dumped_rx_count]
|
||||||
jmp .exit ; If not IP or ARP, ignore
|
jmp .exit ; If not IP or ARP, ignore
|
||||||
|
|
||||||
.is_ip:
|
.is_ip:
|
||||||
DEBUGF 1,"K : eth_rx - IP packet\n"
|
; DEBUGF 1,"K : eth_rx - IP packet\n"
|
||||||
inc dword [ip_rx_count]
|
inc dword [ip_rx_count]
|
||||||
call ether_IP_handler
|
call ether_IP_handler
|
||||||
jmp .exit
|
jmp .exit
|
||||||
|
|
||||||
.is_arp:
|
.is_arp:
|
||||||
DEBUGF 1,"K : eth_rx - ARP packet\n"
|
; DEBUGF 1,"K : eth_rx - ARP packet\n"
|
||||||
; At this point, the packet is still in the Ether_buffer
|
; At this point, the packet is still in the Ether_buffer
|
||||||
call arp_handler
|
call arp_handler
|
||||||
|
|
||||||
|
@ -87,6 +87,10 @@ macro GET_IHL reg, header_addr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
include "tcp.inc"
|
||||||
|
include "udp.inc"
|
||||||
|
include "icmp.inc"
|
||||||
|
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
; Function
|
; Function
|
||||||
; ip_rx
|
; ip_rx
|
||||||
@ -114,11 +118,13 @@ local buffer_number dd ?
|
|||||||
|
|
||||||
mov ebx, eax ; ebx=pointer to IP_PACKET
|
mov ebx, eax ; ebx=pointer to IP_PACKET
|
||||||
|
|
||||||
|
; DEBUGF 1, "K : ip_rx - proto: %u\n", [ebx + IP_PACKET.Protocol]:1
|
||||||
|
|
||||||
; Validate the IP checksum
|
; Validate the IP checksum
|
||||||
mov dx, word[ebx + IP_PACKET.HeaderChecksum]
|
mov dx, word[ebx + IP_PACKET.HeaderChecksum]
|
||||||
xchg dh,dl ; Get the checksum in intel format
|
xchg dh,dl ; Get the checksum in intel format
|
||||||
|
|
||||||
mov [ebx + IP_PACKET.HeaderChecksum], word 0 ; clear checksum field - need to when
|
mov [ebx + IP_PACKET.HeaderChecksum], 0 ; clear checksum field - need to when
|
||||||
; recalculating checksum
|
; recalculating checksum
|
||||||
; this needs two data pointers and two size #.
|
; this needs two data pointers and two size #.
|
||||||
; 2nd pointer can be of length 0
|
; 2nd pointer can be of length 0
|
||||||
@ -127,8 +133,12 @@ local buffer_number dd ?
|
|||||||
stdcall checksum_jb, ebx, ecx ;buf_ptr, buf_size
|
stdcall checksum_jb, ebx, ecx ;buf_ptr, buf_size
|
||||||
cmp dx, ax
|
cmp dx, ax
|
||||||
|
|
||||||
|
; DEBUGF 1, "K : ip_rx - checksums: %x - %x\n", dx, ax
|
||||||
|
|
||||||
|
jnz .dump.1 ;if CHECKSUM isn't valid then dump packet
|
||||||
mov edx, ebx ; EDX (IP-BUFFER POINTER) WILL BE USED FOR *_rx HANDLERS BELOW!!!
|
mov edx, ebx ; EDX (IP-BUFFER POINTER) WILL BE USED FOR *_rx HANDLERS BELOW!!!
|
||||||
jnz .dump ;if CHECKSUM isn't valid then dump packet
|
|
||||||
|
; DEBUGF 1, "K : ip_rx - dest: %x - %x\n", [ebx + IP_PACKET.DestinationAddress], [stack_ip]
|
||||||
|
|
||||||
; Validate the IP address, if it isn't broadcast
|
; Validate the IP address, if it isn't broadcast
|
||||||
mov eax, [stack_ip]
|
mov eax, [stack_ip]
|
||||||
@ -137,22 +147,37 @@ local buffer_number dd ?
|
|||||||
|
|
||||||
; If the IP address is 255.255.255.255, accept it
|
; If the IP address is 255.255.255.255, accept it
|
||||||
; - it is a broadcast packet, which we need for dhcp
|
; - it is a broadcast packet, which we need for dhcp
|
||||||
cmp dword[ebx + IP_PACKET.DestinationAddress], 0xffffffff
|
|
||||||
jne .dump
|
mov eax, [ebx + IP_PACKET.DestinationAddress]
|
||||||
|
cmp eax, 0xffffffff
|
||||||
|
;je @f
|
||||||
|
;mov ecx, [stack_ip]
|
||||||
|
;and eax, [subnet_mask]
|
||||||
|
;and ecx, [subnet_mask]
|
||||||
|
;cmp eax, ecx
|
||||||
|
;jne .dump.2
|
||||||
|
;mov eax, [ebx + IP_PACKET.DestinationAddress]
|
||||||
|
;or eax, [subnet_mask]
|
||||||
|
;cmp eax, 0xffffffff
|
||||||
|
jne .dump.2
|
||||||
|
|
||||||
@@:
|
@@:
|
||||||
mov al, [ebx + IP_PACKET.VersionAndIHL]
|
mov al, [ebx + IP_PACKET.VersionAndIHL]
|
||||||
and al, 0x0f ;get IHL(header length)
|
and al, 0x0f ;get IHL(header length)
|
||||||
cmp al, 0x05 ;if IHL!= 5*4(20 bytes)
|
cmp al, 0x05 ;if IHL!= 5*4(20 bytes)
|
||||||
jnz .dump ;then dump it
|
; DEBUGF 1, "K : ip_rx - ihl: %x - 05\n", al
|
||||||
|
jnz .dump.3 ;then dump it
|
||||||
|
|
||||||
cmp byte[ebx + IP_PACKET.TimeToLive], byte 0
|
; DEBUGF 1, "K : ip_rx - ttl: %x - 00\n", [ebx + IP_PACKET.TimeToLive]:2
|
||||||
je .dump ;if TTL==0 then dump it
|
|
||||||
|
|
||||||
mov ax, word[ebx + IP_PACKET.FlagsAndFragmentOffset]
|
cmp [ebx + IP_PACKET.TimeToLive], 0
|
||||||
|
je .dump.4 ;if TTL==0 then dump it
|
||||||
|
|
||||||
|
mov ax, [ebx + IP_PACKET.FlagsAndFragmentOffset]
|
||||||
and ax, 0xFFBF ;get flags
|
and ax, 0xFFBF ;get flags
|
||||||
|
; DEBUGF 1, "K : ip_rx - flags: %x - 0000\n", ax
|
||||||
cmp ax, 0 ;if some flags was set then we dump this packet
|
cmp ax, 0 ;if some flags was set then we dump this packet
|
||||||
jnz .dump ;the flags should be used for fragmented packets
|
jnz .dump.5 ;the flags should be used for fragmented packets
|
||||||
|
|
||||||
; Check the protocol, and call the appropriate handler
|
; Check the protocol, and call the appropriate handler
|
||||||
; Each handler will re-use or free the queue buffer as appropriate
|
; Each handler will re-use or free the queue buffer as appropriate
|
||||||
@ -161,7 +186,7 @@ local buffer_number dd ?
|
|||||||
|
|
||||||
cmp al , PROTOCOL_TCP
|
cmp al , PROTOCOL_TCP
|
||||||
jne .not_tcp
|
jne .not_tcp
|
||||||
DEBUGF 1,"K : ip_rx - TCP packet\n"
|
; DEBUGF 1,"K : ip_rx - TCP packet\n"
|
||||||
mov eax, dword[buffer_number]
|
mov eax, dword[buffer_number]
|
||||||
call tcp_rx
|
call tcp_rx
|
||||||
jmp .exit
|
jmp .exit
|
||||||
@ -169,29 +194,48 @@ local buffer_number dd ?
|
|||||||
.not_tcp:
|
.not_tcp:
|
||||||
cmp al, PROTOCOL_UDP
|
cmp al, PROTOCOL_UDP
|
||||||
jne .not_udp
|
jne .not_udp
|
||||||
DEBUGF 1,"K : ip_rx - UDP packet\n"
|
; DEBUGF 1,"K : ip_rx - UDP packet\n"
|
||||||
mov eax, dword[buffer_number]
|
mov eax, dword[buffer_number]
|
||||||
call udp_rx
|
call udp_rx
|
||||||
jmp .exit
|
jmp .exit
|
||||||
|
|
||||||
.not_udp:
|
.not_udp:
|
||||||
cmp al, PROTOCOL_ICMP
|
cmp al, PROTOCOL_ICMP
|
||||||
jne .dump ;protocol ain't supported
|
jne .dump.6 ;protocol ain't supported
|
||||||
|
|
||||||
DEBUGF 1,"K : ip_rx - ICMP packet\n"
|
; DEBUGF 1,"K : ip_rx - ICMP packet\n"
|
||||||
;GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
|
;GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
|
||||||
mov eax, dword[buffer_number]
|
mov eax, dword[buffer_number]
|
||||||
stdcall icmp_rx,eax,ebx,ecx ;buffer_number,IPPacketBase,IPHeaderLength
|
stdcall icmp_rx,eax,ebx,ecx ;buffer_number,IPPacketBase,IPHeaderLength
|
||||||
jmp .exit
|
jmp .exit
|
||||||
|
|
||||||
|
|
||||||
.dump:
|
.dump.1:
|
||||||
; No protocol handler available, so
|
DEBUGF 1, "K : ip_rx - dumped (checksum: 0x%x-0x%x)\n", dx, ax
|
||||||
; silently dump the packet, freeing up the queue buffer
|
jmp .dump.x
|
||||||
|
|
||||||
|
.dump.2:
|
||||||
|
DEBUGF 1, "K : ip_rx - dumped (ip: %u.%u.%u.%u)\n", [ebx + IP_PACKET.DestinationAddress + 0]:1, [ebx + IP_PACKET.DestinationAddress + 1]:1, [ebx + IP_PACKET.DestinationAddress + 2]:1, [ebx + IP_PACKET.DestinationAddress + 3]:1
|
||||||
|
jmp .dump.x
|
||||||
|
|
||||||
|
.dump.3:
|
||||||
|
DEBUGF 1, "K : ip_rx - dumped (ihl: %u)\n", al
|
||||||
|
jmp .dump.x
|
||||||
|
|
||||||
|
.dump.4:
|
||||||
|
DEBUGF 1, "K : ip_rx - dumped (ihl: %u)\n", [ebx + IP_PACKET.TimeToLive]
|
||||||
|
jmp .dump.x
|
||||||
|
|
||||||
|
.dump.5:
|
||||||
|
DEBUGF 1, "K : ip_rx - dumped (flags: 0x%x)\n", ax
|
||||||
|
jmp .dump.x
|
||||||
|
|
||||||
|
.dump.6:
|
||||||
|
DEBUGF 1, "K : ip_rx - dumped (proto: %u)\n", [ebx + IP_PACKET.Protocol]:1
|
||||||
|
|
||||||
|
.dump.x:
|
||||||
inc dword[dumped_rx_count]
|
inc dword[dumped_rx_count]
|
||||||
|
mov eax, [buffer_number]
|
||||||
mov eax, dword[buffer_number]
|
|
||||||
call freeBuff
|
call freeBuff
|
||||||
|
|
||||||
.exit:
|
.exit:
|
||||||
|
@ -43,18 +43,19 @@ $Revision$
|
|||||||
; all other registers preserved
|
; all other registers preserved
|
||||||
; This always works, so no error returned
|
; This always works, so no error returned
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
|
uglobal
|
||||||
|
freeBuff_cnt dd ?
|
||||||
|
endg
|
||||||
freeBuff:
|
freeBuff:
|
||||||
|
; inc [freeBuff_cnt]
|
||||||
|
; DEBUGF 1, "K : freeBuff (%u)\n", [freeBuff_cnt]
|
||||||
push ebx
|
push ebx
|
||||||
push ecx
|
push ecx
|
||||||
mov ebx, EMPTY_QUEUE
|
mov ebx, queues + EMPTY_QUEUE * 2
|
||||||
shl ebx, 1
|
|
||||||
add ebx, queues
|
|
||||||
cli ; Ensure that another process does not interfer
|
cli ; Ensure that another process does not interfer
|
||||||
movzx ecx, word [ebx]
|
mov cx, [ebx]
|
||||||
mov [ebx], ax
|
mov [ebx], ax
|
||||||
shl eax, 1
|
mov [queueList + eax * 2], cx
|
||||||
add eax, queueList
|
|
||||||
mov [eax], cx
|
|
||||||
sti
|
sti
|
||||||
pop ecx
|
pop ecx
|
||||||
pop ebx
|
pop ebx
|
||||||
@ -105,7 +106,12 @@ qs_exit:
|
|||||||
; all other registers preserved
|
; all other registers preserved
|
||||||
; This always works, so no error returned
|
; This always works, so no error returned
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
|
uglobal
|
||||||
|
queue_cnt dd ?
|
||||||
|
endg
|
||||||
queue:
|
queue:
|
||||||
|
; inc [queue_cnt]
|
||||||
|
; DEBUGF 1, "K : queue (%u)\n", [queue_cnt]
|
||||||
push ebx
|
push ebx
|
||||||
shl ebx, 1
|
shl ebx, 1
|
||||||
add ebx, queueList ; eax now holds address of queue entry
|
add ebx, queueList ; eax now holds address of queue entry
|
||||||
@ -155,6 +161,9 @@ qu_exit:
|
|||||||
; all other registers preserved
|
; all other registers preserved
|
||||||
;
|
;
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
|
uglobal
|
||||||
|
dequeue_cnt dd ?
|
||||||
|
endg
|
||||||
dequeue:
|
dequeue:
|
||||||
push ebx
|
push ebx
|
||||||
shl eax, 1
|
shl eax, 1
|
||||||
@ -164,6 +173,8 @@ dequeue:
|
|||||||
movzx eax, word [eax]
|
movzx eax, word [eax]
|
||||||
cmp ax, NO_BUFFER
|
cmp ax, NO_BUFFER
|
||||||
je dq_exit
|
je dq_exit
|
||||||
|
; inc [dequeue_cnt]
|
||||||
|
; DEBUGF 1, "K : dequeue (%u)\n", [dequeue_cnt]
|
||||||
push eax
|
push eax
|
||||||
shl eax, 1
|
shl eax, 1
|
||||||
add eax, queueList ; eax now holds address of queue entry
|
add eax, queueList ; eax now holds address of queue entry
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -37,7 +37,7 @@ $Revision$
|
|||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
StackCounters:
|
StackCounters:
|
||||||
dumped_rx_count: dd 0
|
dumped_rx_count dd 0
|
||||||
arp_tx_count: dd 0
|
arp_tx_count: dd 0
|
||||||
arp_rx_count: dd 0
|
arp_rx_count: dd 0
|
||||||
ip_rx_count: dd 0
|
ip_rx_count: dd 0
|
||||||
@ -46,9 +46,9 @@ endg
|
|||||||
|
|
||||||
; socket buffers
|
; socket buffers
|
||||||
SOCKETBUFFSIZE equ 4096 ; state + config + buffer.
|
SOCKETBUFFSIZE equ 4096 ; state + config + buffer.
|
||||||
SOCKETHEADERSIZE equ 76 ; thus 4096 - SOCKETHEADERSIZE bytes data
|
SOCKETHEADERSIZE equ 76+8+8 ; thus 4096 - SOCKETHEADERSIZE bytes data
|
||||||
|
|
||||||
NUM_SOCKETS equ 16 ; Number of open sockets supported. Was 20
|
;NUM_SOCKETS equ 16 ; Number of open sockets supported. Was 20
|
||||||
|
|
||||||
; IPBUFF status values
|
; IPBUFF status values
|
||||||
BUFF_EMPTY equ 0
|
BUFF_EMPTY equ 0
|
||||||
@ -94,7 +94,7 @@ ethernet_active equ stack_data + 9
|
|||||||
; TODO :: empty memory area
|
; TODO :: empty memory area
|
||||||
|
|
||||||
; Address of selected socket
|
; Address of selected socket
|
||||||
sktAddr equ stack_data + 32
|
;sktAddr equ stack_data + 32
|
||||||
; Parameter to checksum routine - data ptr
|
; Parameter to checksum routine - data ptr
|
||||||
checkAdd1 equ stack_data + 36
|
checkAdd1 equ stack_data + 36
|
||||||
; Parameter to checksum routine - 2nd data ptr
|
; Parameter to checksum routine - 2nd data ptr
|
||||||
@ -110,8 +110,8 @@ checkResult equ stack_data + 48
|
|||||||
pseudoHeader equ stack_data + 50
|
pseudoHeader equ stack_data + 50
|
||||||
|
|
||||||
; receive and transmit IP buffer allocation
|
; receive and transmit IP buffer allocation
|
||||||
sockets equ stack_data + 62
|
;sockets equ stack_data + 62
|
||||||
Next_free2 equ sockets + (SOCKETBUFFSIZE * NUM_SOCKETS)
|
Next_free2 equ stack_data + 62;Next_free2 equ sockets + (SOCKETBUFFSIZE * NUM_SOCKETS)
|
||||||
; 1560 byte buffer for rx / tx ethernet packets
|
; 1560 byte buffer for rx / tx ethernet packets
|
||||||
Ether_buffer equ Next_free2
|
Ether_buffer equ Next_free2
|
||||||
Next_free3 equ Ether_buffer + 1518
|
Next_free3 equ Ether_buffer + 1518
|
||||||
@ -128,9 +128,14 @@ last_1hsTick equ queueList + ( 2 * NUMQUEUEENTRIES )
|
|||||||
|
|
||||||
|
|
||||||
;resendQ equ 0x770000
|
;resendQ equ 0x770000
|
||||||
resendBuffer equ resendQ + ( 4 * NUMRESENDENTRIES ) ; for TCP
|
;resendBuffer equ resendQ + ( 4 * NUMRESENDENTRIES ) ; for TCP ; XTODO: validate size
|
||||||
|
resendBuffer equ resendQ + ( 8 * NUMRESENDENTRIES ) ; for TCP
|
||||||
|
|
||||||
|
|
||||||
|
uglobal
|
||||||
|
net_sockets rd 2
|
||||||
|
endg
|
||||||
|
|
||||||
; simple macro for memory set operation
|
; simple macro for memory set operation
|
||||||
macro _memset_dw adr,value,amount
|
macro _memset_dw adr,value,amount
|
||||||
{
|
{
|
||||||
@ -151,9 +156,6 @@ macro _memset_dw adr,value,amount
|
|||||||
include "queue.inc"
|
include "queue.inc"
|
||||||
include "eth_drv/ethernet.inc"
|
include "eth_drv/ethernet.inc"
|
||||||
include "ip.inc"
|
include "ip.inc"
|
||||||
include "icmp.inc"
|
|
||||||
include "tcp.inc"
|
|
||||||
include "udp.inc"
|
|
||||||
include "socket.inc"
|
include "socket.inc"
|
||||||
|
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
@ -171,7 +173,10 @@ include "socket.inc"
|
|||||||
stack_init:
|
stack_init:
|
||||||
; Init two address spaces with default values
|
; Init two address spaces with default values
|
||||||
_memset_dw stack_data_start, 0, 0x20000/4
|
_memset_dw stack_data_start, 0, 0x20000/4
|
||||||
_memset_dw resendQ, 0xFFFFFFFF, NUMRESENDENTRIES
|
_memset_dw resendQ, 0, NUMRESENDENTRIES * 2
|
||||||
|
|
||||||
|
mov [net_sockets], 0
|
||||||
|
mov [net_sockets + 4], 0
|
||||||
|
|
||||||
; Queries initialization
|
; Queries initialization
|
||||||
call queueInit
|
call queueInit
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -71,7 +71,8 @@ end virtual
|
|||||||
; Free up (or re-use) IP buffer when finished
|
; Free up (or re-use) IP buffer when finished
|
||||||
;
|
;
|
||||||
;***************************************************************************
|
;***************************************************************************
|
||||||
udp_rx:
|
|
||||||
|
proc udp_rx stdcall
|
||||||
push eax
|
push eax
|
||||||
|
|
||||||
; First validate the header & checksum. Discard buffer if error
|
; First validate the header & checksum. Discard buffer if error
|
||||||
@ -80,94 +81,81 @@ udp_rx:
|
|||||||
; IP Packet UDP Destination Port = local Port
|
; IP Packet UDP Destination Port = local Port
|
||||||
; IP Packet SA = Remote IP
|
; IP Packet SA = Remote IP
|
||||||
|
|
||||||
movzx ebx, word [edx + 22] ; get the local port from
|
mov ax, [edx + 20 + UDP_PACKET.DestinationPort] ; get the local port from
|
||||||
; the IP packet's UDP header
|
; the IP packet's UDP header
|
||||||
mov eax, SOCKETBUFFSIZE * NUM_SOCKETS
|
|
||||||
mov ecx, NUM_SOCKETS
|
|
||||||
|
|
||||||
fs1:
|
mov ebx, net_sockets
|
||||||
sub eax, SOCKETBUFFSIZE
|
|
||||||
cmp [eax + sockets + 12], bx ; bx will hold the 'wrong' value,
|
.next_socket:
|
||||||
|
mov ebx, [ebx + SOCKET.NextPtr]
|
||||||
|
or ebx, ebx
|
||||||
|
jz .exit ; No match, so exit
|
||||||
|
cmp [ebx + SOCKET.LocalPort], ax ; ax will hold the 'wrong' value,
|
||||||
; but the comparision is correct
|
; but the comparision is correct
|
||||||
loopnz fs1 ; Return back if no match
|
jne .next_socket ; Return back if no match
|
||||||
jz fs_done
|
|
||||||
|
|
||||||
; No match, so exit
|
|
||||||
jmp udprx_001
|
|
||||||
|
|
||||||
fs_done:
|
|
||||||
; For dhcp, we must allow any remote server to respond.
|
; For dhcp, we must allow any remote server to respond.
|
||||||
; I will accept the first incoming response to be the one
|
; I will accept the first incoming response to be the one
|
||||||
; I bind to, if the socket is opened with a destination IP address of
|
; I bind to, if the socket is opened with a destination IP address of
|
||||||
; 255.255.255.255
|
; 255.255.255.255
|
||||||
mov ebx, [eax + sockets + 16]
|
cmp [ebx + SOCKET.RemoteIP], 0xffffffff
|
||||||
cmp ebx, 0xffffffff
|
je @f
|
||||||
je udprx_002
|
|
||||||
|
|
||||||
mov ebx, [edx + 12] ; get the Source address from the IP packet
|
mov eax, [edx + IP_PACKET.SourceAddress] ; get the Source address from the IP packet
|
||||||
cmp [eax + sockets + 16], ebx
|
cmp [ebx + SOCKET.RemoteIP], ebx
|
||||||
jne udprx_001 ; Quit if the source IP is not valid
|
jne .exit ; Quit if the source IP is not valid
|
||||||
|
|
||||||
udprx_002:
|
@@: ; OK - we have a valid UDP packet for this socket.
|
||||||
; OK - we have a valid UDP packet for this socket.
|
|
||||||
; First, update the sockets remote port number with the incoming msg
|
; First, update the sockets remote port number with the incoming msg
|
||||||
; - it will have changed
|
; - it will have changed
|
||||||
; from the original ( 69 normally ) to allow further connects
|
; from the original ( 69 normally ) to allow further connects
|
||||||
movzx ebx, word [edx + 20] ; get the UDP source port
|
mov ax, [edx + 20 + UDP_PACKET.SourcePort] ; get the UDP source port
|
||||||
; ( was 69, now new )
|
; ( was 69, now new )
|
||||||
mov [eax + sockets + 20], bx
|
mov [ebx + SOCKET.RemotePort], ax
|
||||||
|
|
||||||
; Now, copy data to socket. We have socket address as [eax + sockets].
|
; Now, copy data to socket. We have socket address as [eax + sockets].
|
||||||
; We have IP packet in edx
|
; We have IP packet in edx
|
||||||
|
|
||||||
; get # of bytes in ecx
|
; get # of bytes in ecx
|
||||||
movzx ecx, byte [edx + 3] ; total length of IP packet. Subtract
|
movzx ecx, [edx + IP_PACKET.TotalLength] ; total length of IP packet. Subtract
|
||||||
mov ch, byte [edx + 2] ; 20 + 8 gives data length
|
xchg cl, ch ; 20 + 8 gives data length
|
||||||
sub ecx, 28
|
sub ecx, 28
|
||||||
|
|
||||||
mov ebx, eax
|
mov eax, [ebx + SOCKET.rxDataCount] ; get # of bytes already in buffer
|
||||||
add ebx, sockets ; ebx = address of actual socket
|
add [ebx + SOCKET.rxDataCount], ecx ; increment the count of bytes in buffer
|
||||||
|
|
||||||
mov eax, [ebx+ 4] ; get socket owner PID
|
; ecx has count, edx points to data
|
||||||
push eax
|
|
||||||
|
|
||||||
mov eax, [ebx + 24] ; get # of bytes already in buffer
|
|
||||||
add [ebx + 24], ecx ; increment the count of bytes in buffer
|
|
||||||
|
|
||||||
; point to the location to store the data
|
|
||||||
add ebx, eax
|
|
||||||
add ebx, SOCKETHEADERSIZE
|
|
||||||
|
|
||||||
; ebx = location for first byte, ecx has count,
|
|
||||||
; edx points to data
|
|
||||||
|
|
||||||
add edx, 28 ; edx now points to the data
|
add edx, 28 ; edx now points to the data
|
||||||
mov edi, ebx
|
lea edi, [ebx + eax + SOCKETHEADERSIZE]
|
||||||
mov esi, edx
|
mov esi, edx
|
||||||
|
|
||||||
cld
|
cld
|
||||||
rep movsb ; copy the data across
|
rep movsb ; copy the data across
|
||||||
|
|
||||||
; flag an event to the application
|
; flag an event to the application
|
||||||
pop eax
|
mov eax, [ebx + SOCKET.PID] ; get socket owner PID
|
||||||
mov ecx, 1
|
mov ecx, 1
|
||||||
mov esi, TASK_DATA + TASKDATA.pid
|
mov esi, TASK_DATA + TASKDATA.pid
|
||||||
|
|
||||||
newsearch:
|
.next_pid:
|
||||||
cmp [esi], eax
|
cmp [esi], eax
|
||||||
je foundPID
|
je .found_pid
|
||||||
inc ecx
|
inc ecx
|
||||||
add esi, 0x20
|
add esi, 0x20
|
||||||
cmp ecx, [TASK_COUNT]
|
cmp ecx, [TASK_COUNT]
|
||||||
jbe newsearch
|
jbe .next_pid
|
||||||
|
|
||||||
foundPID:
|
jmp .exit
|
||||||
|
|
||||||
|
.found_pid:
|
||||||
shl ecx, 8
|
shl ecx, 8
|
||||||
or dword [ecx+SLOT_BASE+APPDATA.event_mask],dword 10000000b ; stack event
|
or [ecx + SLOT_BASE + APPDATA.event_mask], EVENT_NETWORK ; stack event
|
||||||
|
|
||||||
mov [check_idle_semaphore], 200
|
mov [check_idle_semaphore], 200
|
||||||
|
|
||||||
udprx_001:
|
.exit:
|
||||||
pop eax
|
pop eax
|
||||||
call freeBuff ; Discard the packet
|
call freeBuff ; Discard the packet
|
||||||
ret
|
ret
|
||||||
|
endp
|
||||||
|
@ -880,6 +880,14 @@ vesa12_putimage:
|
|||||||
|
|
||||||
add edi,[BytesPerScanLine]
|
add edi,[BytesPerScanLine]
|
||||||
add esi,[esp+32]
|
add esi,[esp+32]
|
||||||
|
cmp ebp,putimage_get1bpp
|
||||||
|
jz .correct
|
||||||
|
cmp ebp,putimage_get4bpp
|
||||||
|
jnz @f
|
||||||
|
.correct:
|
||||||
|
mov eax,[esp+20]
|
||||||
|
mov byte[eax],80h
|
||||||
|
@@:
|
||||||
dec ebx
|
dec ebx
|
||||||
jnz newpi12
|
jnz newpi12
|
||||||
|
|
||||||
@ -945,6 +953,14 @@ vesa12_putimage:
|
|||||||
pop edi
|
pop edi
|
||||||
|
|
||||||
add edi,[BytesPerScanLine]
|
add edi,[BytesPerScanLine]
|
||||||
|
cmp ebp,putimage_get1bpp
|
||||||
|
jz .correct
|
||||||
|
cmp ebp,putimage_get4bpp
|
||||||
|
jnz @f
|
||||||
|
.correct:
|
||||||
|
mov eax,[esp+20]
|
||||||
|
mov byte[eax],80h
|
||||||
|
@@:
|
||||||
dec ebx
|
dec ebx
|
||||||
jnz newpi3212
|
jnz newpi3212
|
||||||
|
|
||||||
|
@ -163,7 +163,8 @@ vesa20_putimage:
|
|||||||
mov [putimg.real_sy], ebx
|
mov [putimg.real_sy], ebx
|
||||||
; line increment
|
; line increment
|
||||||
mov eax, [putimg.image_sx]
|
mov eax, [putimg.image_sx]
|
||||||
sub eax, [putimg.real_sx]
|
mov ecx, [putimg.real_sx]
|
||||||
|
sub eax, ecx
|
||||||
;; imul eax, [putimg.source_bpp]
|
;; imul eax, [putimg.source_bpp]
|
||||||
; lea eax, [eax + eax * 2]
|
; lea eax, [eax + eax * 2]
|
||||||
call esi
|
call esi
|
||||||
@ -176,7 +177,6 @@ vesa20_putimage:
|
|||||||
mov [putimg.winmap_newline], eax
|
mov [putimg.winmap_newline], eax
|
||||||
; screen new line increment
|
; screen new line increment
|
||||||
mov eax, [BytesPerScanLine]
|
mov eax, [BytesPerScanLine]
|
||||||
mov ecx, [putimg.real_sx]
|
|
||||||
movzx ebx, byte [ScreenBPP]
|
movzx ebx, byte [ScreenBPP]
|
||||||
shr ebx, 3
|
shr ebx, 3
|
||||||
imul ecx, ebx
|
imul ecx, ebx
|
||||||
@ -232,6 +232,14 @@ align 4
|
|||||||
add edx, [putimg.screen_newline] ;[BytesPerScanLine]
|
add edx, [putimg.screen_newline] ;[BytesPerScanLine]
|
||||||
add ebp, [putimg.winmap_newline] ;[Screen_Max_X]
|
add ebp, [putimg.winmap_newline] ;[Screen_Max_X]
|
||||||
; inc ebp
|
; inc ebp
|
||||||
|
cmp [putimg.ebp], putimage_get1bpp
|
||||||
|
jz .correct
|
||||||
|
cmp [putimg.ebp], putimage_get4bpp
|
||||||
|
jnz @f
|
||||||
|
.correct:
|
||||||
|
mov eax, [putimg.edi]
|
||||||
|
mov byte [eax], 80h
|
||||||
|
@@:
|
||||||
dec edi
|
dec edi
|
||||||
jnz .new_line
|
jnz .new_line
|
||||||
.finish:
|
.finish:
|
||||||
@ -265,6 +273,14 @@ align 4
|
|||||||
add edx, [putimg.screen_newline] ;[BytesPerScanLine]
|
add edx, [putimg.screen_newline] ;[BytesPerScanLine]
|
||||||
add ebp, [putimg.winmap_newline] ;[Screen_Max_X]
|
add ebp, [putimg.winmap_newline] ;[Screen_Max_X]
|
||||||
; inc ebp
|
; inc ebp
|
||||||
|
cmp [putimg.ebp], putimage_get1bpp
|
||||||
|
jz .correct
|
||||||
|
cmp [putimg.ebp], putimage_get4bpp
|
||||||
|
jnz @f
|
||||||
|
.correct:
|
||||||
|
mov eax, [putimg.edi]
|
||||||
|
mov byte [eax], 80h
|
||||||
|
@@:
|
||||||
dec edi
|
dec edi
|
||||||
jnz .new_line
|
jnz .new_line
|
||||||
.finish:
|
.finish:
|
||||||
|
Loading…
Reference in New Issue
Block a user