mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'objtool-core-2025-12-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull objtool updates from Ingo Molnar:
- klp-build livepatch module generation (Josh Poimboeuf)
Introduce new objtool features and a klp-build script to generate
livepatch modules using a source .patch as input.
This builds on concepts from the longstanding out-of-tree kpatch
project which began in 2012 and has been used for many years to
generate livepatch modules for production kernels. However, this is a
complete rewrite which incorporates hard-earned lessons from 12+
years of maintaining kpatch.
Key improvements compared to kpatch-build:
- Integrated with objtool: Leverages objtool's existing control-flow
graph analysis to help detect changed functions.
- Works on vmlinux.o: Supports late-linked objects, making it
compatible with LTO, IBT, and similar.
- Simplified code base: ~3k fewer lines of code.
- Upstream: No more out-of-tree #ifdef hacks, far less cruft.
- Cleaner internals: Vastly simplified logic for
symbol/section/reloc inclusion and special section extraction.
- Robust __LINE__ macro handling: Avoids false positive binary diffs
caused by the __LINE__ macro by introducing a fix-patch-lines
script which injects #line directives into the source .patch to
preserve the original line numbers at compile time.
- Disassemble code with libopcodes instead of running objdump
(Alexandre Chartre)
- Disassemble support (-d option to objtool) by Alexandre Chartre,
which supports the decoding of various Linux kernel code generation
specials such as alternatives:
17ef: sched_balance_find_dst_group+0x62f mov 0x34(%r9),%edx
17f3: sched_balance_find_dst_group+0x633 | <alternative.17f3> | X86_FEATURE_POPCNT
17f3: sched_balance_find_dst_group+0x633 | call 0x17f8 <__sw_hweight64> | popcnt %rdi,%rax
17f8: sched_balance_find_dst_group+0x638 cmp %eax,%edx
... jump table alternatives:
1895: sched_use_asym_prio+0x5 test $0x8,%ch
1898: sched_use_asym_prio+0x8 je 0x18a9 <sched_use_asym_prio+0x19>
189a: sched_use_asym_prio+0xa | <jump_table.189a> | JUMP
189a: sched_use_asym_prio+0xa | jmp 0x18ae <sched_use_asym_prio+0x1e> | nop2
189c: sched_use_asym_prio+0xc mov $0x1,%eax
18a1: sched_use_asym_prio+0x11 and $0x80,%ecx
... exception table alternatives:
native_read_msr:
5b80: native_read_msr+0x0 mov %edi,%ecx
5b82: native_read_msr+0x2 | <ex_table.5b82> | EXCEPTION
5b82: native_read_msr+0x2 | rdmsr | resume at 0x5b84 <native_read_msr+0x4>
5b84: native_read_msr+0x4 shl $0x20,%rdx
.... x86 feature flag decoding (also see the X86_FEATURE_POPCNT
example in sched_balance_find_dst_group() above):
2faaf: start_thread_common.constprop.0+0x1f jne 0x2fba4 <start_thread_common.constprop.0+0x114>
2fab5: start_thread_common.constprop.0+0x25 | <alternative.2fab5> | X86_FEATURE_ALWAYS | X86_BUG_NULL_SEG
2fab5: start_thread_common.constprop.0+0x25 | jmp 0x2faba <.altinstr_aux+0x2f4> | jmp 0x4b0 <start_thread_common.constprop.0+0x3f> | nop5
2faba: start_thread_common.constprop.0+0x2a mov $0x2b,%eax
... NOP sequence shortening:
1048e2: snapshot_write_finalize+0xc2 je 0x104917 <snapshot_write_finalize+0xf7>
1048e4: snapshot_write_finalize+0xc4 nop6
1048ea: snapshot_write_finalize+0xca nop11
1048f5: snapshot_write_finalize+0xd5 nop11
104900: snapshot_write_finalize+0xe0 mov %rax,%rcx
104903: snapshot_write_finalize+0xe3 mov 0x10(%rdx),%rax
... and much more.
- Function validation tracing support (Alexandre Chartre)
- Various -ffunction-sections fixes (Josh Poimboeuf)
- Clang AutoFDO (Automated Feedback-Directed Optimizations) support
(Josh Poimboeuf)
- Misc fixes and cleanups (Borislav Petkov, Chen Ni, Dylan Hatch, Ingo
Molnar, John Wang, Josh Poimboeuf, Pankaj Raghav, Peter Zijlstra,
Thorsten Blum)
* tag 'objtool-core-2025-12-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (129 commits)
objtool: Fix segfault on unknown alternatives
objtool: Build with disassembly can fail when including bdf.h
objtool: Trim trailing NOPs in alternative
objtool: Add wide output for disassembly
objtool: Compact output for alternatives with one instruction
objtool: Improve naming of group alternatives
objtool: Add Function to get the name of a CPU feature
objtool: Provide access to feature and flags of group alternatives
objtool: Fix address references in alternatives
objtool: Disassemble jump table alternatives
objtool: Disassemble exception table alternatives
objtool: Print addresses with alternative instructions
objtool: Disassemble group alternatives
objtool: Print headers for alternatives
objtool: Preserve alternatives order
objtool: Add the --disas=<function-pattern> action
objtool: Do not validate IBT for .return_sites and .call_sites
objtool: Improve tracing of alternative instructions
objtool: Add functions to better name alternatives
objtool: Identify the different types of alternatives
...
This commit is contained in:
+2
-1
@@ -14459,10 +14459,11 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching.g
|
||||
F: Documentation/ABI/testing/sysfs-kernel-livepatch
|
||||
F: Documentation/livepatch/
|
||||
F: arch/powerpc/include/asm/livepatch.h
|
||||
F: include/linux/livepatch.h
|
||||
F: include/linux/livepatch*.h
|
||||
F: kernel/livepatch/
|
||||
F: kernel/module/livepatch.c
|
||||
F: samples/livepatch/
|
||||
F: scripts/livepatch/
|
||||
F: tools/testing/selftests/livepatch/
|
||||
|
||||
LLC (802.2)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#ifdef CONFIG_EXPOLINE_EXTERN
|
||||
SYM_CODE_START(\name)
|
||||
#else
|
||||
.pushsection .text.\name,"axG",@progbits,\name,comdat
|
||||
.pushsection .text..\name,"axG",@progbits,\name,comdat
|
||||
.globl \name
|
||||
.hidden \name
|
||||
.type \name,@function
|
||||
|
||||
@@ -51,7 +51,7 @@ SECTIONS
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
FTRACE_HOTPATCH_TRAMPOLINES_TEXT
|
||||
*(.text.*_indirect_*)
|
||||
*(.text..*_indirect_*)
|
||||
*(.gnu.warning)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
@@ -261,6 +261,7 @@ config X86
|
||||
select HAVE_FUNCTION_ERROR_INJECTION
|
||||
select HAVE_KRETPROBES
|
||||
select HAVE_RETHOOK
|
||||
select HAVE_KLP_BUILD if X86_64
|
||||
select HAVE_LIVEPATCH if X86_64
|
||||
select HAVE_MIXED_BREAKPOINTS_REGS
|
||||
select HAVE_MOD_ARCH_SPECIFIC
|
||||
|
||||
@@ -36,7 +36,7 @@ $(patsubst %.o,$(obj)/%.o,$(lib-y)): OBJECT_FILES_NON_STANDARD := y
|
||||
# relocations, even if other objtool actions are being deferred.
|
||||
#
|
||||
$(pi-objs): objtool-enabled = 1
|
||||
$(pi-objs): objtool-args = $(if $(delay-objtool),,$(objtool-args-y)) --noabs
|
||||
$(pi-objs): objtool-args = $(if $(delay-objtool),--dry-run,$(objtool-args-y)) --noabs
|
||||
|
||||
#
|
||||
# Confine the startup code by prefixing all symbols with __pi_ (for position
|
||||
|
||||
@@ -198,6 +198,7 @@ static inline int alternatives_text_reserved(void *start, void *end)
|
||||
|
||||
#define ALTINSTR_ENTRY(ft_flags) \
|
||||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
" .long 771b - .\n" /* label */ \
|
||||
" .long 774f - .\n" /* new instruction */ \
|
||||
" .4byte " __stringify(ft_flags) "\n" /* feature + flags */ \
|
||||
@@ -207,6 +208,7 @@ static inline int alternatives_text_reserved(void *start, void *end)
|
||||
|
||||
#define ALTINSTR_REPLACEMENT(newinstr) /* replacement */ \
|
||||
".pushsection .altinstr_replacement, \"ax\"\n" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
"# ALT: replacement\n" \
|
||||
"774:\n\t" newinstr "\n775:\n" \
|
||||
".popsection\n"
|
||||
@@ -337,6 +339,7 @@ void nop_func(void);
|
||||
* instruction. See apply_alternatives().
|
||||
*/
|
||||
.macro altinstr_entry orig alt ft_flags orig_len alt_len
|
||||
ANNOTATE_DATA_SPECIAL
|
||||
.long \orig - .
|
||||
.long \alt - .
|
||||
.4byte \ft_flags
|
||||
@@ -365,6 +368,7 @@ void nop_func(void);
|
||||
.popsection ; \
|
||||
.pushsection .altinstr_replacement,"ax" ; \
|
||||
743: \
|
||||
ANNOTATE_DATA_SPECIAL ; \
|
||||
newinst ; \
|
||||
744: \
|
||||
.popsection ;
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#ifndef _ASM_X86_ASM_H
|
||||
#define _ASM_X86_ASM_H
|
||||
|
||||
#include <linux/annotate.h>
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
# define __ASM_FORM(x, ...) x,## __VA_ARGS__
|
||||
# define __ASM_FORM_RAW(x, ...) x,## __VA_ARGS__
|
||||
@@ -132,6 +134,7 @@ static __always_inline __pure void *rip_rel_ptr(void *p)
|
||||
# define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
.pushsection "__ex_table","a" ; \
|
||||
.balign 4 ; \
|
||||
ANNOTATE_DATA_SPECIAL ; \
|
||||
.long (from) - . ; \
|
||||
.long (to) - . ; \
|
||||
.long type ; \
|
||||
@@ -179,6 +182,7 @@ static __always_inline __pure void *rip_rel_ptr(void *p)
|
||||
# define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
" .pushsection \"__ex_table\",\"a\"\n" \
|
||||
" .balign 4\n" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
" .long (" #from ") - .\n" \
|
||||
" .long (" #to ") - .\n" \
|
||||
" .long " __stringify(type) " \n" \
|
||||
@@ -187,6 +191,7 @@ static __always_inline __pure void *rip_rel_ptr(void *p)
|
||||
# define _ASM_EXTABLE_TYPE_REG(from, to, type, reg) \
|
||||
" .pushsection \"__ex_table\",\"a\"\n" \
|
||||
" .balign 4\n" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
" .long (" #from ") - .\n" \
|
||||
" .long (" #to ") - .\n" \
|
||||
DEFINE_EXTABLE_TYPE_REG \
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define _BUG_FLAGS_ASM(ins, file, line, flags, size, extra) \
|
||||
"1:\t" ins "\n" \
|
||||
".pushsection __bug_table,\"aw\"\n" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
__BUG_ENTRY(file, line, flags) \
|
||||
"\t.org 2b + " size "\n" \
|
||||
".popsection\n" \
|
||||
|
||||
@@ -101,6 +101,7 @@ static __always_inline bool _static_cpu_has(u16 bit)
|
||||
asm goto(ALTERNATIVE_TERNARY("jmp 6f", %c[feature], "", "jmp %l[t_no]")
|
||||
".pushsection .altinstr_aux,\"ax\"\n"
|
||||
"6:\n"
|
||||
ANNOTATE_DATA_SPECIAL
|
||||
" testb %[bitnum], %a[cap_byte]\n"
|
||||
" jnz %l[t_yes]\n"
|
||||
" jmp %l[t_no]\n"
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#define JUMP_TABLE_ENTRY(key, label) \
|
||||
".pushsection __jump_table, \"aw\" \n\t" \
|
||||
_ASM_ALIGN "\n\t" \
|
||||
ANNOTATE_DATA_SPECIAL \
|
||||
".long 1b - . \n\t" \
|
||||
".long " label " - . \n\t" \
|
||||
_ASM_PTR " " key " - . \n\t" \
|
||||
|
||||
@@ -109,7 +109,7 @@ int common_cpu_up(unsigned int cpunum, struct task_struct *tidle);
|
||||
int native_kick_ap(unsigned int cpu, struct task_struct *tidle);
|
||||
int native_cpu_disable(void);
|
||||
void __noreturn hlt_play_dead(void);
|
||||
void native_play_dead(void);
|
||||
void __noreturn native_play_dead(void);
|
||||
void play_dead_common(void);
|
||||
void wbinvd_on_cpu(int cpu);
|
||||
void wbinvd_on_all_cpus(void);
|
||||
|
||||
@@ -2244,21 +2244,34 @@ int alternatives_text_reserved(void *start, void *end)
|
||||
* See entry_{32,64}.S for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* We define the int3_magic() function in assembly to control the calling
|
||||
* convention such that we can 'call' it from assembly.
|
||||
*/
|
||||
|
||||
extern void int3_magic(unsigned int *ptr); /* defined in asm */
|
||||
extern void int3_selftest_asm(unsigned int *ptr);
|
||||
|
||||
asm (
|
||||
" .pushsection .init.text, \"ax\", @progbits\n"
|
||||
" .type int3_magic, @function\n"
|
||||
"int3_magic:\n"
|
||||
" .type int3_selftest_asm, @function\n"
|
||||
"int3_selftest_asm:\n"
|
||||
ANNOTATE_NOENDBR
|
||||
" movl $1, (%" _ASM_ARG1 ")\n"
|
||||
/*
|
||||
* INT3 padded with NOP to CALL_INSN_SIZE. The INT3 triggers an
|
||||
* exception, then the int3_exception_nb notifier emulates a call to
|
||||
* int3_selftest_callee().
|
||||
*/
|
||||
" int3; nop; nop; nop; nop\n"
|
||||
ASM_RET
|
||||
" .size int3_magic, .-int3_magic\n"
|
||||
" .size int3_selftest_asm, . - int3_selftest_asm\n"
|
||||
" .popsection\n"
|
||||
);
|
||||
|
||||
extern void int3_selftest_callee(unsigned int *ptr);
|
||||
|
||||
asm (
|
||||
" .pushsection .init.text, \"ax\", @progbits\n"
|
||||
" .type int3_selftest_callee, @function\n"
|
||||
"int3_selftest_callee:\n"
|
||||
ANNOTATE_NOENDBR
|
||||
" movl $0x1234, (%" _ASM_ARG1 ")\n"
|
||||
ASM_RET
|
||||
" .size int3_selftest_callee, . - int3_selftest_callee\n"
|
||||
" .popsection\n"
|
||||
);
|
||||
|
||||
@@ -2267,7 +2280,7 @@ extern void int3_selftest_ip(void); /* defined in asm below */
|
||||
static int __init
|
||||
int3_exception_notify(struct notifier_block *self, unsigned long val, void *data)
|
||||
{
|
||||
unsigned long selftest = (unsigned long)&int3_selftest_ip;
|
||||
unsigned long selftest = (unsigned long)&int3_selftest_asm;
|
||||
struct die_args *args = data;
|
||||
struct pt_regs *regs = args->regs;
|
||||
|
||||
@@ -2282,7 +2295,7 @@ int3_exception_notify(struct notifier_block *self, unsigned long val, void *data
|
||||
if (regs->ip - INT3_INSN_SIZE != selftest)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
int3_emulate_call(regs, (unsigned long)&int3_magic);
|
||||
int3_emulate_call(regs, (unsigned long)&int3_selftest_callee);
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
||||
@@ -2298,19 +2311,11 @@ static noinline void __init int3_selftest(void)
|
||||
BUG_ON(register_die_notifier(&int3_exception_nb));
|
||||
|
||||
/*
|
||||
* Basically: int3_magic(&val); but really complicated :-)
|
||||
*
|
||||
* INT3 padded with NOP to CALL_INSN_SIZE. The int3_exception_nb
|
||||
* notifier above will emulate CALL for us.
|
||||
* Basically: int3_selftest_callee(&val); but really complicated :-)
|
||||
*/
|
||||
asm volatile ("int3_selftest_ip:\n\t"
|
||||
ANNOTATE_NOENDBR
|
||||
" int3; nop; nop; nop; nop\n\t"
|
||||
: ASM_CALL_CONSTRAINT
|
||||
: __ASM_SEL_RAW(a, D) (&val)
|
||||
: "memory");
|
||||
int3_selftest_asm(&val);
|
||||
|
||||
BUG_ON(val != 1);
|
||||
BUG_ON(val != 0x1234);
|
||||
|
||||
unregister_die_notifier(&int3_exception_nb);
|
||||
}
|
||||
|
||||
@@ -103,7 +103,6 @@ static void synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long val)
|
||||
|
||||
asm (
|
||||
".pushsection .rodata\n"
|
||||
"optprobe_template_func:\n"
|
||||
".global optprobe_template_entry\n"
|
||||
"optprobe_template_entry:\n"
|
||||
#ifdef CONFIG_X86_64
|
||||
@@ -160,9 +159,6 @@ asm (
|
||||
"optprobe_template_end:\n"
|
||||
".popsection\n");
|
||||
|
||||
void optprobe_template_func(void);
|
||||
STACK_FRAME_NON_STANDARD(optprobe_template_func);
|
||||
|
||||
#define TMPL_CLAC_IDX \
|
||||
((long)optprobe_template_clac - (long)optprobe_template_entry)
|
||||
#define TMPL_MOVE_IDX \
|
||||
|
||||
@@ -97,6 +97,7 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
DEBUGP("%s relocate section %u to %u\n",
|
||||
apply ? "Applying" : "Clearing",
|
||||
relsec, sechdrs[relsec].sh_info);
|
||||
|
||||
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
|
||||
size_t size;
|
||||
|
||||
@@ -162,15 +163,17 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
|
||||
if (apply) {
|
||||
if (memcmp(loc, &zero, size)) {
|
||||
pr_err("x86/modules: Invalid relocation target, existing value is nonzero for type %d, loc %p, val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), loc, val);
|
||||
pr_err("x86/modules: Invalid relocation target, existing value is nonzero for sec %u, idx %u, type %d, loc %lx, val %llx\n",
|
||||
relsec, i, (int)ELF64_R_TYPE(rel[i].r_info),
|
||||
(unsigned long)loc, val);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
write(loc, &val, size);
|
||||
} else {
|
||||
if (memcmp(loc, &val, size)) {
|
||||
pr_warn("x86/modules: Invalid relocation target, existing value does not match expected value for type %d, loc %p, val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), loc, val);
|
||||
pr_warn("x86/modules: Invalid relocation target, existing value does not match expected value for sec %u, idx %u, type %d, loc %lx, val %llx\n",
|
||||
relsec, i, (int)ELF64_R_TYPE(rel[i].r_info),
|
||||
(unsigned long)loc, val);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
write(loc, &zero, size);
|
||||
@@ -179,8 +182,8 @@ static int __write_relocate_add(Elf64_Shdr *sechdrs,
|
||||
return 0;
|
||||
|
||||
overflow:
|
||||
pr_err("overflow in relocation type %d val %Lx\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), val);
|
||||
pr_err("overflow in relocation type %d val %llx sec %u idx %d\n",
|
||||
(int)ELF64_R_TYPE(rel[i].r_info), val, relsec, i);
|
||||
pr_err("`%s' likely not compiled with -mcmodel=kernel\n",
|
||||
me->name);
|
||||
return -ENOEXEC;
|
||||
|
||||
@@ -1328,11 +1328,7 @@ void __noreturn hlt_play_dead(void)
|
||||
native_halt();
|
||||
}
|
||||
|
||||
/*
|
||||
* native_play_dead() is essentially a __noreturn function, but it can't
|
||||
* be marked as such as the compiler may complain about it.
|
||||
*/
|
||||
void native_play_dead(void)
|
||||
void __noreturn native_play_dead(void)
|
||||
{
|
||||
if (cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS))
|
||||
__update_spec_ctrl(0);
|
||||
@@ -1351,7 +1347,7 @@ int native_cpu_disable(void)
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
void native_play_dead(void)
|
||||
void __noreturn native_play_dead(void)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
@@ -53,6 +53,10 @@ extern void
|
||||
usnic_uiom_interval_tree_remove(struct usnic_uiom_interval_node *node,
|
||||
struct rb_root_cached *root);
|
||||
extern struct usnic_uiom_interval_node *
|
||||
usnic_uiom_interval_tree_subtree_search(struct usnic_uiom_interval_node *node,
|
||||
unsigned long start,
|
||||
unsigned long last);
|
||||
extern struct usnic_uiom_interval_node *
|
||||
usnic_uiom_interval_tree_iter_first(struct rb_root_cached *root,
|
||||
unsigned long start,
|
||||
unsigned long last);
|
||||
|
||||
@@ -491,7 +491,7 @@ static int gc2235_s_power(struct v4l2_subdev *sd, int on)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int startup(struct v4l2_subdev *sd)
|
||||
static int gc2235_startup(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct gc2235_device *dev = to_gc2235_sensor(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
@@ -556,7 +556,7 @@ static int gc2235_set_fmt(struct v4l2_subdev *sd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = startup(sd);
|
||||
ret = gc2235_startup(sd);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "gc2235 startup err\n");
|
||||
goto err;
|
||||
|
||||
@@ -600,7 +600,7 @@ static int ov2722_s_power(struct v4l2_subdev *sd, int on)
|
||||
}
|
||||
|
||||
/* TODO: remove it. */
|
||||
static int startup(struct v4l2_subdev *sd)
|
||||
static int ov2722_startup(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct ov2722_device *dev = to_ov2722_sensor(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
@@ -662,7 +662,7 @@ static int ov2722_set_fmt(struct v4l2_subdev *sd,
|
||||
dev->pixels_per_line = dev->res->pixels_per_line;
|
||||
dev->lines_per_frame = dev->res->lines_per_frame;
|
||||
|
||||
ret = startup(sd);
|
||||
ret = ov2722_startup(sd);
|
||||
if (ret) {
|
||||
int i = 0;
|
||||
|
||||
@@ -677,7 +677,7 @@ static int ov2722_set_fmt(struct v4l2_subdev *sd,
|
||||
dev_err(&client->dev, "power up failed, continue\n");
|
||||
continue;
|
||||
}
|
||||
ret = startup(sd);
|
||||
ret = ov2722_startup(sd);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, " startup FAILED!\n");
|
||||
} else {
|
||||
|
||||
@@ -438,7 +438,7 @@ static irqreturn_t ser_tx_int(int irq, void *dev_id)
|
||||
* ---------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int startup(struct tty_struct *tty, struct serial_state *info)
|
||||
static int rs_startup(struct tty_struct *tty, struct serial_state *info)
|
||||
{
|
||||
struct tty_port *port = &info->tport;
|
||||
unsigned long flags;
|
||||
@@ -513,7 +513,7 @@ errout:
|
||||
* This routine will shutdown a serial port; interrupts are disabled, and
|
||||
* DTR is dropped if the hangup on close termio flag is on.
|
||||
*/
|
||||
static void shutdown(struct tty_struct *tty, struct serial_state *info)
|
||||
static void rs_shutdown(struct tty_struct *tty, struct serial_state *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
@@ -975,7 +975,7 @@ check_and_exit:
|
||||
change_speed(tty, state, NULL);
|
||||
}
|
||||
} else
|
||||
retval = startup(tty, state);
|
||||
retval = rs_startup(tty, state);
|
||||
tty_unlock(tty);
|
||||
return retval;
|
||||
}
|
||||
@@ -1251,9 +1251,9 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
|
||||
*/
|
||||
rs_wait_until_sent(tty, state->timeout);
|
||||
}
|
||||
shutdown(tty, state);
|
||||
rs_shutdown(tty, state);
|
||||
rs_flush_buffer(tty);
|
||||
|
||||
|
||||
tty_ldisc_flush(tty);
|
||||
port->tty = NULL;
|
||||
|
||||
@@ -1325,7 +1325,7 @@ static void rs_hangup(struct tty_struct *tty)
|
||||
struct serial_state *info = tty->driver_data;
|
||||
|
||||
rs_flush_buffer(tty);
|
||||
shutdown(tty, info);
|
||||
rs_shutdown(tty, info);
|
||||
info->tport.count = 0;
|
||||
tty_port_set_active(&info->tport, false);
|
||||
info->tport.tty = NULL;
|
||||
@@ -1349,7 +1349,7 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
|
||||
port->tty = tty;
|
||||
tty->driver_data = info;
|
||||
|
||||
retval = startup(tty, info);
|
||||
retval = rs_startup(tty, info);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -760,7 +760,7 @@ static void load_code(struct icom_port *icom_port)
|
||||
dma_free_coherent(&dev->dev, 4096, new_page, temp_pci);
|
||||
}
|
||||
|
||||
static int startup(struct icom_port *icom_port)
|
||||
static int icom_startup(struct icom_port *icom_port)
|
||||
{
|
||||
unsigned long temp;
|
||||
unsigned char cable_id, raw_cable_id;
|
||||
@@ -832,7 +832,7 @@ unlock:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void shutdown(struct icom_port *icom_port)
|
||||
static void icom_shutdown(struct icom_port *icom_port)
|
||||
{
|
||||
unsigned long temp;
|
||||
unsigned char cmdReg;
|
||||
@@ -1311,7 +1311,7 @@ static int icom_open(struct uart_port *port)
|
||||
int retval;
|
||||
|
||||
kref_get(&icom_port->adapter->kref);
|
||||
retval = startup(icom_port);
|
||||
retval = icom_startup(icom_port);
|
||||
|
||||
if (retval) {
|
||||
kref_put(&icom_port->adapter->kref, icom_kref_release);
|
||||
@@ -1333,7 +1333,7 @@ static void icom_close(struct uart_port *port)
|
||||
cmdReg = readb(&icom_port->dram->CmdReg);
|
||||
writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
|
||||
|
||||
shutdown(icom_port);
|
||||
icom_shutdown(icom_port);
|
||||
|
||||
kref_put(&icom_port->adapter->kref, icom_kref_release);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user