Commit f5eef61f authored by Stephen Rothwell's avatar Stephen Rothwell

Merge commit 'kbuild/master'

Conflicts:
	scripts/extract-ikconfig
parents 34673b7f 1d2b9755
...@@ -68,7 +68,6 @@ autoconf.h* ...@@ -68,7 +68,6 @@ autoconf.h*
bbootsect bbootsect
bin2c bin2c
binkernel.spec binkernel.spec
binoffset
bootsect bootsect
bounds.h bounds.h
bsetup bsetup
......
...@@ -6,5 +6,4 @@ kallsyms ...@@ -6,5 +6,4 @@ kallsyms
pnmtologo pnmtologo
bin2c bin2c
unifdef unifdef
binoffset
ihex2fw ihex2fw
/***************************************************************************
* binoffset.c
* (C) 2002 Randy Dunlap <rdunlap@xenotime.net>
# 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
# (at your option) 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., 675 Mass Ave, Cambridge, MA 02139, USA.
# binoffset.c:
# - searches a (binary) file for a specified (binary) pattern
# - returns the offset of the located pattern or ~0 if not found
# - exits with exit status 0 normally or non-0 if pattern is not found
# or any other error occurs.
****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#define VERSION "0.1"
#define BUF_SIZE (16 * 1024)
#define PAT_SIZE 100
char *progname;
char *inputname;
int inputfd;
unsigned int bix; /* buf index */
unsigned char patterns [PAT_SIZE] = {0}; /* byte-sized pattern array */
int pat_len; /* actual number of pattern bytes */
unsigned char *madr; /* mmap address */
size_t filesize;
int num_matches = 0;
off_t firstloc = 0;
void usage (void)
{
fprintf (stderr, "%s ver. %s\n", progname, VERSION);
fprintf (stderr, "usage: %s filename pattern_bytes\n",
progname);
fprintf (stderr, " [prints location of pattern_bytes in file]\n");
exit (1);
}
void get_pattern (int pat_count, char *pats [])
{
int ix, err, tmp;
#ifdef DEBUG
fprintf (stderr,"get_pattern: count = %d\n", pat_count);
for (ix = 0; ix < pat_count; ix++)
fprintf (stderr, " pat # %d: [%s]\n", ix, pats[ix]);
#endif
for (ix = 0; ix < pat_count; ix++) {
tmp = 0;
err = sscanf (pats[ix], "%5i", &tmp);
if (err != 1 || tmp > 0xff) {
fprintf (stderr, "pattern or value error in pattern # %d [%s]\n",
ix, pats[ix]);
usage ();
}
patterns [ix] = tmp;
}
pat_len = pat_count;
}
void search_pattern (void)
{
for (bix = 0; bix < filesize; bix++) {
if (madr[bix] == patterns[0]) {
if (memcmp (&madr[bix], patterns, pat_len) == 0) {
if (num_matches == 0)
firstloc = bix;
num_matches++;
}
}
}
}
#ifdef NOTDEF
size_t get_filesize (int fd)
{
off_t end_off = lseek (fd, 0, SEEK_END);
lseek (fd, 0, SEEK_SET);
return (size_t) end_off;
}
#endif
size_t get_filesize (int fd)
{
int err;
struct stat stat;
err = fstat (fd, &stat);
fprintf (stderr, "filesize: %ld\n", err < 0 ? (long)err : stat.st_size);
if (err < 0)
return err;
return (size_t) stat.st_size;
}
int main (int argc, char *argv [])
{
progname = argv[0];
if (argc < 3)
usage ();
get_pattern (argc - 2, argv + 2);
inputname = argv[1];
inputfd = open (inputname, O_RDONLY);
if (inputfd == -1) {
fprintf (stderr, "%s: cannot open '%s'\n",
progname, inputname);
exit (3);
}
filesize = get_filesize (inputfd);
madr = mmap (0, filesize, PROT_READ, MAP_PRIVATE, inputfd, 0);
if (madr == MAP_FAILED) {
fprintf (stderr, "mmap error = %d\n", errno);
close (inputfd);
exit (4);
}
search_pattern ();
if (munmap (madr, filesize))
fprintf (stderr, "munmap error = %d\n", errno);
if (close (inputfd))
fprintf (stderr, "%s: error %d closing '%s'\n",
progname, errno, inputname);
fprintf (stderr, "number of pattern matches = %d\n", num_matches);
if (num_matches == 0)
firstloc = ~0;
printf ("%ld\n", firstloc);
fprintf (stderr, "%ld\n", firstloc);
exit (num_matches ? 0 : 2);
}
/* end binoffset.c */
#!/bin/sh #!/bin/sh
# extracts .config info from a [b]zImage file # ----------------------------------------------------------------------
# uses: binoffset (new), dd, zcat, strings, grep # extract-ikconfig - Extract the .config file from a kernel image
# $arg1 is [b]zImage filename #
# This will only work when the kernel was compiled with CONFIG_IKCONFIG.
binoffset="./scripts/binoffset" #
test -e $binoffset || cc -o $binoffset ./scripts/binoffset.c || exit 1 # The obscure use of the "tr" filter is to work around older versions of
# "grep" that report the byte offset of the line instead of the pattern.
IKCFG_ST="0x49 0x4b 0x43 0x46 0x47 0x5f 0x53 0x54" #
IKCFG_ED="0x49 0x4b 0x43 0x46 0x47 0x5f 0x45 0x44" # (c) 2009, Dick Streefland <dick@streefland.net>
dump_config() { # Licensed under the terms of the GNU General Public License.
file="$1" # ----------------------------------------------------------------------
start=`$binoffset $file $IKCFG_ST 2>/dev/null` gz1='\037\213\010'
[ "$?" != "0" ] && start="-1" gz2='01'
if [ "$start" -eq "-1" ]; then cf1='IKCFG_ST\037\213\010'
return cf2='0123456789'
fi
end=`$binoffset $file $IKCFG_ED 2>/dev/null` dump_config()
[ "$?" != "0" ] && end="-1"
if [ "$end" -eq "-1" ]; then
return
fi
start=`expr $start + 8`
size=`expr $end - $start`
dd if="$file" ibs=1 skip="$start" count="$size" 2>/dev/null | zcat
clean_up
exit 0
}
usage()
{
echo " usage: extract-ikconfig [b]zImage_filename"
}
clean_up()
{ {
if [ "$TMPFILE" != "" ]; then if pos=`tr "$cf1\n$cf2" "\n$cf2=" < "$1" | grep -abo "^$cf2"`
rm -f $TMPFILE then
pos=${pos%%:*}
tail -c+$(($pos+8)) "$1" | zcat -q
exit 0
fi fi
} }
if [ $# -lt 1 ] # Check invocation:
me=${0##*/}
img=$1
if [ $# -ne 1 -o ! -s "$img" ]
then then
usage echo "Usage: $me <kernel-image>" >&2
exit 1 exit 2
fi fi
TMPFILE=`mktemp -t ikconfig-XXXXXX` || exit 1 # Initial attempt for uncompressed images or objects:
image="$1" dump_config "$img"
# vmlinux: Attempt to dump the configuration from the file directly # That didn't work, so decompress and try again:
dump_config "$image" tmp=/tmp/ikconfig$$
trap "rm -f $tmp" 0
GZHDR1="0x1f 0x8b 0x08 0x00" for pos in `tr "$gz1\n$gz2" "\n$gz2=" < "$img" | grep -abo "^$gz2"`
GZHDR2="0x1f 0x8b 0x08 0x08" do
pos=${pos%%:*}
ELFHDR="0x7f 0x45 0x4c 0x46" tail -c+$pos "$img" | zcat 2> /dev/null > $tmp
dump_config $tmp
# vmlinux.gz: Check for a compressed images done
off=`$binoffset "$image" $GZHDR1 2>/dev/null`
[ "$?" != "0" ] && off="-1" # Bail out:
if [ "$off" -eq "-1" ]; then echo "$me: Cannot find kernel config." >&2
off=`$binoffset "$image" $GZHDR2 2>/dev/null`
[ "$?" != "0" ] && off="-1"
fi
if [ "$off" -eq "0" ]; then
zcat <"$image" >"$TMPFILE"
dump_config "$TMPFILE"
elif [ "$off" -ne "-1" ]; then
(dd ibs="$off" skip=1 count=0 && dd bs=512k) <"$image" 2>/dev/null | \
zcat >"$TMPFILE"
dump_config "$TMPFILE"
# check if this is simply an ELF file
else
off=`$binoffset "$image" $ELFHDR 2>/dev/null`
[ "$?" != "0" ] && off="-1"
if [ "$off" -eq "0" ]; then
dump_config "$image"
fi
fi
echo "ERROR: Unable to extract kernel configuration information."
echo " This kernel image may not have the config info."
clean_up
exit 1 exit 1
...@@ -38,14 +38,14 @@ static int conf_cnt; ...@@ -38,14 +38,14 @@ static int conf_cnt;
static char line[128]; static char line[128];
static struct menu *rootEntry; static struct menu *rootEntry;
static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); static void print_help(struct menu *menu)
static const char *get_help(struct menu *menu)
{ {
if (menu_has_help(menu)) struct gstr help = str_new();
return _(menu_get_help(menu));
else menu_get_ext_help(menu, &help);
return nohelp_text;
printf("\n%s\n", str_get(&help));
str_free(&help);
} }
static void strip(char *str) static void strip(char *str)
...@@ -140,7 +140,7 @@ int conf_string(struct menu *menu) ...@@ -140,7 +140,7 @@ int conf_string(struct menu *menu)
case '?': case '?':
/* print help */ /* print help */
if (line[1] == '\n') { if (line[1] == '\n') {
printf("\n%s\n", get_help(menu)); print_help(menu);
def = NULL; def = NULL;
break; break;
} }
...@@ -220,7 +220,7 @@ static int conf_sym(struct menu *menu) ...@@ -220,7 +220,7 @@ static int conf_sym(struct menu *menu)
if (sym_set_tristate_value(sym, newval)) if (sym_set_tristate_value(sym, newval))
return 0; return 0;
help: help:
printf("\n%s\n", get_help(menu)); print_help(menu);
} }
} }
...@@ -307,7 +307,7 @@ static int conf_choice(struct menu *menu) ...@@ -307,7 +307,7 @@ static int conf_choice(struct menu *menu)
fgets(line, 128, stdin); fgets(line, 128, stdin);
strip(line); strip(line);
if (line[0] == '?') { if (line[0] == '?') {
printf("\n%s\n", get_help(menu)); print_help(menu);
continue; continue;
} }
if (!line[0]) if (!line[0])
...@@ -331,7 +331,7 @@ static int conf_choice(struct menu *menu) ...@@ -331,7 +331,7 @@ static int conf_choice(struct menu *menu)
if (!child) if (!child)
continue; continue;
if (line[strlen(line) - 1] == '?') { if (line[strlen(line) - 1] == '?') {
printf("\n%s\n", get_help(child)); print_help(child);
continue; continue;
} }
sym_set_choice_value(sym, child->sym); sym_set_choice_value(sym, child->sym);
......
...@@ -1098,6 +1098,8 @@ void expr_fprint(struct expr *e, FILE *out) ...@@ -1098,6 +1098,8 @@ void expr_fprint(struct expr *e, FILE *out)
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
{ {
str_append((struct gstr*)data, str); str_append((struct gstr*)data, str);
if (sym)
str_printf((struct gstr*)data, " [=%s]", sym_get_string_value(sym));
} }
void expr_gstr_print(struct expr *e, struct gstr *gs) void expr_gstr_print(struct expr *e, struct gstr *gs)
......
...@@ -456,19 +456,9 @@ static void text_insert_help(struct menu *menu) ...@@ -456,19 +456,9 @@ static void text_insert_help(struct menu *menu)
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
GtkTextIter start, end; GtkTextIter start, end;
const char *prompt = _(menu_get_prompt(menu)); const char *prompt = _(menu_get_prompt(menu));
gchar *name; struct gstr help = str_new();
const char *help;
help = menu_get_help(menu); menu_get_ext_help(menu, &help);
/* Gettextize if the help text not empty */
if ((help != 0) && (help[0] != 0))
help = _(help);
if (menu->sym && menu->sym->name)
name = g_strdup_printf(menu->sym->name);
else
name = g_strdup("");
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_get_bounds(buffer, &start, &end);
...@@ -478,14 +468,11 @@ static void text_insert_help(struct menu *menu) ...@@ -478,14 +468,11 @@ static void text_insert_help(struct menu *menu)
gtk_text_buffer_get_end_iter(buffer, &end); gtk_text_buffer_get_end_iter(buffer, &end);
gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1, gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
NULL); NULL);
gtk_text_buffer_insert_at_cursor(buffer, " ", 1);
gtk_text_buffer_get_end_iter(buffer, &end);
gtk_text_buffer_insert_with_tags(buffer, &end, name, -1, tag1,
NULL);
gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
gtk_text_buffer_get_end_iter(buffer, &end); gtk_text_buffer_get_end_iter(buffer, &end);
gtk_text_buffer_insert_with_tags(buffer, &end, help, -1, tag2, gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
NULL); NULL);
str_free(&help);
} }
......
...@@ -17,6 +17,8 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu)); ...@@ -17,6 +17,8 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu));
P(menu_get_parent_menu,struct menu *,(struct menu *menu)); P(menu_get_parent_menu,struct menu *,(struct menu *menu));
P(menu_has_help,bool,(struct menu *menu)); P(menu_has_help,bool,(struct menu *menu));
P(menu_get_help,const char *,(struct menu *menu)); P(menu_get_help,const char *,(struct menu *menu));
P(get_symbol_str,void,(struct gstr *r, struct symbol *sym));
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
/* symbol.c */ /* symbol.c */
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
......
...@@ -199,8 +199,6 @@ inputbox_instructions_string[] = N_( ...@@ -199,8 +199,6 @@ inputbox_instructions_string[] = N_(
setmod_text[] = N_( setmod_text[] = N_(
"This feature depends on another which has been configured as a module.\n" "This feature depends on another which has been configured as a module.\n"
"As a result, this feature will be built as a module."), "As a result, this feature will be built as a module."),
nohelp_text[] = N_(
"There is no help available for this kernel option.\n"),
load_config_text[] = N_( load_config_text[] = N_(
"Enter the name of the configuration file you wish to load. " "Enter the name of the configuration file you wish to load. "
"Accept the name shown to restore the configuration you " "Accept the name shown to restore the configuration you "
...@@ -284,66 +282,6 @@ static void show_textbox(const char *title, const char *text, int r, int c); ...@@ -284,66 +282,6 @@ static void show_textbox(const char *title, const char *text, int r, int c);
static void show_helptext(const char *title, const char *text); static void show_helptext(const char *title, const char *text);
static void show_help(struct menu *menu); static void show_help(struct menu *menu);
static void get_prompt_str(struct gstr *r, struct property *prop)
{
int i, j;
struct menu *submenu[8], *menu;
str_printf(r, _("Prompt: %s\n"), _(prop->text));
str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
prop->menu->lineno);
if (!expr_is_yes(prop->visible.expr)) {
str_append(r, _(" Depends on: "));
expr_gstr_print(prop->visible.expr, r);
str_append(r, "\n");
}
menu = prop->menu->parent;
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
submenu[i++] = menu;
if (i > 0) {
str_printf(r, _(" Location:\n"));
for (j = 4; --i >= 0; j += 2) {
menu = submenu[i];
str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
if (menu->sym) {
str_printf(r, " (%s [=%s])", menu->sym->name ?
menu->sym->name : _("<choice>"),
sym_get_string_value(menu->sym));
}
str_append(r, "\n");
}
}
}
static void get_symbol_str(struct gstr *r, struct symbol *sym)
{
bool hit;
struct property *prop;
if (sym && sym->name)
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
sym_get_string_value(sym));
for_all_prompts(sym, prop)
get_prompt_str(r, prop);
hit = false;
for_all_properties(sym, prop, P_SELECT) {
if (!hit) {
str_append(r, " Selects: ");
hit = true;
} else
str_printf(r, " && ");
expr_gstr_print(prop->expr, r);
}
if (hit)
str_append(r, "\n");
if (sym->rev_dep.expr) {
str_append(r, _(" Selected by: "));
expr_gstr_print(sym->rev_dep.expr, r);
str_append(r, "\n");
}
str_append(r, "\n\n");
}
static struct gstr get_relations_str(struct symbol **sym_arr) static struct gstr get_relations_str(struct symbol **sym_arr)
{ {
struct symbol *sym; struct symbol *sym;
...@@ -699,19 +637,9 @@ static void show_helptext(const char *title, const char *text) ...@@ -699,19 +637,9 @@ static void show_helptext(const char *title, const char *text)
static void show_help(struct menu *menu) static void show_help(struct menu *menu)
{ {
struct gstr help = str_new(); struct gstr help = str_new();
struct symbol *sym = menu->sym;
menu_get_ext_help(menu, &help);
if (menu_has_help(menu))
{
if (sym->name) {
str_printf(&help, "CONFIG_%s:\n\n", sym->name);
str_append(&help, _(menu_get_help(menu)));
str_append(&help, "\n");
}
} else {
str_append(&help, nohelp_text);
}
get_symbol_str(&help, sym);
show_helptext(_(menu_get_prompt(menu)), str_get(&help)); show_helptext(_(menu_get_prompt(menu)), str_get(&help));
str_free(&help); str_free(&help);
} }
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
#define LKC_DIRECT_LINK #define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
static const char nohelp_text[] = N_(
"There is no help available for this kernel option.\n");
struct menu rootmenu; struct menu rootmenu;
static struct menu **last_entry_ptr; static struct menu **last_entry_ptr;
...@@ -451,3 +454,79 @@ const char *menu_get_help(struct menu *menu) ...@@ -451,3 +454,79 @@ const char *menu_get_help(struct menu *menu)
else else
return ""; return "";
} }
static void get_prompt_str(struct gstr *r, struct property *prop)
{
int i, j;
struct menu *submenu[8], *menu;
str_printf(r, _("Prompt: %s\n"), _(prop->text));
str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
prop->menu->lineno);
if (!expr_is_yes(prop->visible.expr)) {
str_append(r, _(" Depends on: "));
expr_gstr_print(prop->visible.expr, r);
str_append(r, "\n");
}
menu = prop->menu->parent;
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
submenu[i++] = menu;
if (i > 0) {
str_printf(r, _(" Location:\n"));
for (j = 4; --i >= 0; j += 2) {
menu = submenu[i];
str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
if (menu->sym) {
str_printf(r, " (%s [=%s])", menu->sym->name ?
menu->sym->name : _("<choice>"),
sym_get_string_value(menu->sym));
}
str_append(r, "\n");
}
}
}
void get_symbol_str(struct gstr *r, struct symbol *sym)
{
bool hit;
struct property *prop;
if (sym && sym->name)
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
sym_get_string_value(sym));
for_all_prompts(sym, prop)
get_prompt_str(r, prop);
hit = false;
for_all_properties(sym, prop, P_SELECT) {
if (!hit) {
str_append(r, " Selects: ");
hit = true;
} else
str_printf(r, " && ");
expr_gstr_print(prop->expr, r);
}
if (hit)
str_append(r, "\n");
if (sym->rev_dep.expr) {
str_append(r, _(" Selected by: "));
expr_gstr_print(sym->rev_dep.expr, r);
str_append(r, "\n");
}
str_append(r, "\n\n");
}
void menu_get_ext_help(struct menu *menu, struct gstr *help)
{
struct symbol *sym = menu->sym;
if (menu_has_help(menu)) {
if (sym->name) {
str_printf(help, "CONFIG_%s:\n\n", sym->name);
str_append(help, _(menu_get_help(menu)));
str_append(help, "\n");
}
} else {
str_append(help, nohelp_text);
}
get_symbol_str(help, sym);
}
...@@ -1042,12 +1042,10 @@ void ConfigInfoView::menuInfo(void) ...@@ -1042,12 +1042,10 @@ void ConfigInfoView::menuInfo(void)
if (showDebug()) if (showDebug())
debug = debug_info(sym); debug = debug_info(sym);
help = menu_get_help(menu); struct gstr help_gstr = str_new();
/* Gettextize if the help text not empty */ menu_get_ext_help(menu, &help_gstr);
if (help.isEmpty()) help = print_filter(str_get(&help_gstr));
help = print_filter(menu_get_help(menu)); str_free(&help_gstr);
else
help = print_filter(_(menu_get_help(menu)));
} else if (menu->prompt) { } else if (menu->prompt) {
head += "<big><b>"; head += "<big><b>";
head += print_filter(_(menu->prompt->text)); head += print_filter(_(menu->prompt->text));
......
...@@ -6,7 +6,7 @@ klibcdirs:; ...@@ -6,7 +6,7 @@ klibcdirs:;
PHONY += klibcdirs PHONY += klibcdirs
# Gzip, but no bzip2 # Gzip
suffix_$(CONFIG_INITRAMFS_COMPRESSION_GZIP) = .gz suffix_$(CONFIG_INITRAMFS_COMPRESSION_GZIP) = .gz
# Bzip2 # Bzip2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment