mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-17 20:44:37 +00:00
Merge branch 'for-35' of git://repo.or.cz/linux-kbuild
* 'for-35' of git://repo.or.cz/linux-kbuild: (81 commits)
kbuild: Revert part of e8d400a
to resolve a conflict
kbuild: Fix checking of scm-identifier variable
gconfig: add support to show hidden options that have prompts
menuconfig: add support to show hidden options which have prompts
gconfig: remove show_debug option
gconfig: remove dbg_print_ptype() and dbg_print_stype()
kconfig: fix zconfdump()
kconfig: some small fixes
add random binaries to .gitignore
kbuild: Include gen_initramfs_list.sh and the file list in the .d file
kconfig: recalc symbol value before showing search results
.gitignore: ignore *.lzo files
headerdep: perlcritic warning
scripts/Makefile.lib: Align the output of LZO
kbuild: Generate modules.builtin in make modules_install
Revert "kbuild: specify absolute paths for cscope"
kbuild: Do not unnecessarily regenerate modules.builtin
headers_install: use local file handles
headers_check: fix perl warnings
export_report: fix perl warnings
...
This commit is contained in:
commit
1f73897861
111 changed files with 3023 additions and 538 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -28,6 +28,7 @@ modules.builtin
|
||||||
*.gz
|
*.gz
|
||||||
*.bz2
|
*.bz2
|
||||||
*.lzma
|
*.lzma
|
||||||
|
*.lzo
|
||||||
*.patch
|
*.patch
|
||||||
*.gcno
|
*.gcno
|
||||||
|
|
||||||
|
|
7
Documentation/.gitignore
vendored
Normal file
7
Documentation/.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
filesystems/dnotify_test
|
||||||
|
laptops/dslm
|
||||||
|
timers/hpet_example
|
||||||
|
vm/hugepage-mmap
|
||||||
|
vm/hugepage-shm
|
||||||
|
vm/map_hugetlb
|
||||||
|
|
|
@ -65,7 +65,7 @@ CROSS_COMPILE
|
||||||
Specify an optional fixed part of the binutils filename.
|
Specify an optional fixed part of the binutils filename.
|
||||||
CROSS_COMPILE can be a part of the filename or the full path.
|
CROSS_COMPILE can be a part of the filename or the full path.
|
||||||
|
|
||||||
CROSS_COMPILE is also used for ccache is some setups.
|
CROSS_COMPILE is also used for ccache in some setups.
|
||||||
|
|
||||||
CF
|
CF
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -162,3 +162,7 @@ For tags/TAGS/cscope targets, you can specify more than one arch
|
||||||
to be included in the databases, separated by blank space. E.g.:
|
to be included in the databases, separated by blank space. E.g.:
|
||||||
|
|
||||||
$ make ALLSOURCE_ARCHS="x86 mips arm" tags
|
$ make ALLSOURCE_ARCHS="x86 mips arm" tags
|
||||||
|
|
||||||
|
To get all available archs you can also specify all. E.g.:
|
||||||
|
|
||||||
|
$ make ALLSOURCE_ARCHS=all tags
|
||||||
|
|
|
@ -66,14 +66,14 @@ of advantages of mutexes:
|
||||||
|
|
||||||
c0377ccb <mutex_lock>:
|
c0377ccb <mutex_lock>:
|
||||||
c0377ccb: f0 ff 08 lock decl (%eax)
|
c0377ccb: f0 ff 08 lock decl (%eax)
|
||||||
c0377cce: 78 0e js c0377cde <.text.lock.mutex>
|
c0377cce: 78 0e js c0377cde <.text..lock.mutex>
|
||||||
c0377cd0: c3 ret
|
c0377cd0: c3 ret
|
||||||
|
|
||||||
the unlocking fastpath is equally tight:
|
the unlocking fastpath is equally tight:
|
||||||
|
|
||||||
c0377cd1 <mutex_unlock>:
|
c0377cd1 <mutex_unlock>:
|
||||||
c0377cd1: f0 ff 00 lock incl (%eax)
|
c0377cd1: f0 ff 00 lock incl (%eax)
|
||||||
c0377cd4: 7e 0f jle c0377ce5 <.text.lock.mutex+0x7>
|
c0377cd4: 7e 0f jle c0377ce5 <.text..lock.mutex+0x7>
|
||||||
c0377cd6: c3 ret
|
c0377cd6: c3 ret
|
||||||
|
|
||||||
- 'struct mutex' semantics are well-defined and are enforced if
|
- 'struct mutex' semantics are well-defined and are enforced if
|
||||||
|
|
|
@ -3242,7 +3242,7 @@ L: autofs@linux.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: fs/autofs4/
|
F: fs/autofs4/
|
||||||
|
|
||||||
KERNEL BUILD
|
KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
|
||||||
M: Michal Marek <mmarek@suse.cz>
|
M: Michal Marek <mmarek@suse.cz>
|
||||||
T: git git://repo.or.cz/linux-kbuild.git for-next
|
T: git git://repo.or.cz/linux-kbuild.git for-next
|
||||||
T: git git://repo.or.cz/linux-kbuild.git for-linus
|
T: git git://repo.or.cz/linux-kbuild.git for-linus
|
||||||
|
@ -3251,6 +3251,9 @@ S: Maintained
|
||||||
F: Documentation/kbuild/
|
F: Documentation/kbuild/
|
||||||
F: Makefile
|
F: Makefile
|
||||||
F: scripts/Makefile.*
|
F: scripts/Makefile.*
|
||||||
|
F: scripts/basic/
|
||||||
|
F: scripts/mk*
|
||||||
|
F: scripts/package/
|
||||||
|
|
||||||
KERNEL JANITORS
|
KERNEL JANITORS
|
||||||
L: kernel-janitors@vger.kernel.org
|
L: kernel-janitors@vger.kernel.org
|
||||||
|
|
65
Makefile
65
Makefile
|
@ -183,11 +183,14 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
|
||||||
# CROSS_COMPILE can be set on the command line
|
# CROSS_COMPILE can be set on the command line
|
||||||
# make CROSS_COMPILE=ia64-linux-
|
# make CROSS_COMPILE=ia64-linux-
|
||||||
# Alternatively CROSS_COMPILE can be set in the environment.
|
# Alternatively CROSS_COMPILE can be set in the environment.
|
||||||
|
# A third alternative is to store a setting in .config so that plain
|
||||||
|
# "make" in the configured kernel build directory always uses that.
|
||||||
# Default value for CROSS_COMPILE is not to prefix executables
|
# Default value for CROSS_COMPILE is not to prefix executables
|
||||||
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
|
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
|
||||||
export KBUILD_BUILDHOST := $(SUBARCH)
|
export KBUILD_BUILDHOST := $(SUBARCH)
|
||||||
ARCH ?= $(SUBARCH)
|
ARCH ?= $(SUBARCH)
|
||||||
CROSS_COMPILE ?=
|
CROSS_COMPILE ?=
|
||||||
|
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
|
||||||
|
|
||||||
# Architecture as present in compile.h
|
# Architecture as present in compile.h
|
||||||
UTS_MACHINE := $(ARCH)
|
UTS_MACHINE := $(ARCH)
|
||||||
|
@ -576,9 +579,6 @@ KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
||||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
|
KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
|
||||||
|
|
||||||
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
|
||||||
|
|
||||||
# conserve stack if available
|
# conserve stack if available
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)
|
KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)
|
||||||
|
|
||||||
|
@ -882,9 +882,6 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
||||||
PHONY += $(vmlinux-dirs)
|
PHONY += $(vmlinux-dirs)
|
||||||
$(vmlinux-dirs): prepare scripts
|
$(vmlinux-dirs): prepare scripts
|
||||||
$(Q)$(MAKE) $(build)=$@
|
$(Q)$(MAKE) $(build)=$@
|
||||||
ifdef CONFIG_MODULES
|
|
||||||
$(Q)$(MAKE) $(modbuiltin)=$@
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Build the kernel release string
|
# Build the kernel release string
|
||||||
#
|
#
|
||||||
|
@ -907,14 +904,19 @@ endif
|
||||||
# $(localver)
|
# $(localver)
|
||||||
# localversion* (files without backups, containing '~')
|
# localversion* (files without backups, containing '~')
|
||||||
# $(CONFIG_LOCALVERSION) (from kernel config setting)
|
# $(CONFIG_LOCALVERSION) (from kernel config setting)
|
||||||
# $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
|
# $(LOCALVERSION) (from make command line, if provided)
|
||||||
# ./scripts/setlocalversion (SCM tag, if one exists)
|
# $(localver-extra)
|
||||||
# $(LOCALVERSION) (from make command line if provided)
|
# $(scm-identifier) (unique SCM tag, if one exists)
|
||||||
|
# ./scripts/setlocalversion (only with CONFIG_LOCALVERSION_AUTO)
|
||||||
|
# .scmversion (only with CONFIG_LOCALVERSION_AUTO)
|
||||||
|
# + (only without CONFIG_LOCALVERSION_AUTO
|
||||||
|
# and without LOCALVERSION= and
|
||||||
|
# repository is at non-tagged commit)
|
||||||
#
|
#
|
||||||
# Note how the final $(localver-auto) string is included *only* if the
|
# For kernels without CONFIG_LOCALVERSION_AUTO compiled from an SCM that has
|
||||||
# kernel config option CONFIG_LOCALVERSION_AUTO is selected. Also, at the
|
# been revised beyond a tagged commit, `+' is appended to the version string
|
||||||
# moment, only git is supported but other SCMs can edit the script
|
# when not overridden by using "make LOCALVERSION=". This indicates that the
|
||||||
# scripts/setlocalversion and add the appropriate checks as needed.
|
# kernel is not a vanilla release version and has been modified.
|
||||||
|
|
||||||
pattern = ".*/localversion[^~]*"
|
pattern = ".*/localversion[^~]*"
|
||||||
string = $(shell cat /dev/null \
|
string = $(shell cat /dev/null \
|
||||||
|
@ -923,26 +925,32 @@ string = $(shell cat /dev/null \
|
||||||
localver = $(subst $(space),, $(string) \
|
localver = $(subst $(space),, $(string) \
|
||||||
$(patsubst "%",%,$(CONFIG_LOCALVERSION)))
|
$(patsubst "%",%,$(CONFIG_LOCALVERSION)))
|
||||||
|
|
||||||
# If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
|
# scripts/setlocalversion is called to create a unique identifier if the source
|
||||||
# and if the SCM is know a tag from the SCM is appended.
|
# is managed by a known SCM and the repository has been revised since the last
|
||||||
# The appended tag is determined by the SCM used.
|
# tagged (release) commit. The format of the identifier is determined by the
|
||||||
|
# SCM's implementation.
|
||||||
#
|
#
|
||||||
# .scmversion is used when generating rpm packages so we do not loose
|
# .scmversion is used when generating rpm packages so we do not loose
|
||||||
# the version information from the SCM when we do the build of the kernel
|
# the version information from the SCM when we do the build of the kernel
|
||||||
# from the copied source
|
# from the copied source
|
||||||
ifdef CONFIG_LOCALVERSION_AUTO
|
|
||||||
|
|
||||||
ifeq ($(wildcard .scmversion),)
|
ifeq ($(wildcard .scmversion),)
|
||||||
_localver-auto = $(shell $(CONFIG_SHELL) \
|
scm-identifier = $(shell $(CONFIG_SHELL) \
|
||||||
$(srctree)/scripts/setlocalversion $(srctree))
|
$(srctree)/scripts/setlocalversion $(srctree))
|
||||||
else
|
else
|
||||||
_localver-auto = $(shell cat .scmversion 2> /dev/null)
|
scm-identifier = $(shell cat .scmversion 2> /dev/null)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
localver-auto = $(LOCALVERSION)$(_localver-auto)
|
ifdef CONFIG_LOCALVERSION_AUTO
|
||||||
|
localver-extra = $(scm-identifier)
|
||||||
|
else
|
||||||
|
ifneq ($(scm-identifier),)
|
||||||
|
ifeq ($(LOCALVERSION),)
|
||||||
|
localver-extra = +
|
||||||
|
endif
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
localver-full = $(localver)$(localver-auto)
|
localver-full = $(localver)$(LOCALVERSION)$(localver-extra)
|
||||||
|
|
||||||
# Store (new) KERNELRELASE string in include/config/kernel.release
|
# Store (new) KERNELRELASE string in include/config/kernel.release
|
||||||
kernelrelease = $(KERNELVERSION)$(localver-full)
|
kernelrelease = $(KERNELVERSION)$(localver-full)
|
||||||
|
@ -1089,11 +1097,16 @@ all: modules
|
||||||
PHONY += modules
|
PHONY += modules
|
||||||
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
||||||
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
||||||
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin
|
|
||||||
@$(kecho) ' Building modules, stage 2.';
|
@$(kecho) ' Building modules, stage 2.';
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
||||||
|
|
||||||
|
modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
|
||||||
|
$(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin
|
||||||
|
|
||||||
|
%/modules.builtin: include/config/auto.conf
|
||||||
|
$(Q)$(MAKE) $(modbuiltin)=$*
|
||||||
|
|
||||||
|
|
||||||
# Target to prepare building external modules
|
# Target to prepare building external modules
|
||||||
PHONY += modules_prepare
|
PHONY += modules_prepare
|
||||||
|
@ -1104,7 +1117,7 @@ PHONY += modules_install
|
||||||
modules_install: _modinst_ _modinst_post
|
modules_install: _modinst_ _modinst_post
|
||||||
|
|
||||||
PHONY += _modinst_
|
PHONY += _modinst_
|
||||||
_modinst_:
|
_modinst_: modules.builtin
|
||||||
@if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
|
@if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
|
||||||
echo "Warning: you may need to install module-init-tools"; \
|
echo "Warning: you may need to install module-init-tools"; \
|
||||||
echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
|
echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
|
||||||
|
@ -1247,7 +1260,9 @@ help:
|
||||||
@echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
|
@echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
|
||||||
@echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
@echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
||||||
@echo ' dir/ - Build all files in dir and below'
|
@echo ' dir/ - Build all files in dir and below'
|
||||||
@echo ' dir/file.[ois] - Build specified target only'
|
@echo ' dir/file.[oisS] - Build specified target only'
|
||||||
|
@echo ' dir/file.lst - Build specified mixed source/assembly target only'
|
||||||
|
@echo ' (requires a recent binutils and recent build (System.map))'
|
||||||
@echo ' dir/file.ko - Build module including final link'
|
@echo ' dir/file.ko - Build module including final link'
|
||||||
@echo ' modules_prepare - Set up for building external modules'
|
@echo ' modules_prepare - Set up for building external modules'
|
||||||
@echo ' tags/TAGS - Generate tags file for editors'
|
@echo ' tags/TAGS - Generate tags file for editors'
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#
|
#
|
||||||
# the break handler has its own stack
|
# the break handler has its own stack
|
||||||
#
|
#
|
||||||
.section .bss.stack
|
.section .bss..stack
|
||||||
.globl __break_user_context
|
.globl __break_user_context
|
||||||
.balign THREAD_SIZE
|
.balign THREAD_SIZE
|
||||||
__break_stack:
|
__break_stack:
|
||||||
|
@ -63,7 +63,7 @@ __break_trace_through_exceptions:
|
||||||
# entry point for Break Exceptions/Interrupts
|
# entry point for Break Exceptions/Interrupts
|
||||||
#
|
#
|
||||||
###############################################################################
|
###############################################################################
|
||||||
.section .text.break
|
.section .text..break
|
||||||
.balign 4
|
.balign 4
|
||||||
.globl __entry_break
|
.globl __entry_break
|
||||||
__entry_break:
|
__entry_break:
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
#define nr_syscalls ((syscall_table_size)/4)
|
#define nr_syscalls ((syscall_table_size)/4)
|
||||||
|
|
||||||
.section .text.entry
|
.section .text..entry
|
||||||
.balign 4
|
.balign 4
|
||||||
|
|
||||||
.macro LEDS val
|
.macro LEDS val
|
||||||
|
|
|
@ -542,7 +542,7 @@ __head_end:
|
||||||
.size _boot, .-_boot
|
.size _boot, .-_boot
|
||||||
|
|
||||||
# provide a point for GDB to place a break
|
# provide a point for GDB to place a break
|
||||||
.section .text.start,"ax"
|
.section .text..start,"ax"
|
||||||
.globl _start
|
.globl _start
|
||||||
.balign 4
|
.balign 4
|
||||||
_start:
|
_start:
|
||||||
|
|
|
@ -57,10 +57,10 @@ SECTIONS
|
||||||
_text = .;
|
_text = .;
|
||||||
_stext = .;
|
_stext = .;
|
||||||
.text : {
|
.text : {
|
||||||
*(.text.start)
|
*(.text..start)
|
||||||
*(.text.entry)
|
*(.text..entry)
|
||||||
*(.text.break)
|
*(.text..break)
|
||||||
*(.text.tlbmiss)
|
*(.text..tlbmiss)
|
||||||
TEXT_TEXT
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
|
@ -114,7 +114,7 @@ SECTIONS
|
||||||
|
|
||||||
.sbss : { *(.sbss .sbss.*) }
|
.sbss : { *(.sbss .sbss.*) }
|
||||||
.bss : { *(.bss .bss.*) }
|
.bss : { *(.bss .bss.*) }
|
||||||
.bss.stack : { *(.bss) }
|
.bss..stack : { *(.bss) }
|
||||||
|
|
||||||
__bss_stop = .;
|
__bss_stop = .;
|
||||||
_end = . ;
|
_end = . ;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/spr-regs.h>
|
#include <asm/spr-regs.h>
|
||||||
|
|
||||||
.section .text.tlbmiss
|
.section .text..tlbmiss
|
||||||
.balign 4
|
.balign 4
|
||||||
|
|
||||||
.globl __entry_insn_mmu_miss
|
.globl __entry_insn_mmu_miss
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#define SRAM_START 0xff4000
|
#define SRAM_START 0xff4000
|
||||||
|
|
||||||
.section .text.startup
|
.section .text..startup
|
||||||
.global startup
|
.global startup
|
||||||
startup:
|
startup:
|
||||||
mov.l #SRAM_START+0x8000, sp
|
mov.l #SRAM_START+0x8000, sp
|
||||||
|
|
|
@ -4,7 +4,7 @@ SECTIONS
|
||||||
{
|
{
|
||||||
__stext = . ;
|
__stext = . ;
|
||||||
__text = .;
|
__text = .;
|
||||||
*(.text.startup)
|
*(.text..startup)
|
||||||
*(.text)
|
*(.text)
|
||||||
__etext = . ;
|
__etext = . ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,12 +70,12 @@ name:
|
||||||
* path (ivt.S - TLB miss processing) or in places where it might not be
|
* path (ivt.S - TLB miss processing) or in places where it might not be
|
||||||
* safe to use a "tpa" instruction (mca_asm.S - error recovery).
|
* safe to use a "tpa" instruction (mca_asm.S - error recovery).
|
||||||
*/
|
*/
|
||||||
.section ".data.patch.vtop", "a" // declare section & section attributes
|
.section ".data..patch.vtop", "a" // declare section & section attributes
|
||||||
.previous
|
.previous
|
||||||
|
|
||||||
#define LOAD_PHYSICAL(pr, reg, obj) \
|
#define LOAD_PHYSICAL(pr, reg, obj) \
|
||||||
[1:](pr)movl reg = obj; \
|
[1:](pr)movl reg = obj; \
|
||||||
.xdata4 ".data.patch.vtop", 1b-.
|
.xdata4 ".data..patch.vtop", 1b-.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For now, we always put in the McKinley E9 workaround. On CPUs that don't need it,
|
* For now, we always put in the McKinley E9 workaround. On CPUs that don't need it,
|
||||||
|
@ -84,11 +84,11 @@ name:
|
||||||
#define DO_MCKINLEY_E9_WORKAROUND
|
#define DO_MCKINLEY_E9_WORKAROUND
|
||||||
|
|
||||||
#ifdef DO_MCKINLEY_E9_WORKAROUND
|
#ifdef DO_MCKINLEY_E9_WORKAROUND
|
||||||
.section ".data.patch.mckinley_e9", "a"
|
.section ".data..patch.mckinley_e9", "a"
|
||||||
.previous
|
.previous
|
||||||
/* workaround for Itanium 2 Errata 9: */
|
/* workaround for Itanium 2 Errata 9: */
|
||||||
# define FSYS_RETURN \
|
# define FSYS_RETURN \
|
||||||
.xdata4 ".data.patch.mckinley_e9", 1f-.; \
|
.xdata4 ".data..patch.mckinley_e9", 1f-.; \
|
||||||
1:{ .mib; \
|
1:{ .mib; \
|
||||||
nop.m 0; \
|
nop.m 0; \
|
||||||
mov r16=ar.pfs; \
|
mov r16=ar.pfs; \
|
||||||
|
@ -107,11 +107,11 @@ name:
|
||||||
* If physical stack register size is different from DEF_NUM_STACK_REG,
|
* If physical stack register size is different from DEF_NUM_STACK_REG,
|
||||||
* dynamically patch the kernel for correct size.
|
* dynamically patch the kernel for correct size.
|
||||||
*/
|
*/
|
||||||
.section ".data.patch.phys_stack_reg", "a"
|
.section ".data..patch.phys_stack_reg", "a"
|
||||||
.previous
|
.previous
|
||||||
#define LOAD_PHYS_STACK_REG_SIZE(reg) \
|
#define LOAD_PHYS_STACK_REG_SIZE(reg) \
|
||||||
[1:] adds reg=IA64_NUM_PHYS_STACK_REG*8+8,r0; \
|
[1:] adds reg=IA64_NUM_PHYS_STACK_REG*8+8,r0; \
|
||||||
.xdata4 ".data.patch.phys_stack_reg", 1b-.
|
.xdata4 ".data..patch.phys_stack_reg", 1b-.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Up until early 2004, use of .align within a function caused bad unwind info.
|
* Up until early 2004, use of .align within a function caused bad unwind info.
|
||||||
|
|
|
@ -24,6 +24,6 @@
|
||||||
# define SMP_CACHE_BYTES (1 << 3)
|
# define SMP_CACHE_BYTES (1 << 3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
#endif /* _ASM_IA64_CACHE_H */
|
#endif /* _ASM_IA64_CACHE_H */
|
||||||
|
|
|
@ -31,7 +31,7 @@ extern void *per_cpu_init(void);
|
||||||
|
|
||||||
#endif /* SMP */
|
#endif /* SMP */
|
||||||
|
|
||||||
#define PER_CPU_BASE_SECTION ".data.percpu"
|
#define PER_CPU_BASE_SECTION ".data..percpu"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Be extremely careful when taking the address of this variable! Due to virtual
|
* Be extremely careful when taking the address of this variable! Due to virtual
|
||||||
|
|
|
@ -21,7 +21,7 @@ GATECFLAGS_gate-syms.o = -r
|
||||||
$(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE
|
$(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE
|
||||||
$(call if_changed,gate)
|
$(call if_changed,gate)
|
||||||
|
|
||||||
# gate-data.o contains the gate DSO image as data in section .data.gate.
|
# gate-data.o contains the gate DSO image as data in section .data..gate.
|
||||||
# We must build gate.so before we can assemble it.
|
# We must build gate.so before we can assemble it.
|
||||||
# Note: kbuild does not track this dependency due to usage of .incbin
|
# Note: kbuild does not track this dependency due to usage of .incbin
|
||||||
$(obj)/gate-data.o: $(obj)/gate.so
|
$(obj)/gate-data.o: $(obj)/gate.so
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
.section .data.gate, "aw"
|
.section .data..gate, "aw"
|
||||||
|
|
||||||
.incbin "arch/ia64/kernel/gate.so"
|
.incbin "arch/ia64/kernel/gate.so"
|
||||||
|
|
|
@ -21,18 +21,18 @@
|
||||||
* to targets outside the shared object) and to avoid multi-phase kernel builds, we
|
* to targets outside the shared object) and to avoid multi-phase kernel builds, we
|
||||||
* simply create minimalistic "patch lists" in special ELF sections.
|
* simply create minimalistic "patch lists" in special ELF sections.
|
||||||
*/
|
*/
|
||||||
.section ".data.patch.fsyscall_table", "a"
|
.section ".data..patch.fsyscall_table", "a"
|
||||||
.previous
|
.previous
|
||||||
#define LOAD_FSYSCALL_TABLE(reg) \
|
#define LOAD_FSYSCALL_TABLE(reg) \
|
||||||
[1:] movl reg=0; \
|
[1:] movl reg=0; \
|
||||||
.xdata4 ".data.patch.fsyscall_table", 1b-.
|
.xdata4 ".data..patch.fsyscall_table", 1b-.
|
||||||
|
|
||||||
.section ".data.patch.brl_fsys_bubble_down", "a"
|
.section ".data..patch.brl_fsys_bubble_down", "a"
|
||||||
.previous
|
.previous
|
||||||
#define BRL_COND_FSYS_BUBBLE_DOWN(pr) \
|
#define BRL_COND_FSYS_BUBBLE_DOWN(pr) \
|
||||||
[1:](pr)brl.cond.sptk 0; \
|
[1:](pr)brl.cond.sptk 0; \
|
||||||
;; \
|
;; \
|
||||||
.xdata4 ".data.patch.brl_fsys_bubble_down", 1b-.
|
.xdata4 ".data..patch.brl_fsys_bubble_down", 1b-.
|
||||||
|
|
||||||
GLOBAL_ENTRY(__kernel_syscall_via_break)
|
GLOBAL_ENTRY(__kernel_syscall_via_break)
|
||||||
.prologue
|
.prologue
|
||||||
|
|
|
@ -33,21 +33,21 @@ SECTIONS
|
||||||
*/
|
*/
|
||||||
. = GATE_ADDR + 0x600;
|
. = GATE_ADDR + 0x600;
|
||||||
|
|
||||||
.data.patch : {
|
.data..patch : {
|
||||||
__paravirt_start_gate_mckinley_e9_patchlist = .;
|
__paravirt_start_gate_mckinley_e9_patchlist = .;
|
||||||
*(.data.patch.mckinley_e9)
|
*(.data..patch.mckinley_e9)
|
||||||
__paravirt_end_gate_mckinley_e9_patchlist = .;
|
__paravirt_end_gate_mckinley_e9_patchlist = .;
|
||||||
|
|
||||||
__paravirt_start_gate_vtop_patchlist = .;
|
__paravirt_start_gate_vtop_patchlist = .;
|
||||||
*(.data.patch.vtop)
|
*(.data..patch.vtop)
|
||||||
__paravirt_end_gate_vtop_patchlist = .;
|
__paravirt_end_gate_vtop_patchlist = .;
|
||||||
|
|
||||||
__paravirt_start_gate_fsyscall_patchlist = .;
|
__paravirt_start_gate_fsyscall_patchlist = .;
|
||||||
*(.data.patch.fsyscall_table)
|
*(.data..patch.fsyscall_table)
|
||||||
__paravirt_end_gate_fsyscall_patchlist = .;
|
__paravirt_end_gate_fsyscall_patchlist = .;
|
||||||
|
|
||||||
__paravirt_start_gate_brl_fsys_bubble_down_patchlist = .;
|
__paravirt_start_gate_brl_fsys_bubble_down_patchlist = .;
|
||||||
*(.data.patch.brl_fsys_bubble_down)
|
*(.data..patch.brl_fsys_bubble_down)
|
||||||
__paravirt_end_gate_brl_fsys_bubble_down_patchlist = .;
|
__paravirt_end_gate_brl_fsys_bubble_down_patchlist = .;
|
||||||
} :readable
|
} :readable
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||||
* Initial task structure.
|
* Initial task structure.
|
||||||
*
|
*
|
||||||
* We need to make sure that this is properly aligned due to the way process stacks are
|
* We need to make sure that this is properly aligned due to the way process stacks are
|
||||||
* handled. This is done by having a special ".data.init_task" section...
|
* handled. This is done by having a special ".data..init_task" section...
|
||||||
*/
|
*/
|
||||||
#define init_thread_info init_task_mem.s.thread_info
|
#define init_thread_info init_task_mem.s.thread_info
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@
|
||||||
mov r19=n;; /* prepare to save predicates */ \
|
mov r19=n;; /* prepare to save predicates */ \
|
||||||
br.sptk.many dispatch_to_fault_handler
|
br.sptk.many dispatch_to_fault_handler
|
||||||
|
|
||||||
.section .text.ivt,"ax"
|
.section .text..ivt,"ax"
|
||||||
|
|
||||||
.align 32768 // align on 32KB boundary
|
.align 32768 // align on 32KB boundary
|
||||||
.global ia64_ivt
|
.global ia64_ivt
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define ACCOUNT_SYS_ENTER
|
#define ACCOUNT_SYS_ENTER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.section ".data.patch.rse", "a"
|
.section ".data..patch.rse", "a"
|
||||||
.previous
|
.previous
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
(pUStk) extr.u r17=r18,3,6; \
|
(pUStk) extr.u r17=r18,3,6; \
|
||||||
(pUStk) sub r16=r18,r22; \
|
(pUStk) sub r16=r18,r22; \
|
||||||
[1:](pKStk) br.cond.sptk.many 1f; \
|
[1:](pKStk) br.cond.sptk.many 1f; \
|
||||||
.xdata4 ".data.patch.rse",1b-. \
|
.xdata4 ".data..patch.rse",1b-. \
|
||||||
;; \
|
;; \
|
||||||
cmp.ge p6,p7 = 33,r17; \
|
cmp.ge p6,p7 = 33,r17; \
|
||||||
;; \
|
;; \
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
|
||||||
#define DATA8(sym, init_value) \
|
#define DATA8(sym, init_value) \
|
||||||
.pushsection .data.read_mostly ; \
|
.pushsection .data..read_mostly ; \
|
||||||
.align 8 ; \
|
.align 8 ; \
|
||||||
.global sym ; \
|
.global sym ; \
|
||||||
sym: ; \
|
sym: ; \
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#define IVT_TEXT \
|
#define IVT_TEXT \
|
||||||
VMLINUX_SYMBOL(__start_ivt_text) = .; \
|
VMLINUX_SYMBOL(__start_ivt_text) = .; \
|
||||||
*(.text.ivt) \
|
*(.text..ivt) \
|
||||||
VMLINUX_SYMBOL(__end_ivt_text) = .;
|
VMLINUX_SYMBOL(__end_ivt_text) = .;
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf64-ia64-little")
|
OUTPUT_FORMAT("elf64-ia64-little")
|
||||||
|
@ -54,8 +54,8 @@ SECTIONS
|
||||||
.text2 : AT(ADDR(.text2) - LOAD_OFFSET)
|
.text2 : AT(ADDR(.text2) - LOAD_OFFSET)
|
||||||
{ *(.text2) }
|
{ *(.text2) }
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
.text.lock : AT(ADDR(.text.lock) - LOAD_OFFSET)
|
.text..lock : AT(ADDR(.text..lock) - LOAD_OFFSET)
|
||||||
{ *(.text.lock) }
|
{ *(.text..lock) }
|
||||||
#endif
|
#endif
|
||||||
_etext = .;
|
_etext = .;
|
||||||
|
|
||||||
|
@ -75,10 +75,10 @@ SECTIONS
|
||||||
__stop___mca_table = .;
|
__stop___mca_table = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
.data.patch.phys_stack_reg : AT(ADDR(.data.patch.phys_stack_reg) - LOAD_OFFSET)
|
.data..patch.phys_stack_reg : AT(ADDR(.data..patch.phys_stack_reg) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
__start___phys_stack_reg_patchlist = .;
|
__start___phys_stack_reg_patchlist = .;
|
||||||
*(.data.patch.phys_stack_reg)
|
*(.data..patch.phys_stack_reg)
|
||||||
__end___phys_stack_reg_patchlist = .;
|
__end___phys_stack_reg_patchlist = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,24 +110,24 @@ SECTIONS
|
||||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||||
INIT_DATA_SECTION(16)
|
INIT_DATA_SECTION(16)
|
||||||
|
|
||||||
.data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET)
|
.data..patch.vtop : AT(ADDR(.data..patch.vtop) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
__start___vtop_patchlist = .;
|
__start___vtop_patchlist = .;
|
||||||
*(.data.patch.vtop)
|
*(.data..patch.vtop)
|
||||||
__end___vtop_patchlist = .;
|
__end___vtop_patchlist = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
.data.patch.rse : AT(ADDR(.data.patch.rse) - LOAD_OFFSET)
|
.data..patch.rse : AT(ADDR(.data..patch.rse) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
__start___rse_patchlist = .;
|
__start___rse_patchlist = .;
|
||||||
*(.data.patch.rse)
|
*(.data..patch.rse)
|
||||||
__end___rse_patchlist = .;
|
__end___rse_patchlist = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
.data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET)
|
.data..patch.mckinley_e9 : AT(ADDR(.data..patch.mckinley_e9) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
__start___mckinley_e9_bundles = .;
|
__start___mckinley_e9_bundles = .;
|
||||||
*(.data.patch.mckinley_e9)
|
*(.data..patch.mckinley_e9)
|
||||||
__end___mckinley_e9_bundles = .;
|
__end___mckinley_e9_bundles = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,17 +175,17 @@ SECTIONS
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
|
|
||||||
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET)
|
.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET)
|
||||||
{
|
{
|
||||||
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__start_gate_section = .;
|
__start_gate_section = .;
|
||||||
*(.data.gate)
|
*(.data..gate)
|
||||||
__stop_gate_section = .;
|
__stop_gate_section = .;
|
||||||
#ifdef CONFIG_XEN
|
#ifdef CONFIG_XEN
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__xen_start_gate_section = .;
|
__xen_start_gate_section = .;
|
||||||
*(.data.gate.xen)
|
*(.data..gate.xen)
|
||||||
__xen_stop_gate_section = .;
|
__xen_stop_gate_section = .;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ GLOBAL_ENTRY(kvm_vmm_panic)
|
||||||
br.call.sptk.many b6=vmm_panic_handler;
|
br.call.sptk.many b6=vmm_panic_handler;
|
||||||
END(kvm_vmm_panic)
|
END(kvm_vmm_panic)
|
||||||
|
|
||||||
.section .text.ivt,"ax"
|
.section .text..ivt,"ax"
|
||||||
|
|
||||||
.align 32768 // align on 32KB boundary
|
.align 32768 // align on 32KB boundary
|
||||||
.global kvm_ia64_ivt
|
.global kvm_ia64_ivt
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/python
|
||||||
#
|
#
|
||||||
# Usage: unwcheck.py FILE
|
# Usage: unwcheck.py FILE
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
.section .data.gate.xen, "aw"
|
.section .data..gate.xen, "aw"
|
||||||
|
|
||||||
.incbin "arch/ia64/xen/gate.so"
|
.incbin "arch/ia64/xen/gate.so"
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <xen/interface/elfnote.h>
|
#include <xen/interface/elfnote.h>
|
||||||
|
|
||||||
.section .data.read_mostly
|
.section .data..read_mostly
|
||||||
.align 8
|
.align 8
|
||||||
.global xen_domain_type
|
.global xen_domain_type
|
||||||
xen_domain_type:
|
xen_domain_type:
|
||||||
|
|
|
@ -57,7 +57,7 @@ SECTIONS {
|
||||||
.romvec : {
|
.romvec : {
|
||||||
__rom_start = . ;
|
__rom_start = . ;
|
||||||
_romvec = .;
|
_romvec = .;
|
||||||
*(.data.initvect)
|
*(.data..initvect)
|
||||||
} > romvec
|
} > romvec
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ SECTIONS {
|
||||||
TEXT_TEXT
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
*(.text.lock)
|
*(.text..lock)
|
||||||
|
|
||||||
. = ALIGN(16); /* Exception table */
|
. = ALIGN(16); /* Exception table */
|
||||||
__start___ex_table = .;
|
__start___ex_table = .;
|
||||||
|
|
|
@ -280,7 +280,7 @@ _dprbase:
|
||||||
* and then overwritten as needed.
|
* and then overwritten as needed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.section ".data.initvect","awx"
|
.section ".data..initvect","awx"
|
||||||
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
||||||
.long _start /* Reset: Initial Program Counter - 1. */
|
.long _start /* Reset: Initial Program Counter - 1. */
|
||||||
.long buserr /* Bus Error - 2. */
|
.long buserr /* Bus Error - 2. */
|
||||||
|
|
|
@ -291,7 +291,7 @@ _dprbase:
|
||||||
* and then overwritten as needed.
|
* and then overwritten as needed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.section ".data.initvect","awx"
|
.section ".data..initvect","awx"
|
||||||
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
||||||
.long _start /* Reset: Initial Program Counter - 1. */
|
.long _start /* Reset: Initial Program Counter - 1. */
|
||||||
.long buserr /* Bus Error - 2. */
|
.long buserr /* Bus Error - 2. */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include <asm/lasat/head.h>
|
#include <asm/lasat/head.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.section .text.start, "ax"
|
.section .text..start, "ax"
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set mips3
|
.set mips3
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ SECTIONS
|
||||||
{
|
{
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
*(.text.start)
|
*(.text..start)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Data in ROM */
|
/* Data in ROM */
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
void parisc_cache_init(void); /* initializes cache-flushing */
|
void parisc_cache_init(void); /* initializes cache-flushing */
|
||||||
void disable_sr_hashing_asm(int); /* low level support for above */
|
void disable_sr_hashing_asm(int); /* low level support for above */
|
||||||
|
|
|
@ -174,7 +174,7 @@ static inline void set_eiem(unsigned long val)
|
||||||
})
|
})
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
# define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
|
# define __lock_aligned __attribute__((__section__(".data..lock_aligned")))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define arch_align_stack(x) (x)
|
#define arch_align_stack(x) (x)
|
||||||
|
|
|
@ -345,7 +345,7 @@ smp_slave_stext:
|
||||||
ENDPROC(stext)
|
ENDPROC(stext)
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
.section .data.read_mostly
|
.section .data..read_mostly
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.export $global$,data
|
.export $global$,data
|
||||||
|
|
|
@ -53,11 +53,11 @@ union thread_union init_thread_union __init_task_data
|
||||||
* guarantee that global objects will be laid out in memory in the same order
|
* guarantee that global objects will be laid out in memory in the same order
|
||||||
* as the order of declaration, so put these in different sections and use
|
* as the order of declaration, so put these in different sections and use
|
||||||
* the linker script to order them. */
|
* the linker script to order them. */
|
||||||
pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((__section__ (".data.vm0.pmd"), aligned(PAGE_SIZE)));
|
pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((__section__ (".data..vm0.pmd"), aligned(PAGE_SIZE)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((__section__ (".data.vm0.pgd"), aligned(PAGE_SIZE)));
|
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((__section__ (".data..vm0.pgd"), aligned(PAGE_SIZE)));
|
||||||
pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data.vm0.pte"), aligned(PAGE_SIZE)));
|
pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data..vm0.pte"), aligned(PAGE_SIZE)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initial task structure.
|
* Initial task structure.
|
||||||
|
|
|
@ -94,8 +94,8 @@ SECTIONS
|
||||||
|
|
||||||
/* PA-RISC locks requires 16-byte alignment */
|
/* PA-RISC locks requires 16-byte alignment */
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
.data.lock_aligned : {
|
.data..lock_aligned : {
|
||||||
*(.data.lock_aligned)
|
*(.data..lock_aligned)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of data section */
|
/* End of data section */
|
||||||
|
@ -105,10 +105,10 @@ SECTIONS
|
||||||
__bss_start = .;
|
__bss_start = .;
|
||||||
/* page table entries need to be PAGE_SIZE aligned */
|
/* page table entries need to be PAGE_SIZE aligned */
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
.data.vmpages : {
|
.data..vmpages : {
|
||||||
*(.data.vm0.pmd)
|
*(.data..vm0.pmd)
|
||||||
*(.data.vm0.pgd)
|
*(.data..vm0.pgd)
|
||||||
*(.data.vm0.pte)
|
*(.data..vm0.pte)
|
||||||
}
|
}
|
||||||
.bss : {
|
.bss : {
|
||||||
*(.bss)
|
*(.bss)
|
||||||
|
|
|
@ -112,6 +112,11 @@ KBUILD_CFLAGS += $(call cc-option,-mspe=no)
|
||||||
# kernel considerably.
|
# kernel considerably.
|
||||||
KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
|
KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
|
||||||
|
|
||||||
|
# FIXME: the module load should be taught about the additional relocs
|
||||||
|
# generated by this.
|
||||||
|
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
||||||
|
|
||||||
# Never use string load/store instructions as they are
|
# Never use string load/store instructions as they are
|
||||||
# often slow when they are implemented at all
|
# often slow when they are implemented at all
|
||||||
KBUILD_CFLAGS += -mno-string
|
KBUILD_CFLAGS += -mno-string
|
||||||
|
|
|
@ -42,7 +42,7 @@ extern struct ppc64_caches ppc64_caches;
|
||||||
#endif /* __powerpc64__ && ! __ASSEMBLY__ */
|
#endif /* __powerpc64__ && ! __ASSEMBLY__ */
|
||||||
|
|
||||||
#if !defined(__ASSEMBLY__)
|
#if !defined(__ASSEMBLY__)
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
|
@ -162,14 +162,6 @@ do { \
|
||||||
|
|
||||||
#endif /* !CONFIG_HUGETLB_PAGE */
|
#endif /* !CONFIG_HUGETLB_PAGE */
|
||||||
|
|
||||||
#ifdef MODULE
|
|
||||||
#define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
|
|
||||||
#else
|
|
||||||
#define __page_aligned \
|
|
||||||
__attribute__((__aligned__(PAGE_SIZE), \
|
|
||||||
__section__(".data.page_aligned")))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VM_DATA_DEFAULT_FLAGS \
|
#define VM_DATA_DEFAULT_FLAGS \
|
||||||
(test_thread_flag(TIF_32BIT) ? \
|
(test_thread_flag(TIF_32BIT) ? \
|
||||||
VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
|
VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
|
||||||
|
|
|
@ -223,19 +223,17 @@ SECTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The initial task and kernel stack */
|
/* The initial task and kernel stack */
|
||||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
INIT_TASK_DATA_SECTION(THREAD_SIZE)
|
||||||
INIT_TASK_DATA(THREAD_SIZE)
|
|
||||||
}
|
|
||||||
|
|
||||||
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
|
.data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
|
||||||
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
||||||
}
|
}
|
||||||
|
|
||||||
.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
|
.data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
|
||||||
CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
|
CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
|
||||||
}
|
}
|
||||||
|
|
||||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
.data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
|
||||||
READ_MOSTLY_DATA(L1_CACHE_BYTES)
|
READ_MOSTLY_DATA(L1_CACHE_BYTES)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,6 @@
|
||||||
#define L1_CACHE_BYTES 256
|
#define L1_CACHE_BYTES 256
|
||||||
#define L1_CACHE_SHIFT 8
|
#define L1_CACHE_SHIFT 8
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -264,7 +264,7 @@ restore_registers:
|
||||||
lghi %r2,0
|
lghi %r2,0
|
||||||
br %r14
|
br %r14
|
||||||
|
|
||||||
.section .data.nosave,"aw",@progbits
|
.section .data..nosave,"aw",@progbits
|
||||||
.align 8
|
.align 8
|
||||||
.Ldisabled_wait_31:
|
.Ldisabled_wait_31:
|
||||||
.long 0x000a0000,0x00000000
|
.long 0x000a0000,0x00000000
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.rodata.compressed : {
|
.rodata..compressed : {
|
||||||
input_len = .;
|
input_len = .;
|
||||||
LONG(input_data_end - input_data) input_data = .;
|
LONG(input_data_end - input_data) input_data = .;
|
||||||
*(.data)
|
*(.data)
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
struct cache_info {
|
struct cache_info {
|
||||||
|
|
|
@ -325,7 +325,7 @@ main1:
|
||||||
(*rr)->next = NULL;
|
(*rr)->next = NULL;
|
||||||
}
|
}
|
||||||
printf("! Generated by btfixupprep. Do not edit.\n\n");
|
printf("! Generated by btfixupprep. Do not edit.\n\n");
|
||||||
printf("\t.section\t\".data.init\",#alloc,#write\n\t.align\t4\n\n");
|
printf("\t.section\t\".data..init\",#alloc,#write\n\t.align\t4\n\n");
|
||||||
printf("\t.global\t___btfixup_start\n___btfixup_start:\n\n");
|
printf("\t.global\t___btfixup_start\n___btfixup_start:\n\n");
|
||||||
for (i = 0; i < last; i++) {
|
for (i = 0; i < last; i++) {
|
||||||
f = array + i;
|
f = array + i;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT)
|
#define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT)
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
#ifdef CONFIG_SPARC32
|
#ifdef CONFIG_SPARC32
|
||||||
#include <asm/asi.h>
|
#include <asm/asi.h>
|
||||||
|
|
|
@ -94,7 +94,7 @@ SECTIONS
|
||||||
.data : {
|
.data : {
|
||||||
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
||||||
. = ALIGN(KERNEL_STACK_SIZE);
|
. = ALIGN(KERNEL_STACK_SIZE);
|
||||||
*(.data.init_irqstack)
|
*(.data..init_irqstack)
|
||||||
DATA_DATA
|
DATA_DATA
|
||||||
*(.data.* .gnu.linkonce.d.*)
|
*(.data.* .gnu.linkonce.d.*)
|
||||||
SORT(CONSTRUCTORS)
|
SORT(CONSTRUCTORS)
|
||||||
|
|
|
@ -34,5 +34,5 @@ union thread_union init_thread_union __init_task_data =
|
||||||
{ INIT_THREAD_INFO(init_task) };
|
{ INIT_THREAD_INFO(init_task) };
|
||||||
|
|
||||||
union thread_union cpu0_irqstack
|
union thread_union cpu0_irqstack
|
||||||
__attribute__((__section__(".data.init_irqstack"))) =
|
__attribute__((__section__(".data..init_irqstack"))) =
|
||||||
{ INIT_THREAD_INFO(init_task) };
|
{ INIT_THREAD_INFO(init_task) };
|
||||||
|
|
|
@ -50,7 +50,7 @@ SECTIONS
|
||||||
{
|
{
|
||||||
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
||||||
. = ALIGN(KERNEL_STACK_SIZE);
|
. = ALIGN(KERNEL_STACK_SIZE);
|
||||||
*(.data.init_irqstack)
|
*(.data..init_irqstack)
|
||||||
DATA_DATA
|
DATA_DATA
|
||||||
*(.gnu.linkonce.d*)
|
*(.gnu.linkonce.d*)
|
||||||
CONSTRUCTORS
|
CONSTRUCTORS
|
||||||
|
|
3
arch/x86/.gitignore
vendored
Normal file
3
arch/x86/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
boot/compressed/vmlinux
|
||||||
|
tools/test_get_len
|
||||||
|
|
|
@ -77,7 +77,7 @@ int main(int argc, char *argv[])
|
||||||
offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */
|
offs += 32*1024 + 18; /* Add 32K + 18 bytes slack */
|
||||||
offs = (offs+4095) & ~4095; /* Round to a 4K boundary */
|
offs = (offs+4095) & ~4095; /* Round to a 4K boundary */
|
||||||
|
|
||||||
printf(".section \".rodata.compressed\",\"a\",@progbits\n");
|
printf(".section \".rodata..compressed\",\"a\",@progbits\n");
|
||||||
printf(".globl z_input_len\n");
|
printf(".globl z_input_len\n");
|
||||||
printf("z_input_len = %lu\n", ilen);
|
printf("z_input_len = %lu\n", ilen);
|
||||||
printf(".globl z_output_len\n");
|
printf(".globl z_output_len\n");
|
||||||
|
|
|
@ -26,8 +26,8 @@ SECTIONS
|
||||||
HEAD_TEXT
|
HEAD_TEXT
|
||||||
_ehead = . ;
|
_ehead = . ;
|
||||||
}
|
}
|
||||||
.rodata.compressed : {
|
.rodata..compressed : {
|
||||||
*(.rodata.compressed)
|
*(.rodata..compressed)
|
||||||
}
|
}
|
||||||
.text : {
|
.text : {
|
||||||
_text = .; /* Text */
|
_text = .; /* Text */
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
|
#define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
|
||||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||||
|
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||||
|
|
||||||
#define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT
|
#define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT
|
||||||
#define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT)
|
#define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.section .text.page_aligned
|
.section .text..page_aligned
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/segment.h>
|
#include <asm/segment.h>
|
||||||
#include <asm/page_types.h>
|
#include <asm/page_types.h>
|
||||||
|
|
|
@ -34,7 +34,7 @@ EXPORT_SYMBOL(init_task);
|
||||||
/*
|
/*
|
||||||
* per-CPU TSS segments. Threads are completely 'soft' on Linux,
|
* per-CPU TSS segments. Threads are completely 'soft' on Linux,
|
||||||
* no more per-task TSS's. The TSS size is kept cacheline-aligned
|
* no more per-task TSS's. The TSS size is kept cacheline-aligned
|
||||||
* so they are allowed to end up in the .data.cacheline_aligned
|
* so they are allowed to end up in the .data..cacheline_aligned
|
||||||
* section. Since TSS's are completely CPU-local, we want them
|
* section. Since TSS's are completely CPU-local, we want them
|
||||||
* on exact cacheline boundaries, to eliminate cacheline ping-pong.
|
* on exact cacheline boundaries, to eliminate cacheline ping-pong.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -247,7 +247,7 @@ void __init setup_per_cpu_areas(void)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* Up to this point, the boot CPU has been using .data.init
|
* Up to this point, the boot CPU has been using .init.data
|
||||||
* area. Reload any changed state for the boot CPU.
|
* area. Reload any changed state for the boot CPU.
|
||||||
*/
|
*/
|
||||||
if (cpu == boot_cpu_id)
|
if (cpu == boot_cpu_id)
|
||||||
|
|
|
@ -97,7 +97,7 @@ SECTIONS
|
||||||
HEAD_TEXT
|
HEAD_TEXT
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
*(.text.page_aligned)
|
*(.text..page_aligned)
|
||||||
#endif
|
#endif
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
_stext = .;
|
_stext = .;
|
||||||
|
@ -305,7 +305,7 @@ SECTIONS
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
||||||
__bss_start = .;
|
__bss_start = .;
|
||||||
*(.bss.page_aligned)
|
*(.bss..page_aligned)
|
||||||
*(.bss)
|
*(.bss)
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__bss_stop = .;
|
__bss_stop = .;
|
||||||
|
|
|
@ -80,7 +80,7 @@ extern void setup_per_cpu_areas(void);
|
||||||
|
|
||||||
#ifndef PER_CPU_BASE_SECTION
|
#ifndef PER_CPU_BASE_SECTION
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
#define PER_CPU_BASE_SECTION ".data.percpu"
|
#define PER_CPU_BASE_SECTION ".data..percpu"
|
||||||
#else
|
#else
|
||||||
#define PER_CPU_BASE_SECTION ".data"
|
#define PER_CPU_BASE_SECTION ".data"
|
||||||
#endif
|
#endif
|
||||||
|
@ -92,15 +92,15 @@ extern void setup_per_cpu_areas(void);
|
||||||
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
||||||
#define PER_CPU_ALIGNED_SECTION ""
|
#define PER_CPU_ALIGNED_SECTION ""
|
||||||
#else
|
#else
|
||||||
#define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned"
|
#define PER_CPU_SHARED_ALIGNED_SECTION "..shared_aligned"
|
||||||
#define PER_CPU_ALIGNED_SECTION ".shared_aligned"
|
#define PER_CPU_ALIGNED_SECTION "..shared_aligned"
|
||||||
#endif
|
#endif
|
||||||
#define PER_CPU_FIRST_SECTION ".first"
|
#define PER_CPU_FIRST_SECTION "..first"
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
||||||
#define PER_CPU_ALIGNED_SECTION ".shared_aligned"
|
#define PER_CPU_ALIGNED_SECTION "..shared_aligned"
|
||||||
#define PER_CPU_FIRST_SECTION ""
|
#define PER_CPU_FIRST_SECTION ""
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -175,25 +175,25 @@
|
||||||
#define NOSAVE_DATA \
|
#define NOSAVE_DATA \
|
||||||
. = ALIGN(PAGE_SIZE); \
|
. = ALIGN(PAGE_SIZE); \
|
||||||
VMLINUX_SYMBOL(__nosave_begin) = .; \
|
VMLINUX_SYMBOL(__nosave_begin) = .; \
|
||||||
*(.data.nosave) \
|
*(.data..nosave) \
|
||||||
. = ALIGN(PAGE_SIZE); \
|
. = ALIGN(PAGE_SIZE); \
|
||||||
VMLINUX_SYMBOL(__nosave_end) = .;
|
VMLINUX_SYMBOL(__nosave_end) = .;
|
||||||
|
|
||||||
#define PAGE_ALIGNED_DATA(page_align) \
|
#define PAGE_ALIGNED_DATA(page_align) \
|
||||||
. = ALIGN(page_align); \
|
. = ALIGN(page_align); \
|
||||||
*(.data.page_aligned)
|
*(.data..page_aligned)
|
||||||
|
|
||||||
#define READ_MOSTLY_DATA(align) \
|
#define READ_MOSTLY_DATA(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
*(.data.read_mostly)
|
*(.data..read_mostly)
|
||||||
|
|
||||||
#define CACHELINE_ALIGNED_DATA(align) \
|
#define CACHELINE_ALIGNED_DATA(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
*(.data.cacheline_aligned)
|
*(.data..cacheline_aligned)
|
||||||
|
|
||||||
#define INIT_TASK_DATA(align) \
|
#define INIT_TASK_DATA(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
*(.data.init_task)
|
*(.data..init_task)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read only Data
|
* Read only Data
|
||||||
|
@ -435,7 +435,7 @@
|
||||||
*/
|
*/
|
||||||
#define INIT_TASK_DATA_SECTION(align) \
|
#define INIT_TASK_DATA_SECTION(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
.data.init_task : { \
|
.data..init_task : { \
|
||||||
INIT_TASK_DATA(align) \
|
INIT_TASK_DATA(align) \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,7 +499,7 @@
|
||||||
#define BSS(bss_align) \
|
#define BSS(bss_align) \
|
||||||
. = ALIGN(bss_align); \
|
. = ALIGN(bss_align); \
|
||||||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) { \
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) { \
|
||||||
*(.bss.page_aligned) \
|
*(.bss..page_aligned) \
|
||||||
*(.dynbss) \
|
*(.dynbss) \
|
||||||
*(.bss) \
|
*(.bss) \
|
||||||
*(COMMON) \
|
*(COMMON) \
|
||||||
|
@ -666,16 +666,16 @@
|
||||||
*/
|
*/
|
||||||
#define PERCPU_VADDR(vaddr, phdr) \
|
#define PERCPU_VADDR(vaddr, phdr) \
|
||||||
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
||||||
.data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \
|
.data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \
|
||||||
- LOAD_OFFSET) { \
|
- LOAD_OFFSET) { \
|
||||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||||
*(.data.percpu.first) \
|
*(.data..percpu..first) \
|
||||||
*(.data.percpu.page_aligned) \
|
*(.data..percpu..page_aligned) \
|
||||||
*(.data.percpu) \
|
*(.data..percpu) \
|
||||||
*(.data.percpu.shared_aligned) \
|
*(.data..percpu..shared_aligned) \
|
||||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||||
} phdr \
|
} phdr \
|
||||||
. = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu);
|
. = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PERCPU - define output section for percpu area, simple version
|
* PERCPU - define output section for percpu area, simple version
|
||||||
|
@ -687,18 +687,18 @@
|
||||||
*
|
*
|
||||||
* This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except
|
* This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except
|
||||||
* that __per_cpu_load is defined as a relative symbol against
|
* that __per_cpu_load is defined as a relative symbol against
|
||||||
* .data.percpu which is required for relocatable x86_32
|
* .data..percpu which is required for relocatable x86_32
|
||||||
* configuration.
|
* configuration.
|
||||||
*/
|
*/
|
||||||
#define PERCPU(align) \
|
#define PERCPU(align) \
|
||||||
. = ALIGN(align); \
|
. = ALIGN(align); \
|
||||||
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \
|
.data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \
|
||||||
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
VMLINUX_SYMBOL(__per_cpu_load) = .; \
|
||||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||||
*(.data.percpu.first) \
|
*(.data..percpu..first) \
|
||||||
*(.data.percpu.page_aligned) \
|
*(.data..percpu..page_aligned) \
|
||||||
*(.data.percpu) \
|
*(.data..percpu) \
|
||||||
*(.data.percpu.shared_aligned) \
|
*(.data..percpu..shared_aligned) \
|
||||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#ifndef __cacheline_aligned
|
#ifndef __cacheline_aligned
|
||||||
#define __cacheline_aligned \
|
#define __cacheline_aligned \
|
||||||
__attribute__((__aligned__(SMP_CACHE_BYTES), \
|
__attribute__((__aligned__(SMP_CACHE_BYTES), \
|
||||||
__section__(".data.cacheline_aligned")))
|
__section__(".data..cacheline_aligned")))
|
||||||
#endif /* __cacheline_aligned */
|
#endif /* __cacheline_aligned */
|
||||||
|
|
||||||
#ifndef __cacheline_aligned_in_smp
|
#ifndef __cacheline_aligned_in_smp
|
||||||
|
|
|
@ -301,7 +301,7 @@ void __init parse_early_options(char *cmdline);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Data marked not to be saved by software suspend */
|
/* Data marked not to be saved by software suspend */
|
||||||
#define __nosavedata __section(.data.nosave)
|
#define __nosavedata __section(.data..nosave)
|
||||||
|
|
||||||
/* This means "can be init if no module support, otherwise module load
|
/* This means "can be init if no module support, otherwise module load
|
||||||
may call it." */
|
may call it." */
|
||||||
|
|
|
@ -183,7 +183,7 @@ extern struct cred init_cred;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attach to the init_task data structure for proper alignment */
|
/* Attach to the init_task data structure for proper alignment */
|
||||||
#define __init_task_data __attribute__((__section__(".data.init_task")))
|
#define __init_task_data __attribute__((__section__(".data..init_task")))
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
# define asmregparm
|
# define asmregparm
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __page_aligned_data __section(.data.page_aligned) __aligned(PAGE_SIZE)
|
#define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE)
|
||||||
#define __page_aligned_bss __section(.bss.page_aligned) __aligned(PAGE_SIZE)
|
#define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For assembly routines.
|
* For assembly routines.
|
||||||
|
@ -27,8 +27,8 @@
|
||||||
* Note when using these that you must specify the appropriate
|
* Note when using these that you must specify the appropriate
|
||||||
* alignment directives yourself
|
* alignment directives yourself
|
||||||
*/
|
*/
|
||||||
#define __PAGE_ALIGNED_DATA .section ".data.page_aligned", "aw"
|
#define __PAGE_ALIGNED_DATA .section ".data..page_aligned", "aw"
|
||||||
#define __PAGE_ALIGNED_BSS .section ".bss.page_aligned", "aw"
|
#define __PAGE_ALIGNED_BSS .section ".bss..page_aligned", "aw"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is used by architectures to keep arguments on the stack
|
* This is used by architectures to keep arguments on the stack
|
||||||
|
|
|
@ -131,11 +131,11 @@
|
||||||
* Declaration/definition used for per-CPU variables that must be page aligned.
|
* Declaration/definition used for per-CPU variables that must be page aligned.
|
||||||
*/
|
*/
|
||||||
#define DECLARE_PER_CPU_PAGE_ALIGNED(type, name) \
|
#define DECLARE_PER_CPU_PAGE_ALIGNED(type, name) \
|
||||||
DECLARE_PER_CPU_SECTION(type, name, ".page_aligned") \
|
DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \
|
||||||
__aligned(PAGE_SIZE)
|
__aligned(PAGE_SIZE)
|
||||||
|
|
||||||
#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
|
#define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \
|
||||||
DEFINE_PER_CPU_SECTION(type, name, ".page_aligned") \
|
DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \
|
||||||
__aligned(PAGE_SIZE)
|
__aligned(PAGE_SIZE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
/*
|
/*
|
||||||
* Must define these before including other files, inline functions need them
|
* Must define these before including other files, inline functions need them
|
||||||
*/
|
*/
|
||||||
#define LOCK_SECTION_NAME ".text.lock."KBUILD_BASENAME
|
#define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME
|
||||||
|
|
||||||
#define LOCK_SECTION_START(extra) \
|
#define LOCK_SECTION_START(extra) \
|
||||||
".subsection 1\n\t" \
|
".subsection 1\n\t" \
|
||||||
|
|
|
@ -76,6 +76,14 @@ config INIT_ENV_ARG_LIMIT
|
||||||
variables passed to init from the kernel command line.
|
variables passed to init from the kernel command line.
|
||||||
|
|
||||||
|
|
||||||
|
config CROSS_COMPILE
|
||||||
|
string "Cross-compiler tool prefix"
|
||||||
|
help
|
||||||
|
Same as running 'make CROSS_COMPILE=prefix-' but stored for
|
||||||
|
default make runs in this kernel build directory. You don't
|
||||||
|
need to set this unless you want the configured kernel build
|
||||||
|
directory to select the cross-compiler automatically.
|
||||||
|
|
||||||
config LOCALVERSION
|
config LOCALVERSION
|
||||||
string "Local version - append to kernel release"
|
string "Local version - append to kernel release"
|
||||||
help
|
help
|
||||||
|
|
|
@ -403,7 +403,7 @@ static unsigned int find_pcpusec(Elf_Ehdr *hdr,
|
||||||
Elf_Shdr *sechdrs,
|
Elf_Shdr *sechdrs,
|
||||||
const char *secstrings)
|
const char *secstrings)
|
||||||
{
|
{
|
||||||
return find_sec(hdr, sechdrs, secstrings, ".data.percpu");
|
return find_sec(hdr, sechdrs, secstrings, ".data..percpu");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void percpu_modcopy(struct module *mod,
|
static void percpu_modcopy(struct module *mod,
|
||||||
|
|
|
@ -82,7 +82,7 @@ ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
|
||||||
lib-target := $(obj)/lib.a
|
lib-target := $(obj)/lib.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(lib-target)),)
|
ifneq ($(strip $(obj-y) $(obj-m) $(obj-n) $(obj-) $(subdir-m) $(lib-target)),)
|
||||||
builtin-target := $(obj)/built-in.o
|
builtin-target := $(obj)/built-in.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -241,7 +241,7 @@ cmd_lzma = (cat $(filter-out FORCE,$^) | \
|
||||||
lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||||
(rm -f $@ ; false)
|
(rm -f $@ ; false)
|
||||||
|
|
||||||
quiet_cmd_lzo = LZO $@
|
quiet_cmd_lzo = LZO $@
|
||||||
cmd_lzo = (cat $(filter-out FORCE,$^) | \
|
cmd_lzo = (cat $(filter-out FORCE,$^) | \
|
||||||
lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||||
(rm -f $@ ; false)
|
(rm -f $@ ; false)
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
# you do have real dups and do not have them under #ifdef's. You
|
# you do have real dups and do not have them under #ifdef's. You
|
||||||
# could also just review the results.
|
# could also just review the results.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
sub usage {
|
sub usage {
|
||||||
print "Usage: checkincludes.pl [-r]\n";
|
print "Usage: checkincludes.pl [-r]\n";
|
||||||
print "By default we just warn of duplicates\n";
|
print "By default we just warn of duplicates\n";
|
||||||
|
@ -35,23 +37,24 @@ if ($#ARGV >= 1) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach $file (@ARGV) {
|
foreach my $file (@ARGV) {
|
||||||
open(FILE, $file) or die "Cannot open $file: $!.\n";
|
open(my $f, '<', $file)
|
||||||
|
or die "Cannot open $file: $!.\n";
|
||||||
|
|
||||||
my %includedfiles = ();
|
my %includedfiles = ();
|
||||||
my @file_lines = ();
|
my @file_lines = ();
|
||||||
|
|
||||||
while (<FILE>) {
|
while (<$f>) {
|
||||||
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
||||||
++$includedfiles{$1};
|
++$includedfiles{$1};
|
||||||
}
|
}
|
||||||
push(@file_lines, $_);
|
push(@file_lines, $_);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(FILE);
|
close($f);
|
||||||
|
|
||||||
if (!$remove) {
|
if (!$remove) {
|
||||||
foreach $filename (keys %includedfiles) {
|
foreach my $filename (keys %includedfiles) {
|
||||||
if ($includedfiles{$filename} > 1) {
|
if ($includedfiles{$filename} > 1) {
|
||||||
print "$file: $filename is included more than once.\n";
|
print "$file: $filename is included more than once.\n";
|
||||||
}
|
}
|
||||||
|
@ -59,27 +62,28 @@ foreach $file (@ARGV) {
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
open(FILE,">$file") || die("Cannot write to $file: $!");
|
open($f, '>', $file)
|
||||||
|
or die("Cannot write to $file: $!");
|
||||||
|
|
||||||
my $dups = 0;
|
my $dups = 0;
|
||||||
foreach (@file_lines) {
|
foreach (@file_lines) {
|
||||||
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
||||||
foreach $filename (keys %includedfiles) {
|
foreach my $filename (keys %includedfiles) {
|
||||||
if ($1 eq $filename) {
|
if ($1 eq $filename) {
|
||||||
if ($includedfiles{$filename} > 1) {
|
if ($includedfiles{$filename} > 1) {
|
||||||
$includedfiles{$filename}--;
|
$includedfiles{$filename}--;
|
||||||
$dups++;
|
$dups++;
|
||||||
} else {
|
} else {
|
||||||
print FILE $_;
|
print {$f} $_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
print FILE $_;
|
print {$f} $_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($dups > 0) {
|
if ($dups > 0) {
|
||||||
print "$file: removed $dups duplicate includes\n";
|
print "$file: removed $dups duplicate includes\n";
|
||||||
}
|
}
|
||||||
close(FILE);
|
close($f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#
|
#
|
||||||
# TODO : Port to all architectures (one regex per arch)
|
# TODO : Port to all architectures (one regex per arch)
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
# check for arch
|
# check for arch
|
||||||
#
|
#
|
||||||
# $re is used for two matches:
|
# $re is used for two matches:
|
||||||
|
@ -104,19 +106,11 @@ my (@stack, $re, $dre, $x, $xs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub bysize($) {
|
|
||||||
my ($asize, $bsize);
|
|
||||||
($asize = $a) =~ s/.*: *(.*)$/$1/;
|
|
||||||
($bsize = $b) =~ s/.*: *(.*)$/$1/;
|
|
||||||
$bsize <=> $asize
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# main()
|
# main()
|
||||||
#
|
#
|
||||||
my $funcre = qr/^$x* <(.*)>:$/;
|
my $funcre = qr/^$x* <(.*)>:$/;
|
||||||
my $func;
|
my ($func, $file, $lastslash);
|
||||||
my $file, $lastslash;
|
|
||||||
|
|
||||||
while (my $line = <STDIN>) {
|
while (my $line = <STDIN>) {
|
||||||
if ($line =~ m/$funcre/) {
|
if ($line =~ m/$funcre/) {
|
||||||
|
@ -173,4 +167,6 @@ while (my $line = <STDIN>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print sort bysize @stack;
|
# Sort output by size (last field)
|
||||||
|
print sort { ($b =~ /:\t*(\d+)$/)[0] <=> ($a =~ /:\t*(\d+)$/)[0] } @stack;
|
||||||
|
|
||||||
|
|
|
@ -5,23 +5,22 @@
|
||||||
# including <linux/version.h> that don't need it.
|
# including <linux/version.h> that don't need it.
|
||||||
# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net>
|
# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net>
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
$| = 1;
|
$| = 1;
|
||||||
|
|
||||||
my $debugging = 0;
|
my $debugging;
|
||||||
|
|
||||||
foreach $file (@ARGV)
|
foreach my $file (@ARGV) {
|
||||||
{
|
|
||||||
# Open this file.
|
# Open this file.
|
||||||
open(FILE, $file) || die "Can't open $file: $!\n";
|
open( my $f, '<', $file )
|
||||||
|
or die "Can't open $file: $!\n";
|
||||||
|
|
||||||
# Initialize variables.
|
# Initialize variables.
|
||||||
my $fInComment = 0;
|
my ($fInComment, $fInString, $fUseVersion);
|
||||||
my $fInString = 0;
|
|
||||||
my $fUseVersion = 0;
|
|
||||||
my $iLinuxVersion = 0;
|
my $iLinuxVersion = 0;
|
||||||
|
|
||||||
LINE: while ( <FILE> )
|
while (<$f>) {
|
||||||
{
|
|
||||||
# Strip comments.
|
# Strip comments.
|
||||||
$fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next);
|
$fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next);
|
||||||
m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1)));
|
m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1)));
|
||||||
|
@ -43,8 +42,8 @@ foreach $file (@ARGV)
|
||||||
# Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE
|
# Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE
|
||||||
if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) {
|
if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) {
|
||||||
$fUseVersion = 1;
|
$fUseVersion = 1;
|
||||||
last LINE if $iLinuxVersion;
|
last if $iLinuxVersion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Report used version IDs without include?
|
# Report used version IDs without include?
|
||||||
|
@ -67,5 +66,5 @@ foreach $file (@ARGV)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close(FILE);
|
close($f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
# AFLAGS=--32 decodecode < 386.oops
|
# AFLAGS=--32 decodecode < 386.oops
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
rm -f $T $T.s $T.o $T.oo $T.aa $T.aaa
|
rm -f $T $T.s $T.o $T.oo $T.aa $T.dis
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,29 @@ fi
|
||||||
echo $code
|
echo $code
|
||||||
code=`echo $code | sed -e 's/.*Code: //'`
|
code=`echo $code | sed -e 's/.*Code: //'`
|
||||||
|
|
||||||
|
width=`expr index "$code" ' '`
|
||||||
|
width=$[($width-1)/2]
|
||||||
|
case $width in
|
||||||
|
1) type=byte ;;
|
||||||
|
2) type=2byte ;;
|
||||||
|
4) type=4byte ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
disas() {
|
||||||
|
${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s &> /dev/null
|
||||||
|
|
||||||
|
if [ "$ARCH" == "arm" ]; then
|
||||||
|
if [ $width == 2 ]; then
|
||||||
|
OBJDUMPFLAGS="-M force-thumb"
|
||||||
|
fi
|
||||||
|
|
||||||
|
${CROSS_COMPILE}strip $1.o
|
||||||
|
fi
|
||||||
|
|
||||||
|
${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \
|
||||||
|
grep -v "/tmp\|Disassembly\|\.text\|^$" &> $1.dis
|
||||||
|
}
|
||||||
|
|
||||||
marker=`expr index "$code" "\<"`
|
marker=`expr index "$code" "\<"`
|
||||||
if [ $marker -eq 0 ]; then
|
if [ $marker -eq 0 ]; then
|
||||||
marker=`expr index "$code" "\("`
|
marker=`expr index "$code" "\("`
|
||||||
|
@ -49,26 +72,25 @@ if [ $marker -ne 0 ]; then
|
||||||
echo All code >> $T.oo
|
echo All code >> $T.oo
|
||||||
echo ======== >> $T.oo
|
echo ======== >> $T.oo
|
||||||
beforemark=`echo "$code"`
|
beforemark=`echo "$code"`
|
||||||
echo -n " .byte 0x" > $T.s
|
echo -n " .$type 0x" > $T.s
|
||||||
echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s
|
echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s
|
||||||
as $AFLAGS -o $T.o $T.s &> /dev/null
|
disas $T
|
||||||
objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo
|
cat $T.dis >> $T.oo
|
||||||
cat $T.ooo >> $T.oo
|
rm -f $T.o $T.s $T.dis
|
||||||
rm -f $T.o $T.s $T.ooo
|
|
||||||
|
|
||||||
# and fix code at-and-after marker
|
# and fix code at-and-after marker
|
||||||
code=`echo "$code" | cut -c$((${marker} + 1))-`
|
code=`echo "$code" | cut -c$((${marker} + 1))-`
|
||||||
fi
|
fi
|
||||||
echo Code starting with the faulting instruction > $T.aa
|
echo Code starting with the faulting instruction > $T.aa
|
||||||
echo =========================================== >> $T.aa
|
echo =========================================== >> $T.aa
|
||||||
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'`
|
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'`
|
||||||
echo -n " .byte 0x" > $T.s
|
echo -n " .$type 0x" > $T.s
|
||||||
echo $code >> $T.s
|
echo $code >> $T.s
|
||||||
as $AFLAGS -o $T.o $T.s &> /dev/null
|
disas $T
|
||||||
objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa
|
cat $T.dis >> $T.aa
|
||||||
cat $T.aaa >> $T.aa
|
|
||||||
|
|
||||||
faultline=`cat $T.aaa | head -1 | cut -d":" -f2`
|
faultline=`cat $T.dis | head -1 | cut -d":" -f2`
|
||||||
|
faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'`
|
||||||
|
|
||||||
cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g"
|
cat $T.oo | sed -e "s/\($faultline\)/\*\1 <-- trapping instruction/g"
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -49,10 +49,10 @@ sub usage {
|
||||||
}
|
}
|
||||||
|
|
||||||
sub collectcfiles {
|
sub collectcfiles {
|
||||||
my @file = `cat .tmp_versions/*.mod | grep '.*\.ko\$'`;
|
my @file
|
||||||
@file = grep {s/\.ko/.mod.c/} @file;
|
= `cat .tmp_versions/*.mod | grep '.*\.ko\$' | sed s/\.ko$/.mod.c/`;
|
||||||
chomp @file;
|
chomp @file;
|
||||||
return @file;
|
return @file;
|
||||||
}
|
}
|
||||||
|
|
||||||
my (%SYMBOL, %MODULE, %opt, @allcfiles);
|
my (%SYMBOL, %MODULE, %opt, @allcfiles);
|
||||||
|
@ -71,37 +71,40 @@ if (not defined $opt{'k'}) {
|
||||||
$opt{'k'} = "Module.symvers";
|
$opt{'k'} = "Module.symvers";
|
||||||
}
|
}
|
||||||
|
|
||||||
unless (open(MODULE_SYMVERS, $opt{'k'})) {
|
open (my $module_symvers, '<', $opt{'k'})
|
||||||
die "Sorry, cannot open $opt{'k'}: $!\n";
|
or die "Sorry, cannot open $opt{'k'}: $!\n";
|
||||||
}
|
|
||||||
|
|
||||||
if (defined $opt{'o'}) {
|
if (defined $opt{'o'}) {
|
||||||
unless (open(OUTPUT_HANDLE, ">$opt{'o'}")) {
|
open (my $out, '>', $opt{'o'})
|
||||||
die "Sorry, cannot open $opt{'o'} $!\n";
|
or die "Sorry, cannot open $opt{'o'} $!\n";
|
||||||
}
|
|
||||||
select OUTPUT_HANDLE;
|
select $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# collect all the symbols and their attributes from the
|
# collect all the symbols and their attributes from the
|
||||||
# Module.symvers file
|
# Module.symvers file
|
||||||
#
|
#
|
||||||
while ( <MODULE_SYMVERS> ) {
|
while ( <$module_symvers> ) {
|
||||||
chomp;
|
chomp;
|
||||||
my (undef, $symbol, $module, $gpl) = split;
|
my (undef, $symbol, $module, $gpl) = split;
|
||||||
$SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl];
|
$SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl];
|
||||||
}
|
}
|
||||||
close(MODULE_SYMVERS);
|
close($module_symvers);
|
||||||
|
|
||||||
#
|
#
|
||||||
# collect the usage count of each symbol.
|
# collect the usage count of each symbol.
|
||||||
#
|
#
|
||||||
foreach my $thismod (@allcfiles) {
|
foreach my $thismod (@allcfiles) {
|
||||||
unless (open(MODULE_MODULE, $thismod)) {
|
my $module;
|
||||||
print "Sorry, cannot open $thismod: $!\n";
|
|
||||||
|
unless (open ($module, '<', $thismod)) {
|
||||||
|
warn "Sorry, cannot open $thismod: $!\n";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $state=0;
|
my $state=0;
|
||||||
while ( <MODULE_MODULE> ) {
|
while ( <$module> ) {
|
||||||
chomp;
|
chomp;
|
||||||
if ($state == 0) {
|
if ($state == 0) {
|
||||||
$state = 1 if ($_ =~ /static const struct modversion_info/);
|
$state = 1 if ($_ =~ /static const struct modversion_info/);
|
||||||
|
@ -124,7 +127,7 @@ foreach my $thismod (@allcfiles) {
|
||||||
if ($state != 2) {
|
if ($state != 2) {
|
||||||
print "WARNING:$thismod is not built with CONFIG_MODVERSION enabled\n";
|
print "WARNING:$thismod is not built with CONFIG_MODVERSION enabled\n";
|
||||||
}
|
}
|
||||||
close(MODULE_MODULE);
|
close($module);
|
||||||
}
|
}
|
||||||
|
|
||||||
print "\tThis file reports the exported symbols usage patterns by in-tree\n",
|
print "\tThis file reports the exported symbols usage patterns by in-tree\n",
|
||||||
|
|
|
@ -202,6 +202,7 @@ input_file() {
|
||||||
print_mtime "$1" >> ${output}
|
print_mtime "$1" >> ${output}
|
||||||
cat "$1" >> ${output}
|
cat "$1" >> ${output}
|
||||||
else
|
else
|
||||||
|
echo "$1 \\"
|
||||||
cat "$1" | while read type dir file perm ; do
|
cat "$1" | while read type dir file perm ; do
|
||||||
if [ "$type" == "file" ]; then
|
if [ "$type" == "file" ]; then
|
||||||
echo "$file \\";
|
echo "$file \\";
|
||||||
|
@ -231,7 +232,7 @@ arg="$1"
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
"-l") # files included in initramfs - used by kbuild
|
"-l") # files included in initramfs - used by kbuild
|
||||||
dep_list="list_"
|
dep_list="list_"
|
||||||
echo "deps_initramfs := \\"
|
echo "deps_initramfs := $0 \\"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
"-o") # generate compressed cpio image named $1
|
"-o") # generate compressed cpio image named $1
|
||||||
|
|
|
@ -758,8 +758,10 @@ int main(int argc, char **argv)
|
||||||
/* setlinebuf(debugfile); */
|
/* setlinebuf(debugfile); */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag_reference)
|
if (flag_reference) {
|
||||||
read_reference(ref_file);
|
read_reference(ref_file);
|
||||||
|
fclose(ref_file);
|
||||||
|
}
|
||||||
|
|
||||||
yyparse();
|
yyparse();
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,7 @@ sub search {
|
||||||
my $path = "$i/$filename";
|
my $path = "$i/$filename";
|
||||||
return $path if -f $path;
|
return $path if -f $path;
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
return undef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub parse_all {
|
sub parse_all {
|
||||||
|
|
|
@ -28,11 +28,12 @@ my $lineno = 0;
|
||||||
my $filename;
|
my $filename;
|
||||||
|
|
||||||
foreach my $file (@files) {
|
foreach my $file (@files) {
|
||||||
local *FH;
|
|
||||||
$filename = $file;
|
$filename = $file;
|
||||||
open(FH, "<$filename") or die "$filename: $!\n";
|
|
||||||
|
open(my $fh, '<', $filename)
|
||||||
|
or die "$filename: $!\n";
|
||||||
$lineno = 0;
|
$lineno = 0;
|
||||||
while ($line = <FH>) {
|
while ($line = <$fh>) {
|
||||||
$lineno++;
|
$lineno++;
|
||||||
&check_include();
|
&check_include();
|
||||||
&check_asm_types();
|
&check_asm_types();
|
||||||
|
@ -40,7 +41,7 @@ foreach my $file (@files) {
|
||||||
&check_declarations();
|
&check_declarations();
|
||||||
# Dropped for now. Too much noise &check_config();
|
# Dropped for now. Too much noise &check_config();
|
||||||
}
|
}
|
||||||
close FH;
|
close $fh;
|
||||||
}
|
}
|
||||||
exit $ret;
|
exit $ret;
|
||||||
|
|
||||||
|
@ -78,7 +79,7 @@ sub check_config
|
||||||
}
|
}
|
||||||
|
|
||||||
my $linux_asm_types;
|
my $linux_asm_types;
|
||||||
sub check_asm_types()
|
sub check_asm_types
|
||||||
{
|
{
|
||||||
if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
|
if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -23,13 +23,13 @@ my ($readdir, $installdir, $arch, @files) = @ARGV;
|
||||||
my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
|
my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
|
||||||
|
|
||||||
foreach my $file (@files) {
|
foreach my $file (@files) {
|
||||||
local *INFILE;
|
|
||||||
local *OUTFILE;
|
|
||||||
my $tmpfile = "$installdir/$file.tmp";
|
my $tmpfile = "$installdir/$file.tmp";
|
||||||
open(INFILE, "<$readdir/$file")
|
|
||||||
or die "$readdir/$file: $!\n";
|
open(my $in, '<', "$readdir/$file")
|
||||||
open(OUTFILE, ">$tmpfile") or die "$tmpfile: $!\n";
|
or die "$readdir/$file: $!\n";
|
||||||
while (my $line = <INFILE>) {
|
open(my $out, '>', $tmpfile)
|
||||||
|
or die "$tmpfile: $!\n";
|
||||||
|
while (my $line = <$in>) {
|
||||||
$line =~ s/([\s(])__user\s/$1/g;
|
$line =~ s/([\s(])__user\s/$1/g;
|
||||||
$line =~ s/([\s(])__force\s/$1/g;
|
$line =~ s/([\s(])__force\s/$1/g;
|
||||||
$line =~ s/([\s(])__iomem\s/$1/g;
|
$line =~ s/([\s(])__iomem\s/$1/g;
|
||||||
|
@ -39,10 +39,11 @@ foreach my $file (@files) {
|
||||||
$line =~ s/(^|\s)(inline)\b/$1__$2__/g;
|
$line =~ s/(^|\s)(inline)\b/$1__$2__/g;
|
||||||
$line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g;
|
$line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g;
|
||||||
$line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g;
|
$line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g;
|
||||||
printf OUTFILE "%s", $line;
|
printf {$out} "%s", $line;
|
||||||
}
|
}
|
||||||
close OUTFILE;
|
close $out;
|
||||||
close INFILE;
|
close $in;
|
||||||
|
|
||||||
system $unifdef . " $tmpfile > $installdir/$file";
|
system $unifdef . " $tmpfile > $installdir/$file";
|
||||||
unlink $tmpfile;
|
unlink $tmpfile;
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,8 +108,10 @@ static int read_symbol(FILE *in, struct sym_entry *s)
|
||||||
rc = fscanf(in, "%llx %c %499s\n", &s->addr, &stype, str);
|
rc = fscanf(in, "%llx %c %499s\n", &s->addr, &stype, str);
|
||||||
if (rc != 3) {
|
if (rc != 3) {
|
||||||
if (rc != EOF) {
|
if (rc != EOF) {
|
||||||
/* skip line */
|
/* skip line. sym is used as dummy to
|
||||||
fgets(str, 500, in);
|
* shut of "warn_unused_result" warning.
|
||||||
|
*/
|
||||||
|
sym = fgets(str, 500, in);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,9 @@ menuconfig: $(obj)/mconf
|
||||||
config: $(obj)/conf
|
config: $(obj)/conf
|
||||||
$< $(Kconfig)
|
$< $(Kconfig)
|
||||||
|
|
||||||
|
nconfig: $(obj)/nconf
|
||||||
|
$< $(Kconfig)
|
||||||
|
|
||||||
oldconfig: $(obj)/conf
|
oldconfig: $(obj)/conf
|
||||||
$< -o $(Kconfig)
|
$< -o $(Kconfig)
|
||||||
|
|
||||||
|
@ -120,6 +123,7 @@ endif
|
||||||
# Help text used by make help
|
# Help text used by make help
|
||||||
help:
|
help:
|
||||||
@echo ' config - Update current config utilising a line-oriented program'
|
@echo ' config - Update current config utilising a line-oriented program'
|
||||||
|
@echo ' nconfig - Update current config utilising a ncurses menu based program'
|
||||||
@echo ' menuconfig - Update current config utilising a menu based program'
|
@echo ' menuconfig - Update current config utilising a menu based program'
|
||||||
@echo ' xconfig - Update current config utilising a QT based front-end'
|
@echo ' xconfig - Update current config utilising a QT based front-end'
|
||||||
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
||||||
|
@ -147,6 +151,8 @@ HOST_EXTRACFLAGS += -DLOCALE
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# Shared Makefile for the various kconfig executables:
|
# Shared Makefile for the various kconfig executables:
|
||||||
# conf: Used for defconfig, oldconfig and related targets
|
# conf: Used for defconfig, oldconfig and related targets
|
||||||
|
# nconf: Used for the nconfig target.
|
||||||
|
# Utilizes ncurses
|
||||||
# mconf: Used for the menuconfig target
|
# mconf: Used for the menuconfig target
|
||||||
# Utilizes the lxdialog package
|
# Utilizes the lxdialog package
|
||||||
# qconf: Used for the xconfig target
|
# qconf: Used for the xconfig target
|
||||||
|
@ -159,11 +165,16 @@ lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
|
||||||
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
|
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
|
||||||
|
|
||||||
conf-objs := conf.o zconf.tab.o
|
conf-objs := conf.o zconf.tab.o
|
||||||
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
||||||
|
nconf-objs := nconf.o zconf.tab.o nconf.gui.o
|
||||||
kxgettext-objs := kxgettext.o zconf.tab.o
|
kxgettext-objs := kxgettext.o zconf.tab.o
|
||||||
|
|
||||||
hostprogs-y := conf qconf gconf kxgettext
|
hostprogs-y := conf qconf gconf kxgettext
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),nconfig)
|
||||||
|
hostprogs-y += nconf
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),menuconfig)
|
ifeq ($(MAKECMDGOALS),menuconfig)
|
||||||
hostprogs-y += mconf
|
hostprogs-y += mconf
|
||||||
endif
|
endif
|
||||||
|
@ -187,7 +198,7 @@ endif
|
||||||
|
|
||||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||||
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
||||||
clean-files += mconf qconf gconf
|
clean-files += mconf qconf gconf nconf
|
||||||
clean-files += config.pot linux.pot
|
clean-files += config.pot linux.pot
|
||||||
|
|
||||||
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
||||||
|
@ -212,6 +223,7 @@ HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
|
||||||
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
||||||
-D LKC_DIRECT_LINK
|
-D LKC_DIRECT_LINK
|
||||||
|
|
||||||
|
HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses
|
||||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||||
|
|
||||||
ifeq ($(qconf-target),1)
|
ifeq ($(qconf-target),1)
|
||||||
|
|
|
@ -1097,9 +1097,32 @@ 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);
|
struct gstr *gs = (struct gstr*)data;
|
||||||
|
const char *sym_str = NULL;
|
||||||
|
|
||||||
if (sym)
|
if (sym)
|
||||||
str_printf((struct gstr*)data, " [=%s]", sym_get_string_value(sym));
|
sym_str = sym_get_string_value(sym);
|
||||||
|
|
||||||
|
if (gs->max_width) {
|
||||||
|
unsigned extra_length = strlen(str);
|
||||||
|
const char *last_cr = strrchr(gs->s, '\n');
|
||||||
|
unsigned last_line_length;
|
||||||
|
|
||||||
|
if (sym_str)
|
||||||
|
extra_length += 4 + strlen(sym_str);
|
||||||
|
|
||||||
|
if (!last_cr)
|
||||||
|
last_cr = gs->s;
|
||||||
|
|
||||||
|
last_line_length = strlen(gs->s) - (last_cr - gs->s);
|
||||||
|
|
||||||
|
if ((last_line_length + extra_length) > gs->max_width)
|
||||||
|
str_append(gs, "\\\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
str_append(gs, str);
|
||||||
|
if (sym)
|
||||||
|
str_printf(gs, " [=%s]", sym_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
||||||
|
|
|
@ -86,7 +86,7 @@ struct symbol {
|
||||||
struct expr_value rev_dep;
|
struct expr_value rev_dep;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
||||||
|
|
||||||
#define SYMBOL_CONST 0x0001 /* symbol is const */
|
#define SYMBOL_CONST 0x0001 /* symbol is const */
|
||||||
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
||||||
|
@ -108,8 +108,7 @@ struct symbol {
|
||||||
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
||||||
|
|
||||||
#define SYMBOL_MAXLENGTH 256
|
#define SYMBOL_MAXLENGTH 256
|
||||||
#define SYMBOL_HASHSIZE 257
|
#define SYMBOL_HASHSIZE 9973
|
||||||
#define SYMBOL_HASHMASK 0xff
|
|
||||||
|
|
||||||
/* A property represent the config options that can be associated
|
/* A property represent the config options that can be associated
|
||||||
* with a config "symbol".
|
* with a config "symbol".
|
||||||
|
|
|
@ -30,13 +30,16 @@ enum {
|
||||||
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OPT_NORMAL, OPT_ALL, OPT_PROMPT
|
||||||
|
};
|
||||||
|
|
||||||
static gint view_mode = FULL_VIEW;
|
static gint view_mode = FULL_VIEW;
|
||||||
static gboolean show_name = TRUE;
|
static gboolean show_name = TRUE;
|
||||||
static gboolean show_range = TRUE;
|
static gboolean show_range = TRUE;
|
||||||
static gboolean show_value = TRUE;
|
static gboolean show_value = TRUE;
|
||||||
static gboolean show_all = FALSE;
|
|
||||||
static gboolean show_debug = FALSE;
|
|
||||||
static gboolean resizeable = FALSE;
|
static gboolean resizeable = FALSE;
|
||||||
|
static int opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
GtkWidget *main_wnd = NULL;
|
GtkWidget *main_wnd = NULL;
|
||||||
GtkWidget *tree1_w = NULL; // left frame
|
GtkWidget *tree1_w = NULL; // left frame
|
||||||
|
@ -76,36 +79,7 @@ static void conf_changed(void);
|
||||||
|
|
||||||
/* Helping/Debugging Functions */
|
/* Helping/Debugging Functions */
|
||||||
|
|
||||||
|
const char *dbg_sym_flags(int val)
|
||||||
const char *dbg_print_stype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == S_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == S_BOOLEAN)
|
|
||||||
strcpy(buf, "boolean");
|
|
||||||
if (val == S_TRISTATE)
|
|
||||||
strcpy(buf, "tristate");
|
|
||||||
if (val == S_INT)
|
|
||||||
strcpy(buf, "int");
|
|
||||||
if (val == S_HEX)
|
|
||||||
strcpy(buf, "hex");
|
|
||||||
if (val == S_STRING)
|
|
||||||
strcpy(buf, "string");
|
|
||||||
if (val == S_OTHER)
|
|
||||||
strcpy(buf, "other");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dbg_print_flags(int val)
|
|
||||||
{
|
{
|
||||||
static char buf[256];
|
static char buf[256];
|
||||||
|
|
||||||
|
@ -131,40 +105,10 @@ const char *dbg_print_flags(int val)
|
||||||
strcat(buf, "auto/");
|
strcat(buf, "auto/");
|
||||||
|
|
||||||
buf[strlen(buf) - 1] = '\0';
|
buf[strlen(buf) - 1] = '\0';
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *dbg_print_ptype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == P_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == P_PROMPT)
|
|
||||||
strcpy(buf, "prompt");
|
|
||||||
if (val == P_COMMENT)
|
|
||||||
strcpy(buf, "comment");
|
|
||||||
if (val == P_MENU)
|
|
||||||
strcpy(buf, "menu");
|
|
||||||
if (val == P_DEFAULT)
|
|
||||||
strcpy(buf, "default");
|
|
||||||
if (val == P_CHOICE)
|
|
||||||
strcpy(buf, "choice");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
||||||
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
||||||
{
|
{
|
||||||
|
@ -697,20 +641,29 @@ void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_all = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
gtk_tree_store_clear(tree2);
|
gtk_tree_store_clear(tree2);
|
||||||
display_tree(&rootmenu); // instead of update_tree to speed-up
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_ALL;
|
||||||
update_tree(&rootmenu, NULL);
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
|
{
|
||||||
|
opt_mode = OPT_PROMPT;
|
||||||
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1163,7 +1116,10 @@ static gchar **fill_row(struct menu *menu)
|
||||||
g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
|
g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
|
||||||
sym && sym_has_value(sym) ? "(NEW)" : "");
|
sym && sym_has_value(sym) ? "(NEW)" : "");
|
||||||
|
|
||||||
if (show_all && !menu_is_visible(menu))
|
if (opt_mode == OPT_ALL && !menu_is_visible(menu))
|
||||||
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
|
else if (opt_mode == OPT_PROMPT &&
|
||||||
|
menu_has_prompt(menu) && !menu_is_visible(menu))
|
||||||
row[COL_COLOR] = g_strdup("DarkGray");
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
else
|
else
|
||||||
row[COL_COLOR] = g_strdup("Black");
|
row[COL_COLOR] = g_strdup("Black");
|
||||||
|
@ -1386,16 +1342,19 @@ static void update_tree(struct menu *src, GtkTreeIter * dst)
|
||||||
menu2 ? menu_get_prompt(menu2) : "nil");
|
menu2 ? menu_get_prompt(menu2) : "nil");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!menu_is_visible(child1) && !show_all) { // remove node
|
if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && !menu_has_prompt(child1))) {
|
||||||
|
|
||||||
|
/* remove node */
|
||||||
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
||||||
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
||||||
valid = gtk_tree_model_iter_next(model2,
|
valid = gtk_tree_model_iter_next(model2,
|
||||||
child2);
|
child2);
|
||||||
gtk_tree_store_remove(tree2, &tmp);
|
gtk_tree_store_remove(tree2, &tmp);
|
||||||
if (!valid)
|
if (!valid)
|
||||||
return; // next parent
|
return; /* next parent */
|
||||||
else
|
else
|
||||||
goto reparse; // next child
|
goto reparse; /* next child */
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1464,17 +1423,19 @@ static void display_tree(struct menu *menu)
|
||||||
&& (tree == tree2))
|
&& (tree == tree2))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (menu_is_visible(child) || show_all)
|
if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
|
||||||
|
(opt_mode == OPT_ALL))
|
||||||
place_node(child, fill_row(child));
|
place_node(child, fill_row(child));
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
||||||
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
||||||
dbg_print_ptype(ptype);
|
printf("%s", prop_get_type_name(ptype));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
if (sym) {
|
if (sym) {
|
||||||
dbg_print_stype(sym->type);
|
printf("%s", sym_type_name(sym->type));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
dbg_print_flags(sym->flags);
|
printf("%s", dbg_sym_flags(sym->flags));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else
|
} else
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
|
@ -190,26 +190,40 @@
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_all_options1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Show normal options</property>
|
||||||
|
<property name="label" translatable="yes">Show normal options</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode1_activate"/>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkRadioMenuItem" id="set_option_mode2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show all options</property>
|
<property name="tooltip" translatable="yes">Show all options</property>
|
||||||
<property name="label" translatable="yes">Show all _options</property>
|
<property name="label" translatable="yes">Show all _options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_all_options1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode2_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_debug_info1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show masked options</property>
|
<property name="tooltip" translatable="yes">Show all options with prompts</property>
|
||||||
<property name="label" translatable="yes">Show _debug info</property>
|
<property name="label" translatable="yes">Show all prompt options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_debug_info1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode3_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
|
@ -84,7 +84,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||||
void kconfig_load(void);
|
void kconfig_load(void);
|
||||||
|
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
void menu_init(void);
|
void _menu_init(void);
|
||||||
void menu_warn(struct menu *menu, const char *fmt, ...);
|
void menu_warn(struct menu *menu, const char *fmt, ...);
|
||||||
struct menu *menu_add_menu(void);
|
struct menu *menu_add_menu(void);
|
||||||
void menu_end_menu(void);
|
void menu_end_menu(void);
|
||||||
|
@ -106,6 +106,11 @@ int file_write_dep(const char *name);
|
||||||
struct gstr {
|
struct gstr {
|
||||||
size_t len;
|
size_t len;
|
||||||
char *s;
|
char *s;
|
||||||
|
/*
|
||||||
|
* when max_width is not zero long lines in string s (if any) get
|
||||||
|
* wrapped not to exceed the max_width value
|
||||||
|
*/
|
||||||
|
int max_width;
|
||||||
};
|
};
|
||||||
struct gstr str_new(void);
|
struct gstr str_new(void);
|
||||||
struct gstr str_assign(const char *s);
|
struct gstr str_assign(const char *s);
|
||||||
|
|
|
@ -11,13 +11,15 @@ P(conf_set_changed_callback, void,(void (*fn)(void)));
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
P(rootmenu,struct menu,);
|
P(rootmenu,struct menu,);
|
||||||
|
|
||||||
P(menu_is_visible,bool,(struct menu *menu));
|
P(menu_is_visible, bool, (struct menu *menu));
|
||||||
|
P(menu_has_prompt, bool, (struct menu *menu));
|
||||||
P(menu_get_prompt,const char *,(struct menu *menu));
|
P(menu_get_prompt,const char *,(struct menu *menu));
|
||||||
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
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(get_symbol_str, void, (struct gstr *r, struct symbol *sym));
|
||||||
|
P(get_relations_str, struct gstr, (struct symbol **sym_arr));
|
||||||
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
|
|
|
@ -180,7 +180,7 @@ do_resize:
|
||||||
case KEY_LEFT:
|
case KEY_LEFT:
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case -1:
|
case -1:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -204,7 +204,7 @@ do_resize:
|
||||||
print_buttons(dialog, height, width, 0);
|
print_buttons(dialog, height, width, 0);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -383,6 +383,10 @@ do_resize:
|
||||||
case 'n':
|
case 'n':
|
||||||
case 'm':
|
case 'm':
|
||||||
case '/':
|
case '/':
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
case 'z':
|
||||||
|
case '\n':
|
||||||
/* save scroll info */
|
/* save scroll info */
|
||||||
*s_scroll = scroll;
|
*s_scroll = scroll;
|
||||||
delwin(menu);
|
delwin(menu);
|
||||||
|
@ -390,8 +394,10 @@ do_resize:
|
||||||
item_set(scroll + choice);
|
item_set(scroll + choice);
|
||||||
item_set_selected(1);
|
item_set_selected(1);
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
return 2;
|
||||||
case 's':
|
case 's':
|
||||||
return 3;
|
|
||||||
case 'y':
|
case 'y':
|
||||||
return 3;
|
return 3;
|
||||||
case 'n':
|
case 'n':
|
||||||
|
@ -402,18 +408,12 @@ do_resize:
|
||||||
return 6;
|
return 6;
|
||||||
case '/':
|
case '/':
|
||||||
return 7;
|
return 7;
|
||||||
|
case 'z':
|
||||||
|
return 8;
|
||||||
|
case '\n':
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case 'h':
|
|
||||||
case '?':
|
|
||||||
button = 2;
|
|
||||||
case '\n':
|
|
||||||
*s_scroll = scroll;
|
|
||||||
delwin(menu);
|
|
||||||
delwin(dialog);
|
|
||||||
item_set(scroll + choice);
|
|
||||||
item_set_selected(1);
|
|
||||||
return button;
|
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'x':
|
case 'x':
|
||||||
key = KEY_ESC;
|
key = KEY_ESC;
|
||||||
|
|
|
@ -67,13 +67,15 @@ static const char mconf_readme[] = N_(
|
||||||
" there is a delayed response which you may find annoying.\n"
|
" there is a delayed response which you may find annoying.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
||||||
" <Exit> and <Help>\n"
|
" <Exit> and <Help>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
||||||
" and Press <ENTER>.\n"
|
" and press <ENTER>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Shortcut: Press <H> or <?>.\n"
|
" Shortcut: Press <H> or <?>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"o To show hidden options, press <Z>.\n"
|
||||||
|
"\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Radiolists (Choice lists)\n"
|
"Radiolists (Choice lists)\n"
|
||||||
"-----------\n"
|
"-----------\n"
|
||||||
|
@ -272,6 +274,7 @@ static int indent;
|
||||||
static struct menu *current_menu;
|
static struct menu *current_menu;
|
||||||
static int child_count;
|
static int child_count;
|
||||||
static int single_menu_mode;
|
static int single_menu_mode;
|
||||||
|
static int show_all_options;
|
||||||
|
|
||||||
static void conf(struct menu *menu);
|
static void conf(struct menu *menu);
|
||||||
static void conf_choice(struct menu *menu);
|
static void conf_choice(struct menu *menu);
|
||||||
|
@ -282,19 +285,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 struct gstr get_relations_str(struct symbol **sym_arr)
|
|
||||||
{
|
|
||||||
struct symbol *sym;
|
|
||||||
struct gstr res = str_new();
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
|
||||||
get_symbol_str(&res, sym);
|
|
||||||
if (!i)
|
|
||||||
str_append(&res, _("No matches found.\n"));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char filename[PATH_MAX+1];
|
static char filename[PATH_MAX+1];
|
||||||
static void set_config_filename(const char *config_filename)
|
static void set_config_filename(const char *config_filename)
|
||||||
{
|
{
|
||||||
|
@ -359,8 +349,16 @@ static void build_conf(struct menu *menu)
|
||||||
int type, tmp, doint = 2;
|
int type, tmp, doint = 2;
|
||||||
tristate val;
|
tristate val;
|
||||||
char ch;
|
char ch;
|
||||||
|
bool visible;
|
||||||
|
|
||||||
if (!menu_is_visible(menu))
|
/*
|
||||||
|
* note: menu_is_visible() has side effect that it will
|
||||||
|
* recalc the value of the symbol.
|
||||||
|
*/
|
||||||
|
visible = menu_is_visible(menu);
|
||||||
|
if (show_all_options && !menu_has_prompt(menu))
|
||||||
|
return;
|
||||||
|
else if (!show_all_options && !visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
|
@ -619,6 +617,9 @@ static void conf(struct menu *menu)
|
||||||
case 7:
|
case 7:
|
||||||
search_conf();
|
search_conf();
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
show_all_options = !show_all_options;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -638,6 +639,7 @@ static void show_help(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct gstr help = str_new();
|
struct gstr help = str_new();
|
||||||
|
|
||||||
|
help.max_width = getmaxx(stdscr) - 10;
|
||||||
menu_get_ext_help(menu, &help);
|
menu_get_ext_help(menu, &help);
|
||||||
|
|
||||||
show_helptext(_(menu_get_prompt(menu)), str_get(&help));
|
show_helptext(_(menu_get_prompt(menu)), str_get(&help));
|
||||||
|
|
|
@ -38,7 +38,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_init(void)
|
void _menu_init(void)
|
||||||
{
|
{
|
||||||
current_entry = current_menu = &rootmenu;
|
current_entry = current_menu = &rootmenu;
|
||||||
last_entry_ptr = &rootmenu.list;
|
last_entry_ptr = &rootmenu.list;
|
||||||
|
@ -197,7 +197,7 @@ static void sym_check_prop(struct symbol *sym)
|
||||||
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
||||||
prop->expr->type != E_SYMBOL)
|
prop->expr->type != E_SYMBOL)
|
||||||
prop_warn(prop,
|
prop_warn(prop,
|
||||||
"default for config symbol '%'"
|
"default for config symbol '%s'"
|
||||||
" must be a single symbol", sym->name);
|
" must be a single symbol", sym->name);
|
||||||
break;
|
break;
|
||||||
case P_SELECT:
|
case P_SELECT:
|
||||||
|
@ -390,6 +390,13 @@ void menu_finalize(struct menu *parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool menu_has_prompt(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (!menu->prompt)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool menu_is_visible(struct menu *menu)
|
bool menu_is_visible(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
|
@ -398,6 +405,7 @@ bool menu_is_visible(struct menu *menu)
|
||||||
|
|
||||||
if (!menu->prompt)
|
if (!menu->prompt)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
if (sym) {
|
if (sym) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
|
@ -407,12 +415,14 @@ bool menu_is_visible(struct menu *menu)
|
||||||
|
|
||||||
if (visible != no)
|
if (visible != no)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (child = menu->list; child; child = child->next)
|
for (child = menu->list; child; child = child->next)
|
||||||
if (menu_is_visible(child))
|
if (menu_is_visible(child))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,6 +525,20 @@ void get_symbol_str(struct gstr *r, struct symbol *sym)
|
||||||
str_append(r, "\n\n");
|
str_append(r, "\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct gstr get_relations_str(struct symbol **sym_arr)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct gstr res = str_new();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
||||||
|
get_symbol_str(&res, sym);
|
||||||
|
if (!i)
|
||||||
|
str_append(&res, _("No matches found.\n"));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void menu_get_ext_help(struct menu *menu, struct gstr *help)
|
void menu_get_ext_help(struct menu *menu, struct gstr *help)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
|
|
1568
scripts/kconfig/nconf.c
Normal file
1568
scripts/kconfig/nconf.c
Normal file
File diff suppressed because it is too large
Load diff
617
scripts/kconfig/nconf.gui.c
Normal file
617
scripts/kconfig/nconf.gui.c
Normal file
|
@ -0,0 +1,617 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "nconf.h"
|
||||||
|
|
||||||
|
/* a list of all the different widgets we use */
|
||||||
|
attributes_t attributes[ATTR_MAX+1] = {0};
|
||||||
|
|
||||||
|
/* available colors:
|
||||||
|
COLOR_BLACK 0
|
||||||
|
COLOR_RED 1
|
||||||
|
COLOR_GREEN 2
|
||||||
|
COLOR_YELLOW 3
|
||||||
|
COLOR_BLUE 4
|
||||||
|
COLOR_MAGENTA 5
|
||||||
|
COLOR_CYAN 6
|
||||||
|
COLOR_WHITE 7
|
||||||
|
*/
|
||||||
|
static void set_normal_colors(void)
|
||||||
|
{
|
||||||
|
init_pair(NORMAL, -1, -1);
|
||||||
|
init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
|
||||||
|
|
||||||
|
/* FORE is for the selected item */
|
||||||
|
init_pair(MAIN_MENU_FORE, -1, -1);
|
||||||
|
/* BACK for all the rest */
|
||||||
|
init_pair(MAIN_MENU_BACK, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_GREY, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(SCROLLWIN_TEXT, -1, -1);
|
||||||
|
init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(DIALOG_TEXT, -1, -1);
|
||||||
|
init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
|
||||||
|
|
||||||
|
init_pair(INPUT_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(INPUT_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(INPUT_TEXT, -1, -1);
|
||||||
|
init_pair(INPUT_FIELD, -1, -1);
|
||||||
|
|
||||||
|
init_pair(FUNCTION_HIGHLIGHT, -1, -1);
|
||||||
|
init_pair(FUNCTION_TEXT, COLOR_BLUE, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* available attributes:
|
||||||
|
A_NORMAL Normal display (no highlight)
|
||||||
|
A_STANDOUT Best highlighting mode of the terminal.
|
||||||
|
A_UNDERLINE Underlining
|
||||||
|
A_REVERSE Reverse video
|
||||||
|
A_BLINK Blinking
|
||||||
|
A_DIM Half bright
|
||||||
|
A_BOLD Extra bright or bold
|
||||||
|
A_PROTECT Protected mode
|
||||||
|
A_INVIS Invisible or blank mode
|
||||||
|
A_ALTCHARSET Alternate character set
|
||||||
|
A_CHARTEXT Bit-mask to extract a character
|
||||||
|
COLOR_PAIR(n) Color-pair number n
|
||||||
|
*/
|
||||||
|
static void normal_color_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add color... */
|
||||||
|
#define mkattr(name, attr) do { \
|
||||||
|
attributes[name] = attr | COLOR_PAIR(name); } while (0)
|
||||||
|
mkattr(NORMAL, NORMAL);
|
||||||
|
mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(MAIN_MENU_FORE, A_REVERSE);
|
||||||
|
mkattr(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattr(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattr(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattr(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattr(DIALOG_TEXT, A_BOLD);
|
||||||
|
mkattr(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattr(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattr(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(INPUT_BOX, A_NORMAL);
|
||||||
|
mkattr(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattr(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattr(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattr(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void no_colors_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add highlight, no color */
|
||||||
|
#define mkattrn(name, attr) { attributes[name] = attr; }
|
||||||
|
|
||||||
|
mkattrn(NORMAL, NORMAL);
|
||||||
|
mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(MAIN_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattrn(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattrn(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattrn(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattrn(DIALOG_TEXT, A_NORMAL);
|
||||||
|
mkattrn(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(INPUT_BOX, A_BOLD);
|
||||||
|
mkattrn(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattrn(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattrn(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattrn(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_colors()
|
||||||
|
{
|
||||||
|
start_color();
|
||||||
|
use_default_colors();
|
||||||
|
set_normal_colors();
|
||||||
|
if (has_colors()) {
|
||||||
|
normal_color_theme();
|
||||||
|
} else {
|
||||||
|
/* give deafults */
|
||||||
|
no_colors_theme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color)
|
||||||
|
{ int length, x, y;
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
|
||||||
|
if (win == NULL)
|
||||||
|
win = stdscr;
|
||||||
|
getyx(win, y, x);
|
||||||
|
if (startx != 0)
|
||||||
|
x = startx;
|
||||||
|
if (starty != 0)
|
||||||
|
y = starty;
|
||||||
|
if (width == 0)
|
||||||
|
width = 80;
|
||||||
|
|
||||||
|
length = strlen(string);
|
||||||
|
temp = (width - length) / 2;
|
||||||
|
x = startx + (int)temp;
|
||||||
|
wattrset(win, color);
|
||||||
|
mvwprintw(win, y, x, "%s", string);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_no(const char *text)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int total = 1;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0'; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
total++;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *get_line(const char *text, int line_no)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int lines = 0;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0' && lines < line_no; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
lines++;
|
||||||
|
return text+i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_length(const char *line)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
while (*line != '\0' && *line != '\n') {
|
||||||
|
line++;
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print all lines to the window. */
|
||||||
|
void fill_window(WINDOW *win, const char *text)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
getmaxyx(win, y, x);
|
||||||
|
/* do not go over end of line */
|
||||||
|
total_lines = min(total_lines, y);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
char tmp[x+10];
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
strncpy(tmp, line, min(len, x));
|
||||||
|
tmp[len] = '\0';
|
||||||
|
mvwprintw(win, i, 0, tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the message, and buttons.
|
||||||
|
* each button must be a char*
|
||||||
|
* return the selected button
|
||||||
|
*
|
||||||
|
* this dialog is used for 2 different things:
|
||||||
|
* 1) show a text box, no buttons.
|
||||||
|
* 2) show a dialog, with horizontal buttons
|
||||||
|
*/
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char *btn;
|
||||||
|
int btns_width = 0;
|
||||||
|
int msg_lines = 0;
|
||||||
|
int msg_width = 0;
|
||||||
|
int total_width;
|
||||||
|
int win_rows = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *msg_win;
|
||||||
|
WINDOW *menu_win;
|
||||||
|
MENU *menu;
|
||||||
|
ITEM *btns[btn_num+1];
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
|
||||||
|
va_start(ap, btn_num);
|
||||||
|
for (i = 0; i < btn_num; i++) {
|
||||||
|
btn = va_arg(ap, char *);
|
||||||
|
btns[i] = new_item(btn, "");
|
||||||
|
btns_width += strlen(btn)+1;
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
btns[btn_num] = NULL;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
msg_lines = get_line_no(msg);
|
||||||
|
for (i = 0; i < msg_lines; i++) {
|
||||||
|
const char *line = get_line(msg, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
if (msg_width < len)
|
||||||
|
msg_width = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_width = max(msg_width, btns_width);
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(msg_lines+4))/2;
|
||||||
|
x = (COLS-(total_width+4))/2;
|
||||||
|
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
if (btn_num > 0)
|
||||||
|
win_rows = msg_lines+4;
|
||||||
|
else
|
||||||
|
win_rows = msg_lines+2;
|
||||||
|
|
||||||
|
win = newwin(win_rows, total_width+4, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
menu_win = derwin(win, 1, btns_width, win_rows-2,
|
||||||
|
1+(total_width+2-btns_width)/2);
|
||||||
|
menu = new_menu(btns);
|
||||||
|
msg_win = derwin(win, win_rows-2, msg_width, 1,
|
||||||
|
1+(total_width+2-msg_width)/2);
|
||||||
|
|
||||||
|
set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
|
||||||
|
set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[DIALOG_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(msg_win, attributes[DIALOG_TEXT]);
|
||||||
|
fill_window(msg_win, msg);
|
||||||
|
|
||||||
|
set_menu_win(menu, win);
|
||||||
|
set_menu_sub(menu, menu_win);
|
||||||
|
set_menu_format(menu, 1, btn_num);
|
||||||
|
menu_opts_off(menu, O_SHOWDESC);
|
||||||
|
menu_opts_off(menu, O_SHOWMATCH);
|
||||||
|
menu_opts_on(menu, O_ONEVALUE);
|
||||||
|
menu_opts_on(menu, O_NONCYCLIC);
|
||||||
|
set_menu_mark(menu, "");
|
||||||
|
post_menu(menu);
|
||||||
|
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(win))) {
|
||||||
|
switch (res) {
|
||||||
|
case KEY_LEFT:
|
||||||
|
menu_driver(menu, REQ_LEFT_ITEM);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
menu_driver(menu, REQ_RIGHT_ITEM);
|
||||||
|
break;
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case ' ':
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10 || res == ' ') {
|
||||||
|
res = item_index(current_item(menu));
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unpost_menu(menu);
|
||||||
|
free_menu(menu);
|
||||||
|
for (i = 0; i < btn_num; i++)
|
||||||
|
free_item(btns[i]);
|
||||||
|
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len)
|
||||||
|
{
|
||||||
|
int prompt_lines = 0;
|
||||||
|
int prompt_width = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *prompt_win;
|
||||||
|
WINDOW *form_win;
|
||||||
|
PANEL *panel;
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
int cursor_position = strlen(init);
|
||||||
|
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
prompt_lines = get_line_no(prompt);
|
||||||
|
for (i = 0; i < prompt_lines; i++) {
|
||||||
|
const char *line = get_line(prompt, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
prompt_width = max(prompt_width, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title)
|
||||||
|
prompt_width = max(prompt_width, strlen(title));
|
||||||
|
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(prompt_lines+4))/2;
|
||||||
|
x = (COLS-(prompt_width+4))/2;
|
||||||
|
|
||||||
|
strncpy(result, init, result_len);
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
win = newwin(prompt_lines+6, prompt_width+7, y, x);
|
||||||
|
prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
|
||||||
|
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
|
||||||
|
keypad(form_win, TRUE);
|
||||||
|
|
||||||
|
wattrset(form_win, attributes[INPUT_FIELD]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[INPUT_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[INPUT_HEADING]);
|
||||||
|
if (title)
|
||||||
|
mvwprintw(win, 0, 3, "%s", title);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(prompt_win, attributes[INPUT_TEXT]);
|
||||||
|
fill_window(prompt_win, prompt);
|
||||||
|
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
|
||||||
|
/* create panels */
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* show the cursor */
|
||||||
|
curs_set(1);
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(form_win))) {
|
||||||
|
int len = strlen(result);
|
||||||
|
switch (res) {
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case KEY_F(F_HELP):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
break;
|
||||||
|
case 127:
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
if (cursor_position > 0) {
|
||||||
|
memmove(&result[cursor_position-1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len-cursor_position+1);
|
||||||
|
cursor_position--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_DC:
|
||||||
|
if (cursor_position >= 0 && cursor_position < len) {
|
||||||
|
memmove(&result[cursor_position],
|
||||||
|
&result[cursor_position+1],
|
||||||
|
len-cursor_position+1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
if (cursor_position < len &&
|
||||||
|
cursor_position < min(result_len, prompt_width))
|
||||||
|
cursor_position++;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (cursor_position > 0)
|
||||||
|
cursor_position--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ((isgraph(res) || isspace(res)) &&
|
||||||
|
len-2 < result_len) {
|
||||||
|
/* insert the char at the proper position */
|
||||||
|
memmove(&result[cursor_position+1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len+1);
|
||||||
|
result[cursor_position] = res;
|
||||||
|
cursor_position++;
|
||||||
|
} else {
|
||||||
|
mvprintw(0, 0, "unknow key: %d\n", res);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wmove(form_win, 0, 0);
|
||||||
|
wclrtoeol(form_win);
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
wmove(form_win, 0, cursor_position);
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10) {
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
} else if (res == KEY_F(F_HELP)) {
|
||||||
|
res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide the cursor */
|
||||||
|
curs_set(0);
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(prompt_win);
|
||||||
|
delwin(form_win);
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* refresh all windows in the correct order */
|
||||||
|
void refresh_all_windows(WINDOW *main_window)
|
||||||
|
{
|
||||||
|
update_panels();
|
||||||
|
touchwin(main_window);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* layman's scrollable window... */
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int x, y;
|
||||||
|
int start_x = 0, start_y = 0;
|
||||||
|
int text_lines = 0, text_cols = 0;
|
||||||
|
int total_cols = 0;
|
||||||
|
int win_cols = 0;
|
||||||
|
int win_lines = 0;
|
||||||
|
int i = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *pad;
|
||||||
|
PANEL *panel;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
total_lines = get_line_no(text);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
total_cols = max(total_cols, len+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the pad */
|
||||||
|
pad = newpad(total_lines+10, total_cols+10);
|
||||||
|
wattrset(pad, attributes[SCROLLWIN_TEXT]);
|
||||||
|
fill_window(pad, text);
|
||||||
|
|
||||||
|
win_lines = min(total_lines+4, LINES-2);
|
||||||
|
win_cols = min(total_cols+2, COLS-2);
|
||||||
|
text_lines = max(win_lines-4, 0);
|
||||||
|
text_cols = max(win_cols-2, 0);
|
||||||
|
|
||||||
|
/* place window in middle of screen */
|
||||||
|
y = (LINES-win_lines)/2;
|
||||||
|
x = (COLS-win_cols)/2;
|
||||||
|
|
||||||
|
win = newwin(win_lines, win_cols, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
/* show the help in the help window, and show the help panel */
|
||||||
|
wattrset(win, attributes[SCROLLWIN_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[SCROLLWIN_HEADING]);
|
||||||
|
mvwprintw(win, 0, 3, " %s ", title);
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* handle scrolling */
|
||||||
|
do {
|
||||||
|
|
||||||
|
copywin(pad, win, start_y, start_x, 2, 2, text_lines,
|
||||||
|
text_cols, 0);
|
||||||
|
print_in_middle(win,
|
||||||
|
text_lines+2,
|
||||||
|
0,
|
||||||
|
text_cols,
|
||||||
|
"<OK>",
|
||||||
|
attributes[DIALOG_MENU_FORE]);
|
||||||
|
wrefresh(win);
|
||||||
|
|
||||||
|
res = wgetch(win);
|
||||||
|
switch (res) {
|
||||||
|
case KEY_NPAGE:
|
||||||
|
case ' ':
|
||||||
|
start_y += text_lines-2;
|
||||||
|
break;
|
||||||
|
case KEY_PPAGE:
|
||||||
|
start_y -= text_lines+2;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
start_y = 0;
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case 'j':
|
||||||
|
start_y++;
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case 'k':
|
||||||
|
start_y--;
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
case 'h':
|
||||||
|
start_x--;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
case 'l':
|
||||||
|
start_x++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (res == 10 || res == 27 || res == 'q'
|
||||||
|
|| res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (start_y < 0)
|
||||||
|
start_y = 0;
|
||||||
|
if (start_y >= total_lines-text_lines)
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
if (start_x < 0)
|
||||||
|
start_x = 0;
|
||||||
|
if (start_x >= total_cols-text_cols)
|
||||||
|
start_x = total_cols-text_cols;
|
||||||
|
} while (res);
|
||||||
|
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
}
|
95
scripts/kconfig/nconf.h
Normal file
95
scripts/kconfig/nconf.h
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <curses.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <panel.h>
|
||||||
|
#include <form.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "ncurses.h"
|
||||||
|
|
||||||
|
#define max(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a > _b ? _a : _b; })
|
||||||
|
|
||||||
|
#define min(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a < _b ? _a : _b; })
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NORMAL = 1,
|
||||||
|
MAIN_HEADING,
|
||||||
|
MAIN_MENU_BOX,
|
||||||
|
MAIN_MENU_FORE,
|
||||||
|
MAIN_MENU_BACK,
|
||||||
|
MAIN_MENU_GREY,
|
||||||
|
MAIN_MENU_HEADING,
|
||||||
|
SCROLLWIN_TEXT,
|
||||||
|
SCROLLWIN_HEADING,
|
||||||
|
SCROLLWIN_BOX,
|
||||||
|
DIALOG_TEXT,
|
||||||
|
DIALOG_MENU_FORE,
|
||||||
|
DIALOG_MENU_BACK,
|
||||||
|
DIALOG_BOX,
|
||||||
|
INPUT_BOX,
|
||||||
|
INPUT_HEADING,
|
||||||
|
INPUT_TEXT,
|
||||||
|
INPUT_FIELD,
|
||||||
|
FUNCTION_TEXT,
|
||||||
|
FUNCTION_HIGHLIGHT,
|
||||||
|
ATTR_MAX
|
||||||
|
} attributes_t;
|
||||||
|
extern attributes_t attributes[];
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
F_HELP = 1,
|
||||||
|
F_SYMBOL = 2,
|
||||||
|
F_INSTS = 3,
|
||||||
|
F_CONF = 4,
|
||||||
|
F_BACK = 5,
|
||||||
|
F_SAVE = 6,
|
||||||
|
F_LOAD = 7,
|
||||||
|
F_EXIT = 8
|
||||||
|
} function_key;
|
||||||
|
|
||||||
|
void set_colors(void);
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color);
|
||||||
|
int get_line_length(const char *line);
|
||||||
|
int get_line_no(const char *text);
|
||||||
|
const char *get_line(const char *text, int line_no);
|
||||||
|
void fill_window(WINDOW *win, const char *text);
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...);
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len);
|
||||||
|
void refresh_all_windows(WINDOW *main_window);
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text);
|
|
@ -651,12 +651,20 @@ bool sym_is_changable(struct symbol *sym)
|
||||||
return sym->visible > sym->rev_dep.tri;
|
return sym->visible > sym->rev_dep.tri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned strhash(const char *s)
|
||||||
|
{
|
||||||
|
/* fnv32 hash */
|
||||||
|
unsigned hash = 2166136261U;
|
||||||
|
for (; *s; s++)
|
||||||
|
hash = (hash ^ *s) * 0x01000193;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
struct symbol *sym_lookup(const char *name, int flags)
|
struct symbol *sym_lookup(const char *name, int flags)
|
||||||
{
|
{
|
||||||
struct symbol *symbol;
|
struct symbol *symbol;
|
||||||
const char *ptr;
|
|
||||||
char *new_name;
|
char *new_name;
|
||||||
int hash = 0;
|
int hash;
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
if (name[0] && !name[1]) {
|
if (name[0] && !name[1]) {
|
||||||
|
@ -666,12 +674,11 @@ struct symbol *sym_lookup(const char *name, int flags)
|
||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name) &&
|
if (symbol->name &&
|
||||||
|
!strcmp(symbol->name, name) &&
|
||||||
(flags ? symbol->flags & flags
|
(flags ? symbol->flags & flags
|
||||||
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
||||||
return symbol;
|
return symbol;
|
||||||
|
@ -679,7 +686,7 @@ struct symbol *sym_lookup(const char *name, int flags)
|
||||||
new_name = strdup(name);
|
new_name = strdup(name);
|
||||||
} else {
|
} else {
|
||||||
new_name = NULL;
|
new_name = NULL;
|
||||||
hash = 256;
|
hash = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol = malloc(sizeof(*symbol));
|
symbol = malloc(sizeof(*symbol));
|
||||||
|
@ -697,7 +704,6 @@ struct symbol *sym_lookup(const char *name, int flags)
|
||||||
struct symbol *sym_find(const char *name)
|
struct symbol *sym_find(const char *name)
|
||||||
{
|
{
|
||||||
struct symbol *symbol = NULL;
|
struct symbol *symbol = NULL;
|
||||||
const char *ptr;
|
|
||||||
int hash = 0;
|
int hash = 0;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
|
@ -710,12 +716,11 @@ struct symbol *sym_find(const char *name)
|
||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name) &&
|
if (symbol->name &&
|
||||||
|
!strcmp(symbol->name, name) &&
|
||||||
!(symbol->flags & SYMBOL_CONST))
|
!(symbol->flags & SYMBOL_CONST))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -750,6 +755,7 @@ struct symbol **sym_re_search(const char *pattern)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sym_calc_value(sym);
|
||||||
sym_arr[cnt++] = sym;
|
sym_arr[cnt++] = sym;
|
||||||
}
|
}
|
||||||
if (sym_arr)
|
if (sym_arr)
|
||||||
|
|
|
@ -78,6 +78,7 @@ struct gstr str_new(void)
|
||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = malloc(sizeof(char) * 64);
|
gs.s = malloc(sizeof(char) * 64);
|
||||||
gs.len = 64;
|
gs.len = 64;
|
||||||
|
gs.max_width = 0;
|
||||||
strcpy(gs.s, "\0");
|
strcpy(gs.s, "\0");
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
@ -88,6 +89,7 @@ struct gstr str_assign(const char *s)
|
||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = strdup(s);
|
gs.s = strdup(s);
|
||||||
gs.len = strlen(s) + 1;
|
gs.len = strlen(s) + 1;
|
||||||
|
gs.max_width = 0;
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ static void zconf_error(const char *err, ...);
|
||||||
static void zconferror(const char *err);
|
static void zconferror(const char *err);
|
||||||
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
||||||
|
|
||||||
struct symbol *symbol_hash[257];
|
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
|
||||||
|
|
||||||
static struct menu *current_menu, *current_entry;
|
static struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
|
@ -2220,7 +2220,7 @@ void conf_parse(const char *name)
|
||||||
zconf_initscan(name);
|
zconf_initscan(name);
|
||||||
|
|
||||||
sym_init();
|
sym_init();
|
||||||
menu_init();
|
_menu_init();
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
modules_sym->type = S_BOOLEAN;
|
modules_sym->type = S_BOOLEAN;
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
|
@ -2336,9 +2336,9 @@ static void print_symbol(FILE *out, struct menu *menu)
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
if (sym_is_choice(sym))
|
if (sym_is_choice(sym))
|
||||||
fprintf(out, "choice\n");
|
fprintf(out, "\nchoice\n");
|
||||||
else
|
else
|
||||||
fprintf(out, "config %s\n", sym->name);
|
fprintf(out, "\nconfig %s\n", sym->name);
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
fputs(" boolean\n", out);
|
fputs(" boolean\n", out);
|
||||||
|
@ -2384,6 +2384,21 @@ static void print_symbol(FILE *out, struct menu *menu)
|
||||||
case P_CHOICE:
|
case P_CHOICE:
|
||||||
fputs(" #choice value\n", out);
|
fputs(" #choice value\n", out);
|
||||||
break;
|
break;
|
||||||
|
case P_SELECT:
|
||||||
|
fputs( " select ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_RANGE:
|
||||||
|
fputs( " range ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_MENU:
|
||||||
|
fputs( " menu ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(out, " unknown prop %d!\n", prop->type);
|
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||||
break;
|
break;
|
||||||
|
@ -2395,7 +2410,6 @@ static void print_symbol(FILE *out, struct menu *menu)
|
||||||
menu->help[len] = 0;
|
menu->help[len] = 0;
|
||||||
fprintf(out, " help\n%s\n", menu->help);
|
fprintf(out, " help\n%s\n", menu->help);
|
||||||
}
|
}
|
||||||
fputc('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void zconfdump(FILE *out)
|
void zconfdump(FILE *out)
|
||||||
|
@ -2428,7 +2442,6 @@ void zconfdump(FILE *out)
|
||||||
expr_fprint(prop->visible.expr, out);
|
expr_fprint(prop->visible.expr, out);
|
||||||
fputc('\n', out);
|
fputc('\n', out);
|
||||||
}
|
}
|
||||||
fputs("\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu->list)
|
if (menu->list)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue