#!/usr/bin/perl

sub do_dd($$)
{
	$command = "dd if=\"$_[0]\" of=\"$_[1].rom\" bs=1";
	print("$command\n");
	return system($command);
}

if (($#ARGV+1) < 1)
{
	print("Usage: $0 BUS:DEV:FUNC\n");
	exit(1);
}

if ($ENV{'USER'} ne "root")
{
	print("root privileges needed! exiting...\n");
	exit(2);
}

$arg = $ARGV[0];

($bus, $dev, $func) = split(':', $arg);
#`grep '$name' /proc/iomem`;
$arg = sprintf("%04x:%02x:%02x.%1u", 0, $bus, $dev, $func);
$sysfs = "/sys/bus/pci/devices/".$arg."/rom";
if (! -w $sysfs)
{
	print("$sysfs: $!\n");
	exit(3);
}

$rc = 0;

$arg =~ s/:/_/g;
do_dd($sysfs, $arg);
if ($? != 0)
{
	print("Failed reading ROM from $sysfs\n");
	print("Enabling ROM...\n");
	system("echo '1' >$sysfs");
	if (do_dd($sysfs, $arg) != 0)
	{
		print("ERROR: CANNOT READ ROM EVEN AFTER ENABLING: $!\n"); 
		$rc = 4;
	}
	print("Disabling ROM...\n");
	system("echo '0' >$sysfs");
}

exit($rc);
