mirror of https://github.com/hak5/openwrt-owl.git
mtd: Changed mtd_fixtrx and related functions to be weak references. The weak references only lead to actual functions for brcm47xx
Signed-off-by: Daniel Dickinson <daniel@cshore.neomailbox.net> SVN-Revision: 24833owl
parent
ec45087403
commit
b1362f94bc
|
@ -44,31 +44,10 @@
|
||||||
#include "mtd-api.h"
|
#include "mtd-api.h"
|
||||||
#include "fis.h"
|
#include "fis.h"
|
||||||
#include "mtd.h"
|
#include "mtd.h"
|
||||||
#include "crc32.h"
|
|
||||||
|
|
||||||
#define MAX_ARGS 8
|
#define MAX_ARGS 8
|
||||||
#define JFFS2_DEFAULT_DIR "" /* directory name without /, empty means root dir */
|
#define JFFS2_DEFAULT_DIR "" /* directory name without /, empty means root dir */
|
||||||
|
|
||||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
#define STORE32_LE(X) ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24))
|
|
||||||
#elif __BYTE_ORDER == __LITTLE_ENDIAN
|
|
||||||
#define STORE32_LE(X) (X)
|
|
||||||
#else
|
|
||||||
#error unkown endianness!
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
|
|
||||||
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
|
|
||||||
|
|
||||||
#define TRX_MAGIC 0x30524448 /* "HDR0" */
|
|
||||||
struct trx_header {
|
|
||||||
uint32_t magic; /* "HDR0" */
|
|
||||||
uint32_t len; /* Length of file including header */
|
|
||||||
uint32_t crc32; /* 32-bit CRC from flag_version to end of file */
|
|
||||||
uint32_t flag_version; /* 0:15 flags, 16:31 version */
|
|
||||||
uint32_t offsets[3]; /* Offsets of partitions from start of header */
|
|
||||||
};
|
|
||||||
|
|
||||||
static char *buf = NULL;
|
static char *buf = NULL;
|
||||||
static char *imagefile = NULL;
|
static char *imagefile = NULL;
|
||||||
static char *jffs2file = NULL, *jffs2dir = JFFS2_DEFAULT_DIR;
|
static char *jffs2file = NULL, *jffs2dir = JFFS2_DEFAULT_DIR;
|
||||||
|
@ -151,9 +130,9 @@ static int
|
||||||
image_check(int imagefd, const char *mtd)
|
image_check(int imagefd, const char *mtd)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
#ifdef target_brcm
|
if (trx_check) {
|
||||||
ret = trx_check(imagefd, mtd, buf, &buflen);
|
ret = trx_check(imagefd, mtd, buf, &buflen);
|
||||||
#endif
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,82 +244,6 @@ mtd_erase(const char *mtd)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
mtd_fixtrx(const char *mtd, size_t offset)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
struct trx_header *trx;
|
|
||||||
char *buf;
|
|
||||||
ssize_t res;
|
|
||||||
size_t block_offset;
|
|
||||||
|
|
||||||
if (quiet < 2)
|
|
||||||
fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset);
|
|
||||||
|
|
||||||
block_offset = offset & ~(erasesize - 1);
|
|
||||||
offset -= block_offset;
|
|
||||||
|
|
||||||
fd = mtd_check_open(mtd);
|
|
||||||
if(fd < 0) {
|
|
||||||
fprintf(stderr, "Could not open mtd device: %s\n", mtd);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (block_offset + erasesize > mtdsize) {
|
|
||||||
fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = malloc(erasesize);
|
|
||||||
if (!buf) {
|
|
||||||
perror("malloc");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = pread(fd, buf, erasesize, block_offset);
|
|
||||||
if (res != erasesize) {
|
|
||||||
perror("pread");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
trx = (struct trx_header *) (buf + offset);
|
|
||||||
if (trx->magic != STORE32_LE(0x30524448)) {
|
|
||||||
fprintf(stderr, "No trx magic found\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trx->len == STORE32_LE(erasesize - offset)) {
|
|
||||||
if (quiet < 2)
|
|
||||||
fprintf(stderr, "Header already fixed, exiting\n");
|
|
||||||
close(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
trx->len = STORE32_LE(erasesize - offset);
|
|
||||||
|
|
||||||
trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4));
|
|
||||||
if (mtd_erase_block(fd, block_offset)) {
|
|
||||||
fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (quiet < 2)
|
|
||||||
fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32);
|
|
||||||
|
|
||||||
if (pwrite(fd, buf, erasesize, block_offset) != erasesize) {
|
|
||||||
fprintf(stderr, "Error writing block (%s)\n", strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (quiet < 2)
|
|
||||||
fprintf(stderr, "Done.\n");
|
|
||||||
|
|
||||||
close (fd);
|
|
||||||
sync();
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mtd_refresh(const char *mtd)
|
mtd_refresh(const char *mtd)
|
||||||
{
|
{
|
||||||
|
@ -594,8 +497,12 @@ static void usage(void)
|
||||||
" refresh refresh mtd partition\n"
|
" refresh refresh mtd partition\n"
|
||||||
" erase erase all data on device\n"
|
" erase erase all data on device\n"
|
||||||
" write <imagefile>|- write <imagefile> (use - for stdin) to device\n"
|
" write <imagefile>|- write <imagefile> (use - for stdin) to device\n"
|
||||||
" jffs2write <file> append <file> to the jffs2 partition on the device\n"
|
" jffs2write <file> append <file> to the jffs2 partition on the device\n");
|
||||||
" fixtrx fix the checksum in a trx header on first boot\n"
|
if (mtd_fixtrx) {
|
||||||
|
fprintf(stderr,
|
||||||
|
" fixtrx fix the checksum in a trx header on first boot\n");
|
||||||
|
}
|
||||||
|
fprintf(stderr,
|
||||||
"Following options are available:\n"
|
"Following options are available:\n"
|
||||||
" -q quiet mode (once: no [w] on writing,\n"
|
" -q quiet mode (once: no [w] on writing,\n"
|
||||||
" twice: no status messages)\n"
|
" twice: no status messages)\n"
|
||||||
|
@ -604,8 +511,12 @@ static void usage(void)
|
||||||
" -f force write without trx checks\n"
|
" -f force write without trx checks\n"
|
||||||
" -e <device> erase <device> before executing the command\n"
|
" -e <device> erase <device> before executing the command\n"
|
||||||
" -d <name> directory for jffs2write, defaults to \"tmp\"\n"
|
" -d <name> directory for jffs2write, defaults to \"tmp\"\n"
|
||||||
" -j <name> integrate <file> into jffs2 data when writing an image\n"
|
" -j <name> integrate <file> into jffs2 data when writing an image\n");
|
||||||
" -o offset offset of the trx header in the partition (for fixtrx)\n"
|
if (mtd_fixtrx) {
|
||||||
|
fprintf(stderr,
|
||||||
|
" -o offset offset of the image header in the partition(for fixtrx)\n");
|
||||||
|
}
|
||||||
|
fprintf(stderr,
|
||||||
#ifdef FIS_SUPPORT
|
#ifdef FIS_SUPPORT
|
||||||
" -F <part>[:<size>[:<entrypoint>]][,<part>...]\n"
|
" -F <part>[:<size>[:<entrypoint>]][,<part>...]\n"
|
||||||
" alter the fis partition table to create new partitions replacing\n"
|
" alter the fis partition table to create new partitions replacing\n"
|
||||||
|
@ -686,6 +597,10 @@ int main (int argc, char **argv)
|
||||||
jffs2dir = optarg;
|
jffs2dir = optarg;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
|
if (!mtd_fixtrx) {
|
||||||
|
fprintf(stderr, "-o: Only for brcm47xx\n");
|
||||||
|
usage();
|
||||||
|
}
|
||||||
errno = 0;
|
errno = 0;
|
||||||
offset = strtoul(optarg, 0, 0);
|
offset = strtoul(optarg, 0, 0);
|
||||||
if (errno) {
|
if (errno) {
|
||||||
|
@ -717,7 +632,7 @@ int main (int argc, char **argv)
|
||||||
} else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) {
|
} else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) {
|
||||||
cmd = CMD_ERASE;
|
cmd = CMD_ERASE;
|
||||||
device = argv[1];
|
device = argv[1];
|
||||||
} else if ((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) {
|
} else if (((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) && mtd_fixtrx) {
|
||||||
cmd = CMD_FIXTRX;
|
cmd = CMD_FIXTRX;
|
||||||
device = argv[1];
|
device = argv[1];
|
||||||
} else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) {
|
} else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) {
|
||||||
|
@ -793,7 +708,9 @@ int main (int argc, char **argv)
|
||||||
mtd_refresh(device);
|
mtd_refresh(device);
|
||||||
break;
|
break;
|
||||||
case CMD_FIXTRX:
|
case CMD_FIXTRX:
|
||||||
mtd_fixtrx(device, offset);
|
if (mtd_fixtrx) {
|
||||||
|
mtd_fixtrx(device, offset);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,8 @@ extern int mtd_write_jffs2(const char *mtd, const char *filename, const char *di
|
||||||
extern int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename);
|
extern int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename);
|
||||||
extern void mtd_parse_jffs2data(const char *buf, const char *dir);
|
extern void mtd_parse_jffs2data(const char *buf, const char *dir);
|
||||||
|
|
||||||
/* target specific */
|
/* target specific functions */
|
||||||
extern int trx_fixup(int fd, const char *name);
|
extern int trx_fixup(int fd, const char *name) __attribute__ ((weak));
|
||||||
extern int trx_check(int imagefd, const char *mtd, char *buf, int *len);
|
extern int trx_check(int imagefd, const char *mtd, char *buf, int *len) __attribute__ ((weak));
|
||||||
|
extern int mtd_fixtrx(const char *mtd, size_t offset) __attribute__ ((weak));
|
||||||
#endif /* __mtd_h */
|
#endif /* __mtd_h */
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include "mtd-api.h"
|
#include "mtd-api.h"
|
||||||
|
@ -35,13 +36,24 @@
|
||||||
|
|
||||||
#define TRX_MAGIC 0x30524448 /* "HDR0" */
|
#define TRX_MAGIC 0x30524448 /* "HDR0" */
|
||||||
struct trx_header {
|
struct trx_header {
|
||||||
unsigned magic; /* "HDR0" */
|
uint32_t magic; /* "HDR0" */
|
||||||
unsigned len; /* Length of file including header */
|
uint32_t len; /* Length of file including header */
|
||||||
unsigned crc32; /* 32-bit CRC from flag_version to end of file */
|
uint32_t crc32; /* 32-bit CRC from flag_version to end of file */
|
||||||
unsigned flag_version; /* 0:15 flags, 16:31 version */
|
uint32_t flag_version; /* 0:15 flags, 16:31 version */
|
||||||
unsigned offsets[3]; /* Offsets of partitions from start of header */
|
uint32_t offsets[3]; /* Offsets of partitions from start of header */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
#define STORE32_LE(X) ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24))
|
||||||
|
#elif __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
#define STORE32_LE(X) (X)
|
||||||
|
#else
|
||||||
|
#error unknown endianness!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
|
||||||
|
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
|
||||||
|
|
||||||
int
|
int
|
||||||
trx_fixup(int fd, const char *name)
|
trx_fixup(int fd, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -130,3 +142,79 @@ trx_check(int imagefd, const char *mtd, char *buf, int *len)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mtd_fixtrx(const char *mtd, size_t offset)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct trx_header *trx;
|
||||||
|
char *buf;
|
||||||
|
ssize_t res;
|
||||||
|
size_t block_offset;
|
||||||
|
|
||||||
|
if (quiet < 2)
|
||||||
|
fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset);
|
||||||
|
|
||||||
|
block_offset = offset & ~(erasesize - 1);
|
||||||
|
offset -= block_offset;
|
||||||
|
|
||||||
|
fd = mtd_check_open(mtd);
|
||||||
|
if(fd < 0) {
|
||||||
|
fprintf(stderr, "Could not open mtd device: %s\n", mtd);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block_offset + erasesize > mtdsize) {
|
||||||
|
fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = malloc(erasesize);
|
||||||
|
if (!buf) {
|
||||||
|
perror("malloc");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
res = pread(fd, buf, erasesize, block_offset);
|
||||||
|
if (res != erasesize) {
|
||||||
|
perror("pread");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
trx = (struct trx_header *) (buf + offset);
|
||||||
|
if (trx->magic != STORE32_LE(0x30524448)) {
|
||||||
|
fprintf(stderr, "No trx magic found\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trx->len == STORE32_LE(erasesize - offset)) {
|
||||||
|
if (quiet < 2)
|
||||||
|
fprintf(stderr, "Header already fixed, exiting\n");
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
trx->len = STORE32_LE(erasesize - offset);
|
||||||
|
|
||||||
|
trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4));
|
||||||
|
if (mtd_erase_block(fd, block_offset)) {
|
||||||
|
fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quiet < 2)
|
||||||
|
fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32);
|
||||||
|
|
||||||
|
if (pwrite(fd, buf, erasesize, block_offset) != erasesize) {
|
||||||
|
fprintf(stderr, "Error writing block (%s)\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quiet < 2)
|
||||||
|
fprintf(stderr, "Done.\n");
|
||||||
|
|
||||||
|
close (fd);
|
||||||
|
sync();
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue