From our investigations (Timo & I), there seems to be a memory
corruption when using a PXE boot on VBox.

You're committing a hack to workaround this memory corruption (which
replaces code which seems correct by some other code which is probably
correct), which lets you go a little bit further, where memory
corruption seems to strike again. And thus, this doesn't bring PXE boot
in better shape.

Furthermore, it appears that you're working around a bug which isn't in
ReactOS but in VBox. As a reminder, PXE boot works fine with Qemu, with
VMware. And when changing the ROM of VBox [1], then PXE boot works on
VBox as well.

Revert and report to VirtualBox instead. Our code is correct.

Thanks to Timo & Hervé for their help on digging into this issue.

[1]: https://git.ipxe.org/ipxe.git/blob/HEAD:/src/config/vbox/README

On 10/01/2015 01:21, hbelu...@svn.reactos.org wrote:
> Author: hbelusca
> Date: Sat Jan 10 00:21:33 2015
> New Revision: 66022
> 
> URL: http://svn.reactos.org/svn/reactos?rev=66022&view=rev
> Log:
> [FREELDR]: Commit a temporary "hackfix" for (Pc)GetTime: on VBox when booting 
> with PXE, for some mysterious reason, Int386(0x1A) call with AH = 0x02 (Get 
> CMOS Time) *never ever* returns!! (however without PXE everything works). 
> So... is it some kind of stack overflow or whatever that makes the Int386 
> function stack messy? Or something else? So in the meantime we use direct 
> CMOS port reads. Timo, Hervé (and others), can you please review? And in 
> particular why does it happen only with PXE?
> 
> Modified:
>     trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
> 
> Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c?rev=66022&r1=66021&r2=66022&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c      [iso-8859-1] 
> (original)
> +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c      [iso-8859-1] 
> Sat Jan 10 00:21:33 2015
> @@ -20,10 +20,50 @@
>  
>  #define BCD_INT(bcd) (((bcd & 0xf0) >> 4) * 10 + (bcd &0x0f))
>  
> +#ifndef INT386_WITH_INT_1A_AH_02_04__IS__FIXED
> +
> +/* CMOS Registers and Ports */
> +#define CMOS_CONTROL_PORT       (PUCHAR)0x70
> +#define CMOS_DATA_PORT          (PUCHAR)0x71
> +
> +#define RTC_REGISTER_A          0x0A
> +#define   RTC_REG_A_UIP         0x80
> +
> +static UCHAR
> +HalpReadCmos(IN UCHAR Reg)
> +{
> +    /* Select the register */
> +    WRITE_PORT_UCHAR(CMOS_CONTROL_PORT, Reg);
> +
> +    /* Query the value */
> +    return READ_PORT_UCHAR(CMOS_DATA_PORT);
> +}
> +
> +#endif
> +
>  TIMEINFO*
>  PcGetTime(VOID)
>  {
>      static TIMEINFO TimeInfo;
> +
> +#ifndef INT386_WITH_INT_1A_AH_02_04__IS__FIXED
> +
> +    /* Loop while update is in progress */
> +    while ((HalpReadCmos(RTC_REGISTER_A)) & RTC_REG_A_UIP);
> +
> +    /* Set the time data */
> +    TimeInfo.Second = BCD_INT(HalpReadCmos(0));
> +    TimeInfo.Minute = BCD_INT(HalpReadCmos(2));
> +    TimeInfo.Hour = BCD_INT(HalpReadCmos(4));
> +    TimeInfo.Day = BCD_INT(HalpReadCmos(7));
> +    TimeInfo.Month = BCD_INT(HalpReadCmos(8));
> +    TimeInfo.Year = BCD_INT(HalpReadCmos(9));
> +
> +    /* Compensate for the century field */
> +    TimeInfo.Year += (TimeInfo.Year > 80) ? 1900: 2000;
> +
> +#else
> +
>      REGS Regs;
>  
>      for (;;)
> @@ -86,6 +126,9 @@
>  
>          break;
>      }
> +
> +#endif
> +
>      return &TimeInfo;
>  }
>  
> 
> 


-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to