[flashrom] [PATCH] register_shutdown for execution on programmer shutdown
Anders Juel Jensen
andersjjensen at gmail.com
Sat Feb 13 17:22:04 CET 2010
On Friday 12 February 2010 03:59:10 Carl-Daniel Hailfinger wrote:
> Some programmers want to run certain functions during programmer
> shutdown, but the function choice depends on the code path taken during
> programmer init.
> Rather than rebuilding the whole init logic in the shutdown function, it
> is now possible to register functions for execution on programmer shutdown.
> The behaviour is similar to atexit(), but the registered functions will
> be run on programmer shutdown instead of on exit.
> Registered functions must have the prototype
> void function(void);
> and will be executed in reverse registration order directly before
> calling the programmer-specific shutdown() function. It is recommended
> to have shutdown() only disable programmer/hardware access and leave all
> code path sensitive shutdown to functions registered with
> register_shutdown().
> If in doubt, consult man atexit.
>
If i read this right i am going to need a wakeup() function too.. otherwise i
will be left with a system with no keyboard, mouse, power button and
*automatic fan control*.. i damn nearly fried my CPU when I played with this
:-/
Correct me if there is something about this i don't understand.. the below
little program that can call flashrom between shutdown and wakeup, and then
detection works.
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
void write_wait();
void read_wait();
int main()
{
unsigned char ret = 0;
iopl (3);
outb_p (0xb4, 0x64);
write_wait ();
outb_p (0xff, 0x64);
write_wait ();
while (! ret == 0xfa);
{
read_wait ();
ret = inb_p (0x60);
}
/* put nifty code that does magic trickery here.. */
/* Like calling flashrom ;-) */
outb_p (0xfb, 0x64);
write_wait();
outb_p (0xff, 0x64);
write_wait ();
return 0;
}
void write_wait()
{
int timer = 0;
while (inb_p(0x64) & 0x2)
{
if (++timer == 40000)
{
printf ("KBC port 0x64 does not accept commands - \n");
printf ("We may in fact have been shafted..\n");
exit (-1);
}
}
}
void read_wait()
{
int timer = 0;
while (!inb_p(0x64) & 0x1)
{
if (++timer == 40000)
{
printf ("KBC port 0x64 never became ready. Faulty Exit\n");
printf ("Your macine is in an unknown state.. great..\n");
exit (-1);
}
}
}
More information about the flashrom
mailing list