mirror of https://gitee.com/openkylin/linux.git
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
|
@ -28,6 +28,7 @@ modules.builtin
|
|||
*.gz
|
||||
*.bz2
|
||||
*.lzma
|
||||
*.lzo
|
||||
*.patch
|
||||
*.gcno
|
||||
|
||||
|
|
|
@ -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.
|
||||
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
|
||||
--------------------------------------------------
|
||||
|
@ -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.:
|
||||
|
||||
$ 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: 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
|
||||
|
||||
the unlocking fastpath is equally tight:
|
||||
|
||||
c0377cd1 <mutex_unlock>:
|
||||
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
|
||||
|
||||
- 'struct mutex' semantics are well-defined and are enforced if
|
||||
|
|
|
@ -3242,7 +3242,7 @@ L: autofs@linux.kernel.org
|
|||
S: Maintained
|
||||
F: fs/autofs4/
|
||||
|
||||
KERNEL BUILD
|
||||
KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
|
||||
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-linus
|
||||
|
@ -3251,6 +3251,9 @@ S: Maintained
|
|||
F: Documentation/kbuild/
|
||||
F: Makefile
|
||||
F: scripts/Makefile.*
|
||||
F: scripts/basic/
|
||||
F: scripts/mk*
|
||||
F: scripts/package/
|
||||
|
||||
KERNEL JANITORS
|
||||
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
|
||||
# make CROSS_COMPILE=ia64-linux-
|
||||
# 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
|
||||
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
|
||||
export KBUILD_BUILDHOST := $(SUBARCH)
|
||||
ARCH ?= $(SUBARCH)
|
||||
CROSS_COMPILE ?=
|
||||
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
|
||||
|
||||
# Architecture as present in compile.h
|
||||
UTS_MACHINE := $(ARCH)
|
||||
|
@ -576,9 +579,6 @@ KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
|||
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||
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
|
||||
KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)
|
||||
|
||||
|
@ -882,9 +882,6 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
|||
PHONY += $(vmlinux-dirs)
|
||||
$(vmlinux-dirs): prepare scripts
|
||||
$(Q)$(MAKE) $(build)=$@
|
||||
ifdef CONFIG_MODULES
|
||||
$(Q)$(MAKE) $(modbuiltin)=$@
|
||||
endif
|
||||
|
||||
# Build the kernel release string
|
||||
#
|
||||
|
@ -907,14 +904,19 @@ endif
|
|||
# $(localver)
|
||||
# localversion* (files without backups, containing '~')
|
||||
# $(CONFIG_LOCALVERSION) (from kernel config setting)
|
||||
# $(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
|
||||
# ./scripts/setlocalversion (SCM tag, if one exists)
|
||||
# $(LOCALVERSION) (from make command line if provided)
|
||||
# $(LOCALVERSION) (from make command line, if provided)
|
||||
# $(localver-extra)
|
||||
# $(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
|
||||
# kernel config option CONFIG_LOCALVERSION_AUTO is selected. Also, at the
|
||||
# moment, only git is supported but other SCMs can edit the script
|
||||
# scripts/setlocalversion and add the appropriate checks as needed.
|
||||
# For kernels without CONFIG_LOCALVERSION_AUTO compiled from an SCM that has
|
||||
# been revised beyond a tagged commit, `+' is appended to the version string
|
||||
# when not overridden by using "make LOCALVERSION=". This indicates that the
|
||||
# kernel is not a vanilla release version and has been modified.
|
||||
|
||||
pattern = ".*/localversion[^~]*"
|
||||
string = $(shell cat /dev/null \
|
||||
|
@ -923,26 +925,32 @@ string = $(shell cat /dev/null \
|
|||
localver = $(subst $(space),, $(string) \
|
||||
$(patsubst "%",%,$(CONFIG_LOCALVERSION)))
|
||||
|
||||
# If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
|
||||
# and if the SCM is know a tag from the SCM is appended.
|
||||
# The appended tag is determined by the SCM used.
|
||||
# scripts/setlocalversion is called to create a unique identifier if the source
|
||||
# is managed by a known SCM and the repository has been revised since the last
|
||||
# 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
|
||||
# the version information from the SCM when we do the build of the kernel
|
||||
# from the copied source
|
||||
ifdef CONFIG_LOCALVERSION_AUTO
|
||||
|
||||
ifeq ($(wildcard .scmversion),)
|
||||
_localver-auto = $(shell $(CONFIG_SHELL) \
|
||||
scm-identifier = $(shell $(CONFIG_SHELL) \
|
||||
$(srctree)/scripts/setlocalversion $(srctree))
|
||||
else
|
||||
_localver-auto = $(shell cat .scmversion 2> /dev/null)
|
||||
scm-identifier = $(shell cat .scmversion 2> /dev/null)
|
||||
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
|
||||
|
||||
localver-full = $(localver)$(localver-auto)
|
||||
localver-full = $(localver)$(LOCALVERSION)$(localver-extra)
|
||||
|
||||
# Store (new) KERNELRELASE string in include/config/kernel.release
|
||||
kernelrelease = $(KERNELVERSION)$(localver-full)
|
||||
|
@ -1089,11 +1097,16 @@ all: modules
|
|||
PHONY += modules
|
||||
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.builtin) > $(objtree)/modules.builtin
|
||||
@$(kecho) ' Building modules, stage 2.';
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
$(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
|
||||
PHONY += modules_prepare
|
||||
|
@ -1104,7 +1117,7 @@ PHONY += modules_install
|
|||
modules_install: _modinst_ _modinst_post
|
||||
|
||||
PHONY += _modinst_
|
||||
_modinst_:
|
||||
_modinst_: modules.builtin
|
||||
@if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
|
||||
echo "Warning: you may need to install module-init-tools"; \
|
||||
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 ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
||||
@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 ' modules_prepare - Set up for building external modules'
|
||||
@echo ' tags/TAGS - Generate tags file for editors'
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#
|
||||
# the break handler has its own stack
|
||||
#
|
||||
.section .bss.stack
|
||||
.section .bss..stack
|
||||
.globl __break_user_context
|
||||
.balign THREAD_SIZE
|
||||
__break_stack:
|
||||
|
@ -63,7 +63,7 @@ __break_trace_through_exceptions:
|
|||
# entry point for Break Exceptions/Interrupts
|
||||
#
|
||||
###############################################################################
|
||||
.section .text.break
|
||||
.section .text..break
|
||||
.balign 4
|
||||
.globl __entry_break
|
||||
__entry_break:
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
#define nr_syscalls ((syscall_table_size)/4)
|
||||
|
||||
.section .text.entry
|
||||
.section .text..entry
|
||||
.balign 4
|
||||
|
||||
.macro LEDS val
|
||||
|
|
|
@ -542,7 +542,7 @@ __head_end:
|
|||
.size _boot, .-_boot
|
||||
|
||||
# provide a point for GDB to place a break
|
||||
.section .text.start,"ax"
|
||||
.section .text..start,"ax"
|
||||
.globl _start
|
||||
.balign 4
|
||||
_start:
|
||||
|
|
|
@ -57,10 +57,10 @@ SECTIONS
|
|||
_text = .;
|
||||
_stext = .;
|
||||
.text : {
|
||||
*(.text.start)
|
||||
*(.text.entry)
|
||||
*(.text.break)
|
||||
*(.text.tlbmiss)
|
||||
*(.text..start)
|
||||
*(.text..entry)
|
||||
*(.text..break)
|
||||
*(.text..tlbmiss)
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
|
@ -114,7 +114,7 @@ SECTIONS
|
|||
|
||||
.sbss : { *(.sbss .sbss.*) }
|
||||
.bss : { *(.bss .bss.*) }
|
||||
.bss.stack : { *(.bss) }
|
||||
.bss..stack : { *(.bss) }
|
||||
|
||||
__bss_stop = .;
|
||||
_end = . ;
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <asm/pgtable.h>
|
||||
#include <asm/spr-regs.h>
|
||||
|
||||
.section .text.tlbmiss
|
||||
.section .text..tlbmiss
|
||||
.balign 4
|
||||
|
||||
.globl __entry_insn_mmu_miss
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
#define SRAM_START 0xff4000
|
||||
|
||||
.section .text.startup
|
||||
.section .text..startup
|
||||
.global startup
|
||||
startup:
|
||||
mov.l #SRAM_START+0x8000, sp
|
||||
|
|
|
@ -4,7 +4,7 @@ SECTIONS
|
|||
{
|
||||
__stext = . ;
|
||||
__text = .;
|
||||
*(.text.startup)
|
||||
*(.text..startup)
|
||||
*(.text)
|
||||
__etext = . ;
|
||||
}
|
||||
|
|
|
@ -70,12 +70,12 @@
|
|||
* 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).
|
||||
*/
|
||||
.section ".data.patch.vtop", "a" // declare section & section attributes
|
||||
.section ".data..patch.vtop", "a" // declare section & section attributes
|
||||
.previous
|
||||
|
||||
#define LOAD_PHYSICAL(pr, 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,
|
||||
|
@ -84,11 +84,11 @@
|
|||
#define DO_MCKINLEY_E9_WORKAROUND
|
||||
|
||||
#ifdef DO_MCKINLEY_E9_WORKAROUND
|
||||
.section ".data.patch.mckinley_e9", "a"
|
||||
.section ".data..patch.mckinley_e9", "a"
|
||||
.previous
|
||||
/* workaround for Itanium 2 Errata 9: */
|
||||
# define FSYS_RETURN \
|
||||
.xdata4 ".data.patch.mckinley_e9", 1f-.; \
|
||||
.xdata4 ".data..patch.mckinley_e9", 1f-.; \
|
||||
1:{ .mib; \
|
||||
nop.m 0; \
|
||||
mov r16=ar.pfs; \
|
||||
|
@ -107,11 +107,11 @@
|
|||
* If physical stack register size is different from DEF_NUM_STACK_REG,
|
||||
* dynamically patch the kernel for correct size.
|
||||
*/
|
||||
.section ".data.patch.phys_stack_reg", "a"
|
||||
.section ".data..patch.phys_stack_reg", "a"
|
||||
.previous
|
||||
#define LOAD_PHYS_STACK_REG_SIZE(reg) \
|
||||
[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.
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
# define SMP_CACHE_BYTES (1 << 3)
|
||||
#endif
|
||||
|
||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||
|
||||
#endif /* _ASM_IA64_CACHE_H */
|
||||
|
|
|
@ -31,7 +31,7 @@ extern void *per_cpu_init(void);
|
|||
|
||||
#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
|
||||
|
|
|
@ -21,7 +21,7 @@ GATECFLAGS_gate-syms.o = -r
|
|||
$(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE
|
||||
$(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.
|
||||
# Note: kbuild does not track this dependency due to usage of .incbin
|
||||
$(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"
|
||||
|
|
|
@ -21,18 +21,18 @@
|
|||
* to targets outside the shared object) and to avoid multi-phase kernel builds, we
|
||||
* simply create minimalistic "patch lists" in special ELF sections.
|
||||
*/
|
||||
.section ".data.patch.fsyscall_table", "a"
|
||||
.section ".data..patch.fsyscall_table", "a"
|
||||
.previous
|
||||
#define LOAD_FSYSCALL_TABLE(reg) \
|
||||
[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
|
||||
#define BRL_COND_FSYS_BUBBLE_DOWN(pr) \
|
||||
[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)
|
||||
.prologue
|
||||
|
|
|
@ -33,21 +33,21 @@ SECTIONS
|
|||
*/
|
||||
. = GATE_ADDR + 0x600;
|
||||
|
||||
.data.patch : {
|
||||
.data..patch : {
|
||||
__paravirt_start_gate_mckinley_e9_patchlist = .;
|
||||
*(.data.patch.mckinley_e9)
|
||||
*(.data..patch.mckinley_e9)
|
||||
__paravirt_end_gate_mckinley_e9_patchlist = .;
|
||||
|
||||
__paravirt_start_gate_vtop_patchlist = .;
|
||||
*(.data.patch.vtop)
|
||||
*(.data..patch.vtop)
|
||||
__paravirt_end_gate_vtop_patchlist = .;
|
||||
|
||||
__paravirt_start_gate_fsyscall_patchlist = .;
|
||||
*(.data.patch.fsyscall_table)
|
||||
*(.data..patch.fsyscall_table)
|
||||
__paravirt_end_gate_fsyscall_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 = .;
|
||||
} :readable
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
|||
* Initial task structure.
|
||||
*
|
||||
* 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
|
||||
|
||||
|
|
|
@ -82,7 +82,7 @@
|
|||
mov r19=n;; /* prepare to save predicates */ \
|
||||
br.sptk.many dispatch_to_fault_handler
|
||||
|
||||
.section .text.ivt,"ax"
|
||||
.section .text..ivt,"ax"
|
||||
|
||||
.align 32768 // align on 32KB boundary
|
||||
.global ia64_ivt
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#define ACCOUNT_SYS_ENTER
|
||||
#endif
|
||||
|
||||
.section ".data.patch.rse", "a"
|
||||
.section ".data..patch.rse", "a"
|
||||
.previous
|
||||
|
||||
/*
|
||||
|
@ -215,7 +215,7 @@
|
|||
(pUStk) extr.u r17=r18,3,6; \
|
||||
(pUStk) sub r16=r18,r22; \
|
||||
[1:](pKStk) br.cond.sptk.many 1f; \
|
||||
.xdata4 ".data.patch.rse",1b-. \
|
||||
.xdata4 ".data..patch.rse",1b-. \
|
||||
;; \
|
||||
cmp.ge p6,p7 = 33,r17; \
|
||||
;; \
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include "entry.h"
|
||||
|
||||
#define DATA8(sym, init_value) \
|
||||
.pushsection .data.read_mostly ; \
|
||||
.pushsection .data..read_mostly ; \
|
||||
.align 8 ; \
|
||||
.global sym ; \
|
||||
sym: ; \
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#define IVT_TEXT \
|
||||
VMLINUX_SYMBOL(__start_ivt_text) = .; \
|
||||
*(.text.ivt) \
|
||||
*(.text..ivt) \
|
||||
VMLINUX_SYMBOL(__end_ivt_text) = .;
|
||||
|
||||
OUTPUT_FORMAT("elf64-ia64-little")
|
||||
|
@ -54,8 +54,8 @@ SECTIONS
|
|||
.text2 : AT(ADDR(.text2) - LOAD_OFFSET)
|
||||
{ *(.text2) }
|
||||
#ifdef CONFIG_SMP
|
||||
.text.lock : AT(ADDR(.text.lock) - LOAD_OFFSET)
|
||||
{ *(.text.lock) }
|
||||
.text..lock : AT(ADDR(.text..lock) - LOAD_OFFSET)
|
||||
{ *(.text..lock) }
|
||||
#endif
|
||||
_etext = .;
|
||||
|
||||
|
@ -75,10 +75,10 @@ SECTIONS
|
|||
__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 = .;
|
||||
*(.data.patch.phys_stack_reg)
|
||||
*(.data..patch.phys_stack_reg)
|
||||
__end___phys_stack_reg_patchlist = .;
|
||||
}
|
||||
|
||||
|
@ -110,24 +110,24 @@ SECTIONS
|
|||
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||
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 = .;
|
||||
*(.data.patch.vtop)
|
||||
*(.data..patch.vtop)
|
||||
__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 = .;
|
||||
*(.data.patch.rse)
|
||||
*(.data..patch.rse)
|
||||
__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 = .;
|
||||
*(.data.patch.mckinley_e9)
|
||||
*(.data..patch.mckinley_e9)
|
||||
__end___mckinley_e9_bundles = .;
|
||||
}
|
||||
|
||||
|
@ -175,17 +175,17 @@ SECTIONS
|
|||
. = ALIGN(PAGE_SIZE);
|
||||
__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)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__start_gate_section = .;
|
||||
*(.data.gate)
|
||||
*(.data..gate)
|
||||
__stop_gate_section = .;
|
||||
#ifdef CONFIG_XEN
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__xen_start_gate_section = .;
|
||||
*(.data.gate.xen)
|
||||
*(.data..gate.xen)
|
||||
__xen_stop_gate_section = .;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -104,7 +104,7 @@ GLOBAL_ENTRY(kvm_vmm_panic)
|
|||
br.call.sptk.many b6=vmm_panic_handler;
|
||||
END(kvm_vmm_panic)
|
||||
|
||||
.section .text.ivt,"ax"
|
||||
.section .text..ivt,"ax"
|
||||
|
||||
.align 32768 // align on 32KB boundary
|
||||
.global kvm_ia64_ivt
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Usage: unwcheck.py FILE
|
||||
#
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
.section .data.gate.xen, "aw"
|
||||
.section .data..gate.xen, "aw"
|
||||
|
||||
.incbin "arch/ia64/xen/gate.so"
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <xen/interface/elfnote.h>
|
||||
|
||||
.section .data.read_mostly
|
||||
.section .data..read_mostly
|
||||
.align 8
|
||||
.global xen_domain_type
|
||||
xen_domain_type:
|
||||
|
|
|
@ -57,7 +57,7 @@ SECTIONS {
|
|||
.romvec : {
|
||||
__rom_start = . ;
|
||||
_romvec = .;
|
||||
*(.data.initvect)
|
||||
*(.data..initvect)
|
||||
} > romvec
|
||||
#endif
|
||||
|
||||
|
@ -68,7 +68,7 @@ SECTIONS {
|
|||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
*(.text.lock)
|
||||
*(.text..lock)
|
||||
|
||||
. = ALIGN(16); /* Exception table */
|
||||
__start___ex_table = .;
|
||||
|
|
|
@ -280,7 +280,7 @@ _dprbase:
|
|||
* and then overwritten as needed.
|
||||
*/
|
||||
|
||||
.section ".data.initvect","awx"
|
||||
.section ".data..initvect","awx"
|
||||
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
||||
.long _start /* Reset: Initial Program Counter - 1. */
|
||||
.long buserr /* Bus Error - 2. */
|
||||
|
|
|
@ -291,7 +291,7 @@ _dprbase:
|
|||
* and then overwritten as needed.
|
||||
*/
|
||||
|
||||
.section ".data.initvect","awx"
|
||||
.section ".data..initvect","awx"
|
||||
.long RAMEND /* Reset: Initial Stack Pointer - 0. */
|
||||
.long _start /* Reset: Initial Program Counter - 1. */
|
||||
.long buserr /* Bus Error - 2. */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include <asm/lasat/head.h>
|
||||
|
||||
.text
|
||||
.section .text.start, "ax"
|
||||
.section .text..start, "ax"
|
||||
.set noreorder
|
||||
.set mips3
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ SECTIONS
|
|||
{
|
||||
.text :
|
||||
{
|
||||
*(.text.start)
|
||||
*(.text..start)
|
||||
}
|
||||
|
||||
/* Data in ROM */
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#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 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
|
||||
# define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
|
||||
# define __lock_aligned __attribute__((__section__(".data..lock_aligned")))
|
||||
#endif
|
||||
|
||||
#define arch_align_stack(x) (x)
|
||||
|
|
|
@ -345,7 +345,7 @@ smp_slave_stext:
|
|||
ENDPROC(stext)
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
.section .data.read_mostly
|
||||
.section .data..read_mostly
|
||||
|
||||
.align 4
|
||||
.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
|
||||
* as the order of declaration, so put these in different sections and use
|
||||
* 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
|
||||
|
||||
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)));
|
||||
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)));
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
|
|
|
@ -94,8 +94,8 @@ SECTIONS
|
|||
|
||||
/* PA-RISC locks requires 16-byte alignment */
|
||||
. = ALIGN(16);
|
||||
.data.lock_aligned : {
|
||||
*(.data.lock_aligned)
|
||||
.data..lock_aligned : {
|
||||
*(.data..lock_aligned)
|
||||
}
|
||||
|
||||
/* End of data section */
|
||||
|
@ -105,10 +105,10 @@ SECTIONS
|
|||
__bss_start = .;
|
||||
/* page table entries need to be PAGE_SIZE aligned */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data.vmpages : {
|
||||
*(.data.vm0.pmd)
|
||||
*(.data.vm0.pgd)
|
||||
*(.data.vm0.pte)
|
||||
.data..vmpages : {
|
||||
*(.data..vm0.pmd)
|
||||
*(.data..vm0.pgd)
|
||||
*(.data..vm0.pte)
|
||||
}
|
||||
.bss : {
|
||||
*(.bss)
|
||||
|
|
|
@ -112,6 +112,11 @@ KBUILD_CFLAGS += $(call cc-option,-mspe=no)
|
|||
# kernel considerably.
|
||||
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
|
||||
# often slow when they are implemented at all
|
||||
KBUILD_CFLAGS += -mno-string
|
||||
|
|
|
@ -42,7 +42,7 @@ extern struct ppc64_caches ppc64_caches;
|
|||
#endif /* __powerpc64__ && ! __ASSEMBLY__ */
|
||||
|
||||
#if !defined(__ASSEMBLY__)
|
||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
@ -162,14 +162,6 @@ do { \
|
|||
|
||||
#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 \
|
||||
(test_thread_flag(TIF_32BIT) ? \
|
||||
VM_DATA_DEFAULT_FLAGS32 : VM_DATA_DEFAULT_FLAGS64)
|
||||
|
|
|
@ -223,19 +223,17 @@ SECTIONS
|
|||
#endif
|
||||
|
||||
/* The initial task and kernel stack */
|
||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
||||
INIT_TASK_DATA(THREAD_SIZE)
|
||||
}
|
||||
INIT_TASK_DATA_SECTION(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)
|
||||
}
|
||||
|
||||
.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)
|
||||
}
|
||||
|
||||
.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)
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,6 @@
|
|||
#define L1_CACHE_BYTES 256
|
||||
#define L1_CACHE_SHIFT 8
|
||||
|
||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||
|
||||
#endif
|
||||
|
|
|
@ -264,7 +264,7 @@ restore_registers:
|
|||
lghi %r2,0
|
||||
br %r14
|
||||
|
||||
.section .data.nosave,"aw",@progbits
|
||||
.section .data..nosave,"aw",@progbits
|
||||
.align 8
|
||||
.Ldisabled_wait_31:
|
||||
.long 0x000a0000,0x00000000
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
SECTIONS
|
||||
{
|
||||
.rodata.compressed : {
|
||||
.rodata..compressed : {
|
||||
input_len = .;
|
||||
LONG(input_data_end - input_data) input_data = .;
|
||||
*(.data)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#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__
|
||||
struct cache_info {
|
||||
|
|
|
@ -325,7 +325,7 @@ int main(int argc,char **argv)
|
|||
(*rr)->next = NULL;
|
||||
}
|
||||
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");
|
||||
for (i = 0; i < last; i++) {
|
||||
f = array + i;
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
#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
|
||||
#include <asm/asi.h>
|
||||
|
|
|
@ -94,7 +94,7 @@ SECTIONS
|
|||
.data : {
|
||||
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
||||
. = ALIGN(KERNEL_STACK_SIZE);
|
||||
*(.data.init_irqstack)
|
||||
*(.data..init_irqstack)
|
||||
DATA_DATA
|
||||
*(.data.* .gnu.linkonce.d.*)
|
||||
SORT(CONSTRUCTORS)
|
||||
|
|
|
@ -34,5 +34,5 @@ union thread_union init_thread_union __init_task_data =
|
|||
{ INIT_THREAD_INFO(init_task) };
|
||||
|
||||
union thread_union cpu0_irqstack
|
||||
__attribute__((__section__(".data.init_irqstack"))) =
|
||||
__attribute__((__section__(".data..init_irqstack"))) =
|
||||
{ INIT_THREAD_INFO(init_task) };
|
||||
|
|
|
@ -50,7 +50,7 @@ SECTIONS
|
|||
{
|
||||
INIT_TASK_DATA(KERNEL_STACK_SIZE)
|
||||
. = ALIGN(KERNEL_STACK_SIZE);
|
||||
*(.data.init_irqstack)
|
||||
*(.data..init_irqstack)
|
||||
DATA_DATA
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
|
|
|
@ -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 = (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("z_input_len = %lu\n", ilen);
|
||||
printf(".globl z_output_len\n");
|
||||
|
|
|
@ -26,8 +26,8 @@ SECTIONS
|
|||
HEAD_TEXT
|
||||
_ehead = . ;
|
||||
}
|
||||
.rodata.compressed : {
|
||||
*(.rodata.compressed)
|
||||
.rodata..compressed : {
|
||||
*(.rodata..compressed)
|
||||
}
|
||||
.text : {
|
||||
_text = .; /* Text */
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#define L1_CACHE_SHIFT (CONFIG_X86_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_BYTES (1 << INTERNODE_CACHE_SHIFT)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.section .text.page_aligned
|
||||
.section .text..page_aligned
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page_types.h>
|
||||
|
|
|
@ -34,7 +34,7 @@ EXPORT_SYMBOL(init_task);
|
|||
/*
|
||||
* per-CPU TSS segments. Threads are completely 'soft' on Linux,
|
||||
* 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
|
||||
* on exact cacheline boundaries, to eliminate cacheline ping-pong.
|
||||
*/
|
||||
|
|
|
@ -247,7 +247,7 @@ void __init setup_per_cpu_areas(void)
|
|||
#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.
|
||||
*/
|
||||
if (cpu == boot_cpu_id)
|
||||
|
|
|
@ -97,7 +97,7 @@ SECTIONS
|
|||
HEAD_TEXT
|
||||
#ifdef CONFIG_X86_32
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
*(.text.page_aligned)
|
||||
*(.text..page_aligned)
|
||||
#endif
|
||||
. = ALIGN(8);
|
||||
_stext = .;
|
||||
|
@ -305,7 +305,7 @@ SECTIONS
|
|||
. = ALIGN(PAGE_SIZE);
|
||||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
||||
__bss_start = .;
|
||||
*(.bss.page_aligned)
|
||||
*(.bss..page_aligned)
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
__bss_stop = .;
|
||||
|
|
|
@ -80,7 +80,7 @@ extern void setup_per_cpu_areas(void);
|
|||
|
||||
#ifndef PER_CPU_BASE_SECTION
|
||||
#ifdef CONFIG_SMP
|
||||
#define PER_CPU_BASE_SECTION ".data.percpu"
|
||||
#define PER_CPU_BASE_SECTION ".data..percpu"
|
||||
#else
|
||||
#define PER_CPU_BASE_SECTION ".data"
|
||||
#endif
|
||||
|
@ -92,15 +92,15 @@ extern void setup_per_cpu_areas(void);
|
|||
#define PER_CPU_SHARED_ALIGNED_SECTION ""
|
||||
#define PER_CPU_ALIGNED_SECTION ""
|
||||
#else
|
||||
#define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned"
|
||||
#define PER_CPU_ALIGNED_SECTION ".shared_aligned"
|
||||
#define PER_CPU_SHARED_ALIGNED_SECTION "..shared_aligned"
|
||||
#define PER_CPU_ALIGNED_SECTION "..shared_aligned"
|
||||
#endif
|
||||
#define PER_CPU_FIRST_SECTION ".first"
|
||||
#define PER_CPU_FIRST_SECTION "..first"
|
||||
|
||||
#else
|
||||
|
||||
#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 ""
|
||||
|
||||
#endif
|
||||
|
|
|
@ -175,25 +175,25 @@
|
|||
#define NOSAVE_DATA \
|
||||
. = ALIGN(PAGE_SIZE); \
|
||||
VMLINUX_SYMBOL(__nosave_begin) = .; \
|
||||
*(.data.nosave) \
|
||||
*(.data..nosave) \
|
||||
. = ALIGN(PAGE_SIZE); \
|
||||
VMLINUX_SYMBOL(__nosave_end) = .;
|
||||
|
||||
#define PAGE_ALIGNED_DATA(page_align) \
|
||||
. = ALIGN(page_align); \
|
||||
*(.data.page_aligned)
|
||||
*(.data..page_aligned)
|
||||
|
||||
#define READ_MOSTLY_DATA(align) \
|
||||
. = ALIGN(align); \
|
||||
*(.data.read_mostly)
|
||||
*(.data..read_mostly)
|
||||
|
||||
#define CACHELINE_ALIGNED_DATA(align) \
|
||||
. = ALIGN(align); \
|
||||
*(.data.cacheline_aligned)
|
||||
*(.data..cacheline_aligned)
|
||||
|
||||
#define INIT_TASK_DATA(align) \
|
||||
. = ALIGN(align); \
|
||||
*(.data.init_task)
|
||||
*(.data..init_task)
|
||||
|
||||
/*
|
||||
* Read only Data
|
||||
|
@ -435,7 +435,7 @@
|
|||
*/
|
||||
#define INIT_TASK_DATA_SECTION(align) \
|
||||
. = ALIGN(align); \
|
||||
.data.init_task : { \
|
||||
.data..init_task : { \
|
||||
INIT_TASK_DATA(align) \
|
||||
}
|
||||
|
||||
|
@ -499,7 +499,7 @@
|
|||
#define BSS(bss_align) \
|
||||
. = ALIGN(bss_align); \
|
||||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) { \
|
||||
*(.bss.page_aligned) \
|
||||
*(.bss..page_aligned) \
|
||||
*(.dynbss) \
|
||||
*(.bss) \
|
||||
*(COMMON) \
|
||||
|
@ -666,16 +666,16 @@
|
|||
*/
|
||||
#define PERCPU_VADDR(vaddr, phdr) \
|
||||
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) { \
|
||||
VMLINUX_SYMBOL(__per_cpu_start) = .; \
|
||||
*(.data.percpu.first) \
|
||||
*(.data.percpu.page_aligned) \
|
||||
*(.data.percpu) \
|
||||
*(.data.percpu.shared_aligned) \
|
||||
*(.data..percpu..first) \
|
||||
*(.data..percpu..page_aligned) \
|
||||
*(.data..percpu) \
|
||||
*(.data..percpu..shared_aligned) \
|
||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||
} 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
|
||||
|
@ -687,18 +687,18 @@
|
|||
*
|
||||
* This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except
|
||||
* 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.
|
||||
*/
|
||||
#define PERCPU(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_start) = .; \
|
||||
*(.data.percpu.first) \
|
||||
*(.data.percpu.page_aligned) \
|
||||
*(.data.percpu) \
|
||||
*(.data.percpu.shared_aligned) \
|
||||
*(.data..percpu..first) \
|
||||
*(.data..percpu..page_aligned) \
|
||||
*(.data..percpu) \
|
||||
*(.data..percpu..shared_aligned) \
|
||||
VMLINUX_SYMBOL(__per_cpu_end) = .; \
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#ifndef __cacheline_aligned
|
||||
#define __cacheline_aligned \
|
||||
__attribute__((__aligned__(SMP_CACHE_BYTES), \
|
||||
__section__(".data.cacheline_aligned")))
|
||||
__section__(".data..cacheline_aligned")))
|
||||
#endif /* __cacheline_aligned */
|
||||
|
||||
#ifndef __cacheline_aligned_in_smp
|
||||
|
|
|
@ -301,7 +301,7 @@ void __init parse_early_options(char *cmdline);
|
|||
#endif
|
||||
|
||||
/* 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
|
||||
may call it." */
|
||||
|
|
|
@ -183,7 +183,7 @@ extern struct cred init_cred;
|
|||
}
|
||||
|
||||
/* 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
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
# define asmregparm
|
||||
#endif
|
||||
|
||||
#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_data __section(.data..page_aligned) __aligned(PAGE_SIZE)
|
||||
#define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE)
|
||||
|
||||
/*
|
||||
* For assembly routines.
|
||||
|
@ -27,8 +27,8 @@
|
|||
* Note when using these that you must specify the appropriate
|
||||
* alignment directives yourself
|
||||
*/
|
||||
#define __PAGE_ALIGNED_DATA .section ".data.page_aligned", "aw"
|
||||
#define __PAGE_ALIGNED_BSS .section ".bss.page_aligned", "aw"
|
||||
#define __PAGE_ALIGNED_DATA .section ".data..page_aligned", "aw"
|
||||
#define __PAGE_ALIGNED_BSS .section ".bss..page_aligned", "aw"
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
#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)
|
||||
|
||||
#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)
|
||||
|
||||
/*
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
/*
|
||||
* 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) \
|
||||
".subsection 1\n\t" \
|
||||
|
|
|
@ -76,6 +76,14 @@ config INIT_ENV_ARG_LIMIT
|
|||
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
|
||||
string "Local version - append to kernel release"
|
||||
help
|
||||
|
|
|
@ -403,7 +403,7 @@ static unsigned int find_pcpusec(Elf_Ehdr *hdr,
|
|||
Elf_Shdr *sechdrs,
|
||||
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,
|
||||
|
|
|
@ -82,7 +82,7 @@ ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
|
|||
lib-target := $(obj)/lib.a
|
||||
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
|
||||
endif
|
||||
|
||||
|
|
|
@ -241,7 +241,7 @@ cmd_lzma = (cat $(filter-out FORCE,$^) | \
|
|||
lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||
(rm -f $@ ; false)
|
||||
|
||||
quiet_cmd_lzo = LZO $@
|
||||
quiet_cmd_lzo = LZO $@
|
||||
cmd_lzo = (cat $(filter-out FORCE,$^) | \
|
||||
lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
||||
(rm -f $@ ; false)
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
# you do have real dups and do not have them under #ifdef's. You
|
||||
# could also just review the results.
|
||||
|
||||
use strict;
|
||||
|
||||
sub usage {
|
||||
print "Usage: checkincludes.pl [-r]\n";
|
||||
print "By default we just warn of duplicates\n";
|
||||
|
@ -35,23 +37,24 @@ if ($#ARGV >= 1) {
|
|||
}
|
||||
}
|
||||
|
||||
foreach $file (@ARGV) {
|
||||
open(FILE, $file) or die "Cannot open $file: $!.\n";
|
||||
foreach my $file (@ARGV) {
|
||||
open(my $f, '<', $file)
|
||||
or die "Cannot open $file: $!.\n";
|
||||
|
||||
my %includedfiles = ();
|
||||
my @file_lines = ();
|
||||
|
||||
while (<FILE>) {
|
||||
while (<$f>) {
|
||||
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
||||
++$includedfiles{$1};
|
||||
}
|
||||
push(@file_lines, $_);
|
||||
}
|
||||
|
||||
close(FILE);
|
||||
close($f);
|
||||
|
||||
if (!$remove) {
|
||||
foreach $filename (keys %includedfiles) {
|
||||
foreach my $filename (keys %includedfiles) {
|
||||
if ($includedfiles{$filename} > 1) {
|
||||
print "$file: $filename is included more than once.\n";
|
||||
}
|
||||
|
@ -59,27 +62,28 @@ foreach $file (@ARGV) {
|
|||
next;
|
||||
}
|
||||
|
||||
open(FILE,">$file") || die("Cannot write to $file: $!");
|
||||
open($f, '>', $file)
|
||||
or die("Cannot write to $file: $!");
|
||||
|
||||
my $dups = 0;
|
||||
foreach (@file_lines) {
|
||||
if (m/^\s*#\s*include\s*[<"](\S*)[>"]/o) {
|
||||
foreach $filename (keys %includedfiles) {
|
||||
foreach my $filename (keys %includedfiles) {
|
||||
if ($1 eq $filename) {
|
||||
if ($includedfiles{$filename} > 1) {
|
||||
$includedfiles{$filename}--;
|
||||
$dups++;
|
||||
} else {
|
||||
print FILE $_;
|
||||
print {$f} $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print FILE $_;
|
||||
print {$f} $_;
|
||||
}
|
||||
}
|
||||
if ($dups > 0) {
|
||||
print "$file: removed $dups duplicate includes\n";
|
||||
}
|
||||
close(FILE);
|
||||
close($f);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
#
|
||||
# TODO : Port to all architectures (one regex per arch)
|
||||
|
||||
use strict;
|
||||
|
||||
# check for arch
|
||||
#
|
||||
# $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()
|
||||
#
|
||||
my $funcre = qr/^$x* <(.*)>:$/;
|
||||
my $func;
|
||||
my $file, $lastslash;
|
||||
my ($func, $file, $lastslash);
|
||||
|
||||
while (my $line = <STDIN>) {
|
||||
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.
|
||||
# Copyright (C) 2003, Randy Dunlap <rdunlap@xenotime.net>
|
||||
|
||||
use strict;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $debugging = 0;
|
||||
my $debugging;
|
||||
|
||||
foreach $file (@ARGV)
|
||||
{
|
||||
foreach my $file (@ARGV) {
|
||||
# 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.
|
||||
my $fInComment = 0;
|
||||
my $fInString = 0;
|
||||
my $fUseVersion = 0;
|
||||
my ($fInComment, $fInString, $fUseVersion);
|
||||
my $iLinuxVersion = 0;
|
||||
|
||||
LINE: while ( <FILE> )
|
||||
{
|
||||
while (<$f>) {
|
||||
# Strip comments.
|
||||
$fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next);
|
||||
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
|
||||
if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/)) {
|
||||
$fUseVersion = 1;
|
||||
last LINE if $iLinuxVersion;
|
||||
}
|
||||
last if $iLinuxVersion;
|
||||
}
|
||||
}
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,29 @@ fi
|
|||
echo $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" "\<"`
|
||||
if [ $marker -eq 0 ]; then
|
||||
marker=`expr index "$code" "\("`
|
||||
|
@ -49,26 +72,25 @@ if [ $marker -ne 0 ]; then
|
|||
echo All code >> $T.oo
|
||||
echo ======== >> $T.oo
|
||||
beforemark=`echo "$code"`
|
||||
echo -n " .byte 0x" > $T.s
|
||||
echo $beforemark | sed -e 's/ /,0x/g' | sed -e 's/<//g' | sed -e 's/>//g' >> $T.s
|
||||
as $AFLAGS -o $T.o $T.s &> /dev/null
|
||||
objdump -S $T.o | grep -v "/tmp" | grep -v "Disassembly" | grep -v "\.text" | grep -v "^$" &> $T.ooo
|
||||
cat $T.ooo >> $T.oo
|
||||
rm -f $T.o $T.s $T.ooo
|
||||
echo -n " .$type 0x" > $T.s
|
||||
echo $beforemark | sed -e 's/ /,0x/g; s/[<>()]//g' >> $T.s
|
||||
disas $T
|
||||
cat $T.dis >> $T.oo
|
||||
rm -f $T.o $T.s $T.dis
|
||||
|
||||
# and fix code at-and-after marker
|
||||
code=`echo "$code" | cut -c$((${marker} + 1))-`
|
||||
fi
|
||||
echo Code starting with the faulting instruction > $T.aa
|
||||
echo =========================================== >> $T.aa
|
||||
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'`
|
||||
echo -n " .byte 0x" > $T.s
|
||||
code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g; s/[>)]$//'`
|
||||
echo -n " .$type 0x" > $T.s
|
||||
echo $code >> $T.s
|
||||
as $AFLAGS -o $T.o $T.s &> /dev/null
|
||||
objdump -S $T.o | grep -v "Disassembly" | grep -v "/tmp" | grep -v "\.text" | grep -v "^$" &> $T.aaa
|
||||
cat $T.aaa >> $T.aa
|
||||
disas $T
|
||||
cat $T.dis >> $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"
|
||||
echo
|
||||
|
|
|
@ -49,10 +49,10 @@ sub usage {
|
|||
}
|
||||
|
||||
sub collectcfiles {
|
||||
my @file = `cat .tmp_versions/*.mod | grep '.*\.ko\$'`;
|
||||
@file = grep {s/\.ko/.mod.c/} @file;
|
||||
chomp @file;
|
||||
return @file;
|
||||
my @file
|
||||
= `cat .tmp_versions/*.mod | grep '.*\.ko\$' | sed s/\.ko$/.mod.c/`;
|
||||
chomp @file;
|
||||
return @file;
|
||||
}
|
||||
|
||||
my (%SYMBOL, %MODULE, %opt, @allcfiles);
|
||||
|
@ -71,37 +71,40 @@ if (not defined $opt{'k'}) {
|
|||
$opt{'k'} = "Module.symvers";
|
||||
}
|
||||
|
||||
unless (open(MODULE_SYMVERS, $opt{'k'})) {
|
||||
die "Sorry, cannot open $opt{'k'}: $!\n";
|
||||
}
|
||||
open (my $module_symvers, '<', $opt{'k'})
|
||||
or die "Sorry, cannot open $opt{'k'}: $!\n";
|
||||
|
||||
if (defined $opt{'o'}) {
|
||||
unless (open(OUTPUT_HANDLE, ">$opt{'o'}")) {
|
||||
die "Sorry, cannot open $opt{'o'} $!\n";
|
||||
}
|
||||
select OUTPUT_HANDLE;
|
||||
open (my $out, '>', $opt{'o'})
|
||||
or die "Sorry, cannot open $opt{'o'} $!\n";
|
||||
|
||||
select $out;
|
||||
}
|
||||
|
||||
#
|
||||
# collect all the symbols and their attributes from the
|
||||
# Module.symvers file
|
||||
#
|
||||
while ( <MODULE_SYMVERS> ) {
|
||||
while ( <$module_symvers> ) {
|
||||
chomp;
|
||||
my (undef, $symbol, $module, $gpl) = split;
|
||||
$SYMBOL { $symbol } = [ $module , "0" , $symbol, $gpl];
|
||||
}
|
||||
close(MODULE_SYMVERS);
|
||||
close($module_symvers);
|
||||
|
||||
#
|
||||
# collect the usage count of each symbol.
|
||||
#
|
||||
foreach my $thismod (@allcfiles) {
|
||||
unless (open(MODULE_MODULE, $thismod)) {
|
||||
print "Sorry, cannot open $thismod: $!\n";
|
||||
my $module;
|
||||
|
||||
unless (open ($module, '<', $thismod)) {
|
||||
warn "Sorry, cannot open $thismod: $!\n";
|
||||
next;
|
||||
}
|
||||
|
||||
my $state=0;
|
||||
while ( <MODULE_MODULE> ) {
|
||||
while ( <$module> ) {
|
||||
chomp;
|
||||
if ($state == 0) {
|
||||
$state = 1 if ($_ =~ /static const struct modversion_info/);
|
||||
|
@ -124,7 +127,7 @@ foreach my $thismod (@allcfiles) {
|
|||
if ($state != 2) {
|
||||
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",
|
||||
|
|
|
@ -202,6 +202,7 @@ input_file() {
|
|||
print_mtime "$1" >> ${output}
|
||||
cat "$1" >> ${output}
|
||||
else
|
||||
echo "$1 \\"
|
||||
cat "$1" | while read type dir file perm ; do
|
||||
if [ "$type" == "file" ]; then
|
||||
echo "$file \\";
|
||||
|
@ -231,7 +232,7 @@ arg="$1"
|
|||
case "$arg" in
|
||||
"-l") # files included in initramfs - used by kbuild
|
||||
dep_list="list_"
|
||||
echo "deps_initramfs := \\"
|
||||
echo "deps_initramfs := $0 \\"
|
||||
shift
|
||||
;;
|
||||
"-o") # generate compressed cpio image named $1
|
||||
|
|
|
@ -758,8 +758,10 @@ int main(int argc, char **argv)
|
|||
/* setlinebuf(debugfile); */
|
||||
}
|
||||
|
||||
if (flag_reference)
|
||||
if (flag_reference) {
|
||||
read_reference(ref_file);
|
||||
fclose(ref_file);
|
||||
}
|
||||
|
||||
yyparse();
|
||||
|
||||
|
|
|
@ -80,8 +80,7 @@ sub search {
|
|||
my $path = "$i/$filename";
|
||||
return $path if -f $path;
|
||||
}
|
||||
|
||||
return undef;
|
||||
return;
|
||||
}
|
||||
|
||||
sub parse_all {
|
||||
|
|
|
@ -28,11 +28,12 @@ my $lineno = 0;
|
|||
my $filename;
|
||||
|
||||
foreach my $file (@files) {
|
||||
local *FH;
|
||||
$filename = $file;
|
||||
open(FH, "<$filename") or die "$filename: $!\n";
|
||||
|
||||
open(my $fh, '<', $filename)
|
||||
or die "$filename: $!\n";
|
||||
$lineno = 0;
|
||||
while ($line = <FH>) {
|
||||
while ($line = <$fh>) {
|
||||
$lineno++;
|
||||
&check_include();
|
||||
&check_asm_types();
|
||||
|
@ -40,7 +41,7 @@ foreach my $file (@files) {
|
|||
&check_declarations();
|
||||
# Dropped for now. Too much noise &check_config();
|
||||
}
|
||||
close FH;
|
||||
close $fh;
|
||||
}
|
||||
exit $ret;
|
||||
|
||||
|
@ -78,7 +79,7 @@ sub check_config
|
|||
}
|
||||
|
||||
my $linux_asm_types;
|
||||
sub check_asm_types()
|
||||
sub check_asm_types
|
||||
{
|
||||
if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
|
||||
return;
|
||||
|
|
|
@ -23,13 +23,13 @@ my ($readdir, $installdir, $arch, @files) = @ARGV;
|
|||
my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
|
||||
|
||||
foreach my $file (@files) {
|
||||
local *INFILE;
|
||||
local *OUTFILE;
|
||||
my $tmpfile = "$installdir/$file.tmp";
|
||||
open(INFILE, "<$readdir/$file")
|
||||
or die "$readdir/$file: $!\n";
|
||||
open(OUTFILE, ">$tmpfile") or die "$tmpfile: $!\n";
|
||||
while (my $line = <INFILE>) {
|
||||
|
||||
open(my $in, '<', "$readdir/$file")
|
||||
or die "$readdir/$file: $!\n";
|
||||
open(my $out, '>', $tmpfile)
|
||||
or die "$tmpfile: $!\n";
|
||||
while (my $line = <$in>) {
|
||||
$line =~ s/([\s(])__user\s/$1/g;
|
||||
$line =~ s/([\s(])__force\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)(asm)\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 INFILE;
|
||||
close $out;
|
||||
close $in;
|
||||
|
||||
system $unifdef . " $tmpfile > $installdir/$file";
|
||||
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);
|
||||
if (rc != 3) {
|
||||
if (rc != EOF) {
|
||||
/* skip line */
|
||||
fgets(str, 500, in);
|
||||
/* skip line. sym is used as dummy to
|
||||
* shut of "warn_unused_result" warning.
|
||||
*/
|
||||
sym = fgets(str, 500, in);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,9 @@ menuconfig: $(obj)/mconf
|
|||
config: $(obj)/conf
|
||||
$< $(Kconfig)
|
||||
|
||||
nconfig: $(obj)/nconf
|
||||
$< $(Kconfig)
|
||||
|
||||
oldconfig: $(obj)/conf
|
||||
$< -o $(Kconfig)
|
||||
|
||||
|
@ -120,6 +123,7 @@ endif
|
|||
# Help text used by make help
|
||||
help:
|
||||
@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 ' xconfig - Update current config utilising a QT 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:
|
||||
# conf: Used for defconfig, oldconfig and related targets
|
||||
# nconf: Used for the nconfig target.
|
||||
# Utilizes ncurses
|
||||
# mconf: Used for the menuconfig target
|
||||
# Utilizes the lxdialog package
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
hostprogs-y := conf qconf gconf kxgettext
|
||||
|
||||
ifeq ($(MAKECMDGOALS),nconfig)
|
||||
hostprogs-y += nconf
|
||||
endif
|
||||
|
||||
ifeq ($(MAKECMDGOALS),menuconfig)
|
||||
hostprogs-y += mconf
|
||||
endif
|
||||
|
@ -187,7 +198,7 @@ endif
|
|||
|
||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||
.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
|
||||
|
||||
# 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` \
|
||||
-D LKC_DIRECT_LINK
|
||||
|
||||
HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses
|
||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||
|
||||
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)
|
||||
{
|
||||
str_append((struct gstr*)data, str);
|
||||
struct gstr *gs = (struct gstr*)data;
|
||||
const char *sym_str = NULL;
|
||||
|
||||
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)
|
||||
|
|
|
@ -86,7 +86,7 @@ struct symbol {
|
|||
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_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_MAXLENGTH 256
|
||||
#define SYMBOL_HASHSIZE 257
|
||||
#define SYMBOL_HASHMASK 0xff
|
||||
#define SYMBOL_HASHSIZE 9973
|
||||
|
||||
/* A property represent the config options that can be associated
|
||||
* with a config "symbol".
|
||||
|
|
|
@ -30,13 +30,16 @@ enum {
|
|||
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
||||
};
|
||||
|
||||
enum {
|
||||
OPT_NORMAL, OPT_ALL, OPT_PROMPT
|
||||
};
|
||||
|
||||
static gint view_mode = FULL_VIEW;
|
||||
static gboolean show_name = TRUE;
|
||||
static gboolean show_range = TRUE;
|
||||
static gboolean show_value = TRUE;
|
||||
static gboolean show_all = FALSE;
|
||||
static gboolean show_debug = FALSE;
|
||||
static gboolean resizeable = FALSE;
|
||||
static int opt_mode = OPT_NORMAL;
|
||||
|
||||
GtkWidget *main_wnd = NULL;
|
||||
GtkWidget *tree1_w = NULL; // left frame
|
||||
|
@ -76,36 +79,7 @@ static void conf_changed(void);
|
|||
|
||||
/* Helping/Debugging Functions */
|
||||
|
||||
|
||||
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)
|
||||
const char *dbg_sym_flags(int val)
|
||||
{
|
||||
static char buf[256];
|
||||
|
||||
|
@ -131,40 +105,10 @@ const char *dbg_print_flags(int val)
|
|||
strcat(buf, "auto/");
|
||||
|
||||
buf[strlen(buf) - 1] = '\0';
|
||||
#ifdef DEBUG
|
||||
printf("%s", buf);
|
||||
#endif
|
||||
|
||||
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,
|
||||
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
||||
{
|
||||
|
@ -697,20 +641,29 @@ void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
|||
|
||||
|
||||
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);
|
||||
display_tree(&rootmenu); // instead of update_tree to speed-up
|
||||
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
update_tree(&rootmenu, NULL);
|
||||
opt_mode = OPT_ALL;
|
||||
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)),
|
||||
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");
|
||||
else
|
||||
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");
|
||||
#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) {
|
||||
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
||||
valid = gtk_tree_model_iter_next(model2,
|
||||
child2);
|
||||
gtk_tree_store_remove(tree2, &tmp);
|
||||
if (!valid)
|
||||
return; // next parent
|
||||
return; /* next parent */
|
||||
else
|
||||
goto reparse; // next child
|
||||
goto reparse; /* next child */
|
||||
} else
|
||||
continue;
|
||||
}
|
||||
|
@ -1464,17 +1423,19 @@ static void display_tree(struct menu *menu)
|
|||
&& (tree == tree2))
|
||||
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));
|
||||
#ifdef DEBUG
|
||||
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
||||
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
||||
dbg_print_ptype(ptype);
|
||||
printf("%s", prop_get_type_name(ptype));
|
||||
printf(" | ");
|
||||
if (sym) {
|
||||
dbg_print_stype(sym->type);
|
||||
printf("%s", sym_type_name(sym->type));
|
||||
printf(" | ");
|
||||
dbg_print_flags(sym->flags);
|
||||
printf("%s", dbg_sym_flags(sym->flags));
|
||||
printf("\n");
|
||||
} else
|
||||
printf("\n");
|
||||
|
|
|
@ -190,26 +190,40 @@
|
|||
</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="tooltip" translatable="yes">Show all options</property>
|
||||
<property name="label" translatable="yes">Show all _options</property>
|
||||
<property name="use_underline">True</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>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<widget class="GtkCheckMenuItem" id="show_debug_info1">
|
||||
<widget class="GtkRadioMenuItem" id="set_option_mode3">
|
||||
<property name="visible">True</property>
|
||||
<property name="tooltip" translatable="yes">Show masked options</property>
|
||||
<property name="label" translatable="yes">Show _debug info</property>
|
||||
<property name="tooltip" translatable="yes">Show all options with prompts</property>
|
||||
<property name="label" translatable="yes">Show all prompt options</property>
|
||||
<property name="use_underline">True</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>
|
||||
</child>
|
||||
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
|
|
|
@ -84,7 +84,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode);
|
|||
void kconfig_load(void);
|
||||
|
||||
/* menu.c */
|
||||
void menu_init(void);
|
||||
void _menu_init(void);
|
||||
void menu_warn(struct menu *menu, const char *fmt, ...);
|
||||
struct menu *menu_add_menu(void);
|
||||
void menu_end_menu(void);
|
||||
|
@ -106,6 +106,11 @@ int file_write_dep(const char *name);
|
|||
struct gstr {
|
||||
size_t len;
|
||||
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_assign(const char *s);
|
||||
|
|
|
@ -11,13 +11,15 @@ P(conf_set_changed_callback, void,(void (*fn)(void)));
|
|||
/* menu.c */
|
||||
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_root_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_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));
|
||||
|
||||
/* symbol.c */
|
||||
|
|
|
@ -180,7 +180,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
|
|||
case KEY_LEFT:
|
||||
switch (button) {
|
||||
case -1:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
button = 1; /* Indicates "Help" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 0:
|
||||
|
@ -204,7 +204,7 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width
|
|||
print_buttons(dialog, height, width, 0);
|
||||
break;
|
||||
case 0:
|
||||
button = 1; /* Indicates "Cancel" button is selected */
|
||||
button = 1; /* Indicates "Help" button is selected */
|
||||
print_buttons(dialog, height, width, 1);
|
||||
break;
|
||||
case 1:
|
||||
|
|
|
@ -383,6 +383,10 @@ int dialog_menu(const char *title, const char *prompt,
|
|||
case 'n':
|
||||
case 'm':
|
||||
case '/':
|
||||
case 'h':
|
||||
case '?':
|
||||
case 'z':
|
||||
case '\n':
|
||||
/* save scroll info */
|
||||
*s_scroll = scroll;
|
||||
delwin(menu);
|
||||
|
@ -390,8 +394,10 @@ int dialog_menu(const char *title, const char *prompt,
|
|||
item_set(scroll + choice);
|
||||
item_set_selected(1);
|
||||
switch (key) {
|
||||
case 'h':
|
||||
case '?':
|
||||
return 2;
|
||||
case 's':
|
||||
return 3;
|
||||
case 'y':
|
||||
return 3;
|
||||
case 'n':
|
||||
|
@ -402,18 +408,12 @@ int dialog_menu(const char *title, const char *prompt,
|
|||
return 6;
|
||||
case '/':
|
||||
return 7;
|
||||
case 'z':
|
||||
return 8;
|
||||
case '\n':
|
||||
return button;
|
||||
}
|
||||
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 'x':
|
||||
key = KEY_ESC;
|
||||
|
|
|
@ -67,13 +67,15 @@ static const char mconf_readme[] = N_(
|
|||
" there is a delayed response which you may find annoying.\n"
|
||||
"\n"
|
||||
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
||||
" <Exit> and <Help>\n"
|
||||
" <Exit> and <Help>.\n"
|
||||
"\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"
|
||||
" Shortcut: Press <H> or <?>.\n"
|
||||
"\n"
|
||||
"o To show hidden options, press <Z>.\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"Radiolists (Choice lists)\n"
|
||||
"-----------\n"
|
||||
|
@ -272,6 +274,7 @@ static int indent;
|
|||
static struct menu *current_menu;
|
||||
static int child_count;
|
||||
static int single_menu_mode;
|
||||
static int show_all_options;
|
||||
|
||||
static void conf(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_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 void set_config_filename(const char *config_filename)
|
||||
{
|
||||
|
@ -359,8 +349,16 @@ static void build_conf(struct menu *menu)
|
|||
int type, tmp, doint = 2;
|
||||
tristate val;
|
||||
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;
|
||||
|
||||
sym = menu->sym;
|
||||
|
@ -619,6 +617,9 @@ static void conf(struct menu *menu)
|
|||
case 7:
|
||||
search_conf();
|
||||
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();
|
||||
|
||||
help.max_width = getmaxx(stdscr) - 10;
|
||||
menu_get_ext_help(menu, &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);
|
||||
}
|
||||
|
||||
void menu_init(void)
|
||||
void _menu_init(void)
|
||||
{
|
||||
current_entry = current_menu = &rootmenu;
|
||||
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) &&
|
||||
prop->expr->type != E_SYMBOL)
|
||||
prop_warn(prop,
|
||||
"default for config symbol '%'"
|
||||
"default for config symbol '%s'"
|
||||
" must be a single symbol", sym->name);
|
||||
break;
|
||||
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)
|
||||
{
|
||||
struct menu *child;
|
||||
|
@ -398,6 +405,7 @@ bool menu_is_visible(struct menu *menu)
|
|||
|
||||
if (!menu->prompt)
|
||||
return false;
|
||||
|
||||
sym = menu->sym;
|
||||
if (sym) {
|
||||
sym_calc_value(sym);
|
||||
|
@ -407,12 +415,14 @@ bool menu_is_visible(struct menu *menu)
|
|||
|
||||
if (visible != no)
|
||||
return true;
|
||||
|
||||
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
||||
return false;
|
||||
|
||||
for (child = menu->list; child; child = child->next)
|
||||
if (menu_is_visible(child))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -515,6 +525,20 @@ void get_symbol_str(struct gstr *r, struct symbol *sym)
|
|||
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)
|
||||
{
|
||||
struct symbol *sym = menu->sym;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
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 *symbol;
|
||||
const char *ptr;
|
||||
char *new_name;
|
||||
int hash = 0;
|
||||
int hash;
|
||||
|
||||
if (name) {
|
||||
if (name[0] && !name[1]) {
|
||||
|
@ -666,12 +674,11 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||
case 'n': return &symbol_no;
|
||||
}
|
||||
}
|
||||
for (ptr = name; *ptr; ptr++)
|
||||
hash += *ptr;
|
||||
hash &= 0xff;
|
||||
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||
|
||||
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
|
||||
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
||||
return symbol;
|
||||
|
@ -679,7 +686,7 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||
new_name = strdup(name);
|
||||
} else {
|
||||
new_name = NULL;
|
||||
hash = 256;
|
||||
hash = 0;
|
||||
}
|
||||
|
||||
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 *symbol = NULL;
|
||||
const char *ptr;
|
||||
int hash = 0;
|
||||
|
||||
if (!name)
|
||||
|
@ -710,12 +716,11 @@ struct symbol *sym_find(const char *name)
|
|||
case 'n': return &symbol_no;
|
||||
}
|
||||
}
|
||||
for (ptr = name; *ptr; ptr++)
|
||||
hash += *ptr;
|
||||
hash &= 0xff;
|
||||
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||
|
||||
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))
|
||||
break;
|
||||
}
|
||||
|
@ -750,6 +755,7 @@ struct symbol **sym_re_search(const char *pattern)
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
sym_calc_value(sym);
|
||||
sym_arr[cnt++] = sym;
|
||||
}
|
||||
if (sym_arr)
|
||||
|
|
|
@ -78,6 +78,7 @@ struct gstr str_new(void)
|
|||
struct gstr gs;
|
||||
gs.s = malloc(sizeof(char) * 64);
|
||||
gs.len = 64;
|
||||
gs.max_width = 0;
|
||||
strcpy(gs.s, "\0");
|
||||
return gs;
|
||||
}
|
||||
|
@ -88,6 +89,7 @@ struct gstr str_assign(const char *s)
|
|||
struct gstr gs;
|
||||
gs.s = strdup(s);
|
||||
gs.len = strlen(s) + 1;
|
||||
gs.max_width = 0;
|
||||
return gs;
|
||||
}
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ static void zconf_error(const char *err, ...);
|
|||
static void zconferror(const char *err);
|
||||
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;
|
||||
|
||||
|
@ -2220,7 +2220,7 @@ void conf_parse(const char *name)
|
|||
zconf_initscan(name);
|
||||
|
||||
sym_init();
|
||||
menu_init();
|
||||
_menu_init();
|
||||
modules_sym = sym_lookup(NULL, 0);
|
||||
modules_sym->type = S_BOOLEAN;
|
||||
modules_sym->flags |= SYMBOL_AUTO;
|
||||
|
@ -2336,9 +2336,9 @@ static void print_symbol(FILE *out, struct menu *menu)
|
|||
struct property *prop;
|
||||
|
||||
if (sym_is_choice(sym))
|
||||
fprintf(out, "choice\n");
|
||||
fprintf(out, "\nchoice\n");
|
||||
else
|
||||
fprintf(out, "config %s\n", sym->name);
|
||||
fprintf(out, "\nconfig %s\n", sym->name);
|
||||
switch (sym->type) {
|
||||
case S_BOOLEAN:
|
||||
fputs(" boolean\n", out);
|
||||
|
@ -2384,6 +2384,21 @@ static void print_symbol(FILE *out, struct menu *menu)
|
|||
case P_CHOICE:
|
||||
fputs(" #choice value\n", out);
|
||||
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:
|
||||
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||
break;
|
||||
|
@ -2395,7 +2410,6 @@ static void print_symbol(FILE *out, struct menu *menu)
|
|||
menu->help[len] = 0;
|
||||
fprintf(out, " help\n%s\n", menu->help);
|
||||
}
|
||||
fputc('\n', out);
|
||||
}
|
||||
|
||||
void zconfdump(FILE *out)
|
||||
|
@ -2428,7 +2442,6 @@ void zconfdump(FILE *out)
|
|||
expr_fprint(prop->visible.expr, out);
|
||||
fputc('\n', out);
|
||||
}
|
||||
fputs("\n", out);
|
||||
}
|
||||
|
||||
if (menu->list)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue