Page 2 of 3
Re: Accessing UNDI without PXE???
Posted: Tue Dec 18, 2012 10:25 am
by djmauretto
Just one more question; how does the checksum within the PXEROMID structure work please?
It's a simple Byte checksum,
you have to add each byte for the entire length of the structure, and if the result is zero then the checksum is correct and the structure is valid
Re: Accessing UNDI without PXE???
Posted: Tue Dec 18, 2012 10:56 am
by leejbaxter
djmauretto wrote:Just one more question; how does the checksum within the PXEROMID structure work please?
It's a simple Byte checksum,
you have to add each byte for the entire length of the structure, and if the result is zero then the checksum is correct and the structure is valid
How does that work (sorry, I've never played around with checksums before), because surely the contents of each byte will add together to equal a value greater than zero; is it the first lower 'N' bits that will be equal to zero (i.e. the result will be a multiple of 256, setting the lower byte of the result to 0)?
Sorry, and thankyou again djmauretto; it's times like this I realise how much of a n00b I am!
In return for all of your help, I'll also post the code for my uint printing code, as I think it's fairly useful for printing uints in any base using interrupt 0x10
Re: Accessing UNDI without PXE???
Posted: Tue Dec 18, 2012 11:05 am
by djmauretto
ok,
this is a example di byte checksum:
Code: Select all
; This structure is an example
Structure:
DATA_1 DW 1
DATA_2 DW 5
Length DW 7
DATA_3 DB 2
; Here the code
xor ax,ax ; AX = 0
mov cx,[Length] ; Load Structure Length
mov si, OFFSET Structure ; SI = Offset Structure
Checksum:
add al, [si]
add si,1
sub cx,1
jnz Checksum
test al,al ; IF AL = 0 , STRUCTURE IS VALID
jz CHECKSUM_SUCCESS
Simple
Re: Accessing UNDI without PXE???
Posted: Fri Nov 15, 2013 2:23 pm
by leejbaxter
Okay, I know it's been a long time, but here's that code that I promised back then!!!
Code: Select all
%ifndef __X86LIB_RMVIDEO__
%define __X86LIB_RMVIDEO__
;===========================================================================
; Description: Prints a null-terminated string to the screen.
;---------------------------------------------------------------------------
; Parameters:-
; DS:SI - The segment:offset of the null-terminated string.
; BL - The foreground colour.
; BH - The page number.
;===========================================================================
rmPrintString:
push ax
push ds
push si
mov ah, 0x0E
.printCharacter:
lodsb
or al, al
jz .done
int 0x10
jmp .printCharacter
.done:
pop si
pop ds
pop ax
ret
;===========================================================================
; Description: Prints an 8-bit unsigned integer to the screen.
;---------------------------------------------------------------------------
; Parameters:-
; AL - The 8-bit unsigned integer.
; BL - The foreground colour.
; BH - The page number.
; CL - The base to print in (2 to 16).
; CH - The minimum number of digits to print (use 0 for no padding).
;===========================================================================
rmPrintUInt8:
push eax
movzx eax, al
jmp rmPrintUInt32.initialise
;===========================================================================
; Description: Prints a 16-bit unsigned integer to the screen.
;---------------------------------------------------------------------------
; Parameters:-
; AX - The 16-bit unsigned integer.
; BL - The foreground colour.
; BH - The page number.
; CL - The base to print in (2 to 16).
; CH - The minimum number of digits to print (use 0 for no padding).
;===========================================================================
rmPrintUInt16:
push eax
movzx eax, ax
jmp rmPrintUInt32.initialise
;===========================================================================
; Description: Prints a 32-bit unsigned integer to the screen.
;---------------------------------------------------------------------------
; Parameters:-
; EAX - The 32-bit unsigned integer.
; BL - The foreground colour.
; BH - The page number.
; CL - The base to print in (2 to 16).
; CH - The minimum number of digits to print (use 0 for no padding).
;===========================================================================
rmPrintUInt32:
push eax
.initialise:
push ebx
push cx
push edx
mov [cs:.tempBX], bx
movzx ebx, cl
xor cl, cl
jmp .pushDigit
.tempBX: dw 0
.pushDigit:
xor edx, edx
div ebx
push dx
inc cl
or eax, eax
jnz .pushDigit
mov al, '0'
mov ah, 0x0E
mov bx, [cs:.tempBX]
.printPadding:
cmp cl, ch
jge .popDigit
int 0x10
dec ch
jmp .printPadding
.popDigit:
pop ax
dec cl
and al, 0x0F
add al, 0x30
cmp al, 0x39
jle .printDigit
add al, 0x07
.printDigit:
mov ah, 0x0E
int 0x10
or cl, cl
jnz .popDigit
pop edx
pop cx
pop ebx
pop eax
ret
%endif
Anyways, I seem to have hit a dead end. I've written some code to scan from physical addresses C0000 to EFFFF (segmented addresses C000:0000 to E000:FFFF) at every 2kb boundry (e.g. C000:0000, C000:0800, C000:1000 .etc.) and read in the first 2 bytes, comparing them to 0xAA55 (I also tried 0x55AA), but my code didn't find anything...
I've attached the code files for searching for option ROMs. The rmConvertAddressToSegmentOffset (which is confirmed as working) takes a physical address in EBX and returns its segment in DS and its offset in SI (e.g. if EBX = 0x000F1234, calling the function would set DS = 0xF000 and SI = 0x1234).
Re: Accessing UNDI without PXE???
Posted: Thu Feb 13, 2014 2:08 pm
by ccheng
Hi leejbaxter,
Have you made any progress on this PXE driver thing? I also come across to need such a driver to extend the GRUB such that I can use a disk-based bootloader to perform some simple network communication.
Thanks,
Cheng
Re: Accessing UNDI without PXE???
Posted: Thu Feb 13, 2014 4:45 pm
by Brendan
Hi,
Brendan wrote:The network card's own ROM is only initialised if the computer is being booted from network, and if the computer boots from hard drive or something else then nothing is setup. This leaves you with 2 choices - implement your own network card driver/s for each different network card; or implement special code for each different chipset to mess with the memory controllers and trick the network card's ROM into thinking you are the BIOS and that the computer will be booting from the network. For these choices, the first (have your own network drivers) would be more work but would also be a lot more reliable - there's too many "corner cases" that can mess up the latter (e.g. some or all of an "onboard" network device's ROM built into the system ROM itself preventing you from finding it).
Of course the first choice doesn't need PXE at all. It's the same as every other OS- e.g. boot from hard drive, setup network card drivers, then start processes (e.g. DHCP and TFTP servers) that use those drivers.
leejbaxter wrote:Anyways, I seem to have hit a dead end. I've written some code to scan from physical addresses C0000 to EFFFF (segmented addresses C000:0000 to E000:FFFF) at every 2kb boundry (e.g. C000:0000, C000:0800, C000:1000 .etc.) and read in the first 2 bytes, comparing them to 0xAA55 (I also tried 0x55AA), but my code didn't find anything...
ccheng wrote:Have you made any progress on this PXE driver thing? I also come across to need such a driver to extend the GRUB such that I can use a disk-based bootloader to perform some simple network communication.
To me, it looks like the only progress was proving that it can't work (confirming what I said previously).
Cheers,
Brendan
Re: Accessing UNDI without PXE???
Posted: Fri Feb 14, 2014 11:06 am
by djmauretto
Brendan wrote:To me, it looks like the only progress was proving that it can't work (confirming what I said previously).
Cheers,
Brendan
I've always used PXE, and it works for me ..
Try ....
Re: Accessing UNDI without PXE???
Posted: Fri Feb 14, 2014 12:21 pm
by Combuster
And the title says
without PXE
Re: Accessing UNDI without PXE???
Posted: Sun Feb 16, 2014 4:03 am
by djmauretto
Of course UNDI.
I wrote PXE. (sorry)
but if you read the entire post, which by the way is a few years ago, I explain how to do it and it works.
Re: Accessing UNDI without PXE???
Posted: Sun Feb 16, 2014 5:30 pm
by Brendan
Hi,
djmauretto wrote:Of course UNDI.
I wrote PXE. (sorry)
but if you read the entire post, which by the way is a few years ago, I explain how to do it and it works.
Are you saying that you boot from hard drive (not PXE); then search the ROM space (2 KiB boundaries from 0x000C0000) and find nothing because it doesn't exist because you didn't boot from network; and this "works" on all computers that you've never tested?
If you didn't boot from network there's no reason for firmware copy anything (UNDI, base code or PXE) into the ROM space area at all, and no guarantee that the BIOS has wasted its time doing pointless work for no reason.
Cheers,
Brendan
Re: Accessing UNDI without PXE???
Posted: Mon Feb 17, 2014 3:55 am
by djmauretto
Of course I have not tried all of the computers in the world, which of course is impossible.
But 80% of the computers I have found the structure UNDI, so it works ..
Try before you judge.
Also MS Virtual PC works in this way, and QEMU...
I remember QEMU is bugged..
All the computers I have at home support this function.
In all the computer BIOS is AMI
Re: Accessing UNDI without PXE???
Posted: Mon Feb 17, 2014 3:58 am
by Brendan
Hi,
djmauretto wrote:Of course I have not tried all of the computers in the world, which of course is impossible.
But 80% of the computers I have found the structure UNDI, so it works ..
Try before you judge
No thanks - 80% is well below my idea of "acceptable reliability".
Cheers,
Brendan
Re: Accessing UNDI without PXE???
Posted: Mon Feb 17, 2014 4:10 am
by djmauretto
Brendan wrote:No thanks - 80% is well below my idea of "acceptable reliability".
Cheers,
Brendan
ok, every person has his own approach to things, but that does not mean it does not work
Re: Accessing UNDI without PXE???
Posted: Mon Feb 17, 2014 4:29 am
by Brendan
Hi,
djmauretto wrote:Brendan wrote:No thanks - 80% is well below my idea of "acceptable reliability".
ok, every person has his own approach to things, but that does not mean it does not work
I'm sorry - I thought you said it didn't work 20% of the time (for the hardware you've tested)...
Cheers,
Brendan
Re: Accessing UNDI without PXE???
Posted: Mon Feb 17, 2014 4:36 am
by djmauretto
Brendan wrote:I'm sorry - I thought you said it didn't work 20% of the time (for the hardware you've tested)...
Cheers,
Brendan
20% of the time I have not found UNDI, and considering that the computers that I tested were not mine, I could not do the checks deeper.
In any case, what is your problem?
Instead of sitting here talking, why do not you do a little test?
As I told you before even MS Virtual PC and Qemu support this function.
I remenber that Qemu is bugged, but MS virtual PC works fine