[SeaBIOS] [PATCH] make seabios 386/486 friendly

Kevin O'Connor kevin at koconnor.net
Tue Jan 24 14:43:13 CET 2012


On Tue, Jan 24, 2012 at 12:47:39PM +0100, Rudolf Marek wrote:
> >This reminds me that the GET_ set stuff should treat the variables as volatile,
> >because otherwise if it can be changed from outside compiler might not know and
> >will happily perform a test on register version of the variable. Or even better,
> >it should contain memory clobber asm volatile ("" ::: "memory") which will act
> >as a barrier for compiler to reload all variables used and not rely on cached
> >values in registers.
> 
> Just to make it more clear, this remark is just for the situation if
> you may have irq handler interrupting a function. Compiler can read
> from memory just once and use cached value in register.

SeaBIOS C code always runs with irqs disabled.

I've played with the macros in farptr.h quite a bit, and I think
they're okay.  If anything, the compiler seems to unnecessarily
pessimize the resulting assembler (I've never seen it cache the result
of a read even when it's valid to do that).

> All in all everything depends what can/could be called while
> interrupts are enabled in seabios. If you want  to have the GET/SET
> stuff at least atomic, and reloadable then use  same thing as in
> Linux kernel "atomic" variables. On x86 mov is guaranteed to be
> atomic (at most 32bit only) and because it is internally implemented
> as structure with volatile property it works fine in all cases.

Since the code runs with irqs disabled, it can't be interrupted and is
therefore atomic.  The yield() call does invoke a barrier() so it
can't be run out of order.

> In my case I use here 64bit data then it means I need to use
> irq_save restore in any case. It is even doing a barrier for
> compiler. Therefore I think it is the best solution here.

Please don't do that.  It's just going to confuse the code.  There
should be no reason for a barrier() or messing with the irqs.

-Kevin



More information about the SeaBIOS mailing list