Package: powerpc-utils Version: 1.1.3-16 Tags: patch Hi,
nvsetenv and nvsetvol can write to the nvram. The current generic_nvram driver (2.6.12) has no special close function. The pmac_nvram driver can only read or write whole nvram banks, so it allocates a ram buffer for them. This leads to the effect that the updated values can get lost, as the changes are not written back to the physical nvram (happens e.g. on an iBook G4) The enclosed patch works around this problem from userspace by calling the available ioctl for syncing the nvram explicitly. Bye, Joerg --- nvsetenv.c.orig 2005-08-06 19:20:54.000000000 +0200 +++ nvsetenv.c 2005-08-06 19:31:54.000000000 +0200 @@ -14,6 +14,12 @@ #include <string.h> #include <unistd.h> #include <fcntl.h> +#include <sys/ioctl.h> +#include <asm/nvram.h> +#ifndef IOC_NVRAM_SYNC +#warning IOC_NVRAM_SYNC undefined -- update your headers +#define IOC_NVRAM_SYNC _IO('p', 0x43) +#endif #define NVSTART 0x1800 // Start of the NVRam OF partition #define NVSIZE 0x800 // Size of of the NVRam @@ -325,6 +331,7 @@ else nvOld(ac, av, i, nvfd); + (void) ioctl(nvfd, IOC_NVRAM_SYNC); (void) close(nvfd); exit(EXIT_SUCCESS); } --- nvsetvol.c.orig 2005-08-06 19:21:09.000000000 +0200 +++ nvsetvol.c 2005-08-06 19:33:23.000000000 +0200 @@ -15,6 +15,12 @@ #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> +#include <sys/ioctl.h> +#include <asm/nvram.h> +#ifndef IOC_NVRAM_SYNC +#warning IOC_NVRAM_SYNC undefined -- update your headers +#define IOC_NVRAM_SYNC _IO('p', 0x43) +#endif typedef struct { unsigned char sig; @@ -99,6 +105,7 @@ die("error writing /dev/nvram"); printf("new volume is %d\n", buf[VOLADDR]); } + ioctl(fd, IOC_NVRAM_SYNC); close(fd); return 0; } --- nvvideo.c.orig 2005-08-06 19:21:46.000000000 +0200 +++ nvvideo.c 2005-08-06 19:38:25.000000000 +0200 @@ -3,6 +3,12 @@ #include <string.h> #include <unistd.h> #include <fcntl.h> +#include <sys/ioctl.h> +#include <asm/nvram.h> +#ifndef IOC_NVRAM_SYNC +#warning IOC_NVRAM_SYNC undefined -- update your headers +#define IOC_NVRAM_SYNC _IO('p', 0x43) +#endif #define NVSTART 0x140f #define NVSIZE 0x2 @@ -96,6 +102,7 @@ break; } + (void) ioctl(nvfd, IOC_NVRAM_SYNC); (void) close(nvfd); exit(EXIT_SUCCESS); }
signature.asc
Description: Digital signature