summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOyvind Repvik <nail@nslu2-linux.org>2007-04-02 10:30:00 +0000
committerOyvind Repvik <nail@nslu2-linux.org>2007-04-02 10:30:00 +0000
commit335ea31f4d6d37a42e4fcca9011b24a80799bf13 (patch)
tree5702d4ba5ff5abb61467457f67abbf726a7ec034
parent04cf366f5e4eadee5f64f657f07a3cfa6986531f (diff)
fis: Update fis util to one that doesn't require boost/libstdc++. Looks like it's working, but needs testing
-rw-r--r--packages/fis/files/.mtn2git_empty0
-rw-r--r--packages/fis/files/fis.cc372
-rw-r--r--packages/fis/fis_1.0.bb8
3 files changed, 3 insertions, 377 deletions
diff --git a/packages/fis/files/.mtn2git_empty b/packages/fis/files/.mtn2git_empty
deleted file mode 100644
index e69de29bb2..0000000000
--- a/packages/fis/files/.mtn2git_empty
+++ /dev/null
diff --git a/packages/fis/files/fis.cc b/packages/fis/files/fis.cc
deleted file mode 100644
index 8c43eca811..0000000000
--- a/packages/fis/files/fis.cc
+++ /dev/null
@@ -1,372 +0,0 @@
-// fis.cc
-// see http://svn.chezphil.org/utils
-// (C) 2007 Philip Endecott
-
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-
-#include <string>
-#include <iostream>
-#include <map>
-
-#include <boost/lexical_cast.hpp>
-#include <boost/format.hpp>
-
-#include "Exception.hh"
-#include "FileDescriptor.hh"
-#include "utils.hh"
-#include "endian.hh"
-
-#include <stdint.h>
-
-using namespace std;
-using namespace boost;
-using namespace pbe;
-
-
-static void check_dev(string device)
-{
- if (device=="") {
- throw "You must specify a device using -d";
- }
-}
-
-
-// This is taken from drivers/mtd/redboot.c in the Linux source
-struct fis_image_desc {
- char name[16]; // Null terminated name
- uint32_t flash_base; // Address within FLASH of image
- uint32_t mem_base; // Address in memory where it executes
- uint32_t size; // Length of image
- uint32_t entry_point; // Execution entry point
- uint32_t data_length; // Length of actual data
- uint32_t skips[53];
- uint32_t desc_cksum; // Checksum over image descriptor
- uint32_t file_cksum; // Checksum over image data
-};
-
-ostream& operator<<(ostream& strm, const fis_image_desc& d)
-{
- strm << format("%16s: addr = 0x%08x, size = 0x%08x\n")
- % (d.name) % (d.flash_base) % (d.size);
- for (unsigned int i=0; i<(sizeof(d.skips)/4); ++i) {
- if (d.skips[i]==0x736b6970 || d.skips[i]==0x70696b73) { // "skip"
- uint32_t offset = d.skips[i+1];
- uint32_t length = d.skips[i+2];
- strm << format(" skip: %08x + %08x\n")
- % (offset) % (length);
- i+=2;
- }
- }
- return strm;
-}
-
-
-void check_checksum(const fis_image_desc& d)
-{
- // This isn't checked by the kernel mtd driver, which has this
- // comment: "RedBoot doesn't actually write the desc_cksum field yet
- // AFAICT". I don't know what checksum is supposed to be used here.
-}
-
-void compute_checksum(fis_image_desc& d)
-{
- // ditto
-}
-
-
-typedef map<uint32_t,fis_image_desc> dir_t;
-
-
-static void swap_entry_endianness(fis_image_desc& d)
-{
- d.flash_base = swap_end_32(d.flash_base);
- d.mem_base = swap_end_32(d.mem_base);
- d.size = swap_end_32(d.size);
- d.entry_point = swap_end_32(d.entry_point);
- d.data_length = swap_end_32(d.data_length);
- for (unsigned int i=0; i<(sizeof(d.skips)/4); ++i) {
- d.skips[i] = swap_end_32(d.skips[i]);
- }
-}
-
-
-static void load_dir(FileDescriptor& fd, int offset, int size, bool swap_endianness,
- dir_t& dir)
-{
- fd.seek(offset);
- int num_entries = size/sizeof(fis_image_desc);
- for (int i=0; i<num_entries; ++i) {
- fis_image_desc d = fd.binread<fis_image_desc>();
- if (d.name[0]!=static_cast<char>(0xff)) {
- check_checksum(d);
- if (swap_endianness) {
- swap_entry_endianness(d);
- }
- dir[d.flash_base] = d;
- }
- }
-}
-
-
-static void write_blank_entries(FileDescriptor& fd, int n)
-{
- char dummy[sizeof(fis_image_desc)];
- for (unsigned int i=0; i<sizeof(fis_image_desc); ++i) {
- dummy[i] = 0xff;
- }
- for (int i=0; i<n; ++i) {
- fd.writeall(dummy,sizeof(fis_image_desc));
- }
-}
-
-
-static void save_dir(FileDescriptor& fd, int offset, int size, bool swap_endianness,
- const dir_t& dir)
-{
- fd.seek(offset);
- unsigned int num_entries = size/sizeof(fis_image_desc);
- if (num_entries<dir.size()) {
- throw "Too many entries for directory";
- }
- for (dir_t::const_iterator i=dir.begin();
- i!=dir.end(); ++i) {
- fis_image_desc d = i->second;
- compute_checksum(d);
- if (swap_endianness) {
- swap_entry_endianness(d);
- }
- fd.binwrite<fis_image_desc>(d);
- }
- write_blank_entries(fd,num_entries-dir.size());
-}
-
-
-static void fis_list(string device, int offset, int size, bool swap_endianness)
-{
- FileDescriptor fd(device,FileDescriptor::read_only);
- dir_t dir;
- load_dir(fd,offset,size,swap_endianness,dir);
- for (dir_t::const_iterator i = dir.begin();
- i != dir.end(); ++i) {
- cout << i->second;
- }
-}
-
-
-static void fis_init(string device, int offset, int size)
-{
- FileDescriptor fd(device,FileDescriptor::create);
- fd.seek(offset);
- int num_entries = size/sizeof(fis_image_desc);
- write_blank_entries(fd,num_entries);
-}
-
-
-static void check_overlap(const dir_t& dir, uint32_t addr, uint32_t size)
-{
- uint32_t end_addr = addr+size;
- for (dir_t::const_iterator i = dir.begin();
- i != dir.end(); ++i) {
- if (addr<(i->second.flash_base+i->second.size)
- && end_addr>i->second.flash_base) {
- throw "New partition overlaps existing partitions";
- }
- }
-}
-
-
-static void fis_create(string device, int offset, int size, bool swap_endianness,
- int argc, char* argv[])
-{
- fis_image_desc d;
- d.mem_base = 0;
- d.entry_point = 0;
- d.data_length = 0;
- for (unsigned int i=0; i<(sizeof(d.skips)/4); ++i) {
- d.skips[i] = 0;
- }
- d.desc_cksum = 0;
- d.file_cksum = 0;
-
- for (int i=0; i<argc; ++i) {
- string arg=argv[i];
- if (arg=="-l") {
- if (i==argc-1) {
- throw "argumnet missing for -l";
- }
- ++i;
- d.size = maybe_hex_string_to_int(argv[i]);
- } else if (arg=="-f") {
- if (i==argc-1) {
- throw "argumnet missing for -f";
- }
- ++i;
- d.flash_base = maybe_hex_string_to_int(argv[i]);
- } else if (arg=="-n") {
- if (i==argc-1) {
- throw "argumnet missing for -n";
- }
- ++i;
- string name = argv[i];
- if (name.length()>=16) {
- throw "name too long, max 16 chars including terminating null";
- }
- for (int j=0; j<16; j++) {
- char c = name.c_str()[j];
- d.name[j] = c;
- if (!c) {
- for (; j<16; ++j) {
- d.name[j]=0;
- }
- break;
- }
- }
- } else {
- cerr << "Unrecognised option '" << arg << "'\n";
- exit(1);
- }
- }
-
- FileDescriptor fd(device,FileDescriptor::read_write);
- dir_t dir;
- load_dir(fd,offset,size,swap_endianness,dir);
- check_overlap(dir,d.flash_base,d.size);
- dir[d.flash_base] = d;
- save_dir(fd,offset,size,swap_endianness,dir);
-}
-
-
-static void fis_delete(string device, int offset, int size, bool swap_endianness,
- string name)
-{
- FileDescriptor fd(device,FileDescriptor::read_write);
- dir_t dir;
- load_dir(fd,offset,size,swap_endianness,dir);
-
- for (dir_t::iterator i = dir.begin();
- i != dir.end(); ++i) {
- string this_name(i->second.name);
- if (this_name == name) {
- dir.erase(i);
- save_dir(fd,offset,size,swap_endianness,dir);
- return;
- }
- }
-
- throw "No partition found with specified name";
-}
-
-
-static void usage()
-{
- cerr << "Usage:\n"
- << " fis [options] list\n"
- << " fis [options] init\n"
- << " fis [options] create -f address -l size -n name\n"
- << " fis [options] delete name\n"
- << "Options:\n"
- << " -d device specify /dev/mtd* device containing directory\n"
- << " -o offset specify offset into device of start of directory\n"
- << " (in decimal; prefix with 0x for hex)\n"
- << " -s size specify size of directory in bytes\n"
- << " -e swap endianness\n";
-}
-
-
-int main(int argc, char* argv[])
-{
- try { try {
-
- if (argc==1) {
- usage();
- exit(1);
- }
-
- string device="";
- int offset=0;
- int size=0;
- bool swap_endianness=false;
-
- for (int i=1; i<argc; ++i) {
- string arg = argv[i];
- if (arg=="-d") {
- if (device!="") {
- throw "-d option used more than once";
- }
- if (i==argc-1) {
- throw "-d option is missing its parameter";
- }
- ++i;
- device = argv[i];
- } else if (arg=="-o") {
- if (offset!=0) {
- throw "-o option used more than once";
- }
- if (i==argc-1) {
- throw "-o option is missing its parameter";
- }
- ++i;
- offset = maybe_hex_string_to_int(argv[i]);
- } else if (arg=="-s") {
- if (size!=0) {
- throw "-s option used more than once";
- }
- if (i==argc-1) {
- throw "-s option is missing its parameter";
- }
- ++i;
- size = maybe_hex_string_to_int(argv[i]);
- } else if (arg=="-e") {
- swap_endianness = true;
- } else if (arg=="list") {
- if (i!=argc-1) {
- throw "Extra arguments after 'list'";
- }
- check_dev(device);
- fis_list(device,offset,size,swap_endianness);
- } else if (arg=="init") {
- if (i!=argc-1) {
- throw "Extra arguments after 'init'";
- }
- check_dev(device);
- fis_init(device,offset,size);
- } else if (arg=="create") {
- check_dev(device);
- fis_create(device,offset,size,swap_endianness,
- argc-i-1,&argv[i+1]);
- break;
- } else if (arg=="delete") {
- if (i!=argc-2) {
- throw "Exactly one argumnet required after 'delete'";
- }
- ++i;
- string name = argv[i];
- check_dev(device);
- fis_delete(device,offset,size,swap_endianness,name);
- } else {
- cerr << "unrecognised argument '" << arg << "'\n";
- usage();
- exit(1);
- }
- }
- } RETHROW_MISC_EXCEPTIONS }
- catch (Exception& E) {
- cerr << "Error: ";
- E.report(cerr);
- exit(1);
- }
-}
-
diff --git a/packages/fis/fis_1.0.bb b/packages/fis/fis_1.0.bb
index ea4c0af6c8..d1170b6ba8 100644
--- a/packages/fis/fis_1.0.bb
+++ b/packages/fis/fis_1.0.bb
@@ -1,13 +1,11 @@
DESCRIPTION = "Tool to edit the Redboot FIS partition layout from userspace"
-PR = "r1"
-DEPENDS = "boost"
+PR = "r2"
-SRC_URI = "http://svn.chezphil.org/utils/trunk/fis.cc \
+SRC_URI = "http://svn.chezphil.org/utils/trunk/fis.c \
svn://svn.chezphil.org/;module=libpbe;proto=http"
do_compile() {
- ${CXX} -Os -W -I${STAGING_INCDIR} -I${WORKDIR}/libpbe/trunk/include -o fis ${WORKDIR}/fis.cc \
- ${WORKDIR}/libpbe/trunk/src/Exception.cc ${WORKDIR}/libpbe/trunk/src/utils.cc
+ ${CC} --std=c99 -Os -W -o fis ${WORKDIR}/fis.c
}
do_install() {