Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
fc8ab213
Commit
fc8ab213
authored
Sep 08, 2003
by
Anton Blanchard
Browse files
Options
Browse Files
Download
Plain Diff
Merge samba.org:/scratch/anton/export
into samba.org:/scratch/anton/linux-2.5_ppc64
parents
979bd8fe
4f6b41e5
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
174 additions
and
300 deletions
+174
-300
arch/ppc64/Makefile
arch/ppc64/Makefile
+1
-1
arch/ppc64/kernel/irq.c
arch/ppc64/kernel/irq.c
+89
-28
arch/ppc64/kernel/process.c
arch/ppc64/kernel/process.c
+3
-64
arch/ppc64/xmon/xmon.c
arch/ppc64/xmon/xmon.c
+81
-207
No files found.
arch/ppc64/Makefile
View file @
fc8ab213
...
...
@@ -18,7 +18,7 @@ KERNELLOAD := 0xc000000000000000
LDFLAGS
:=
-m
elf64ppc
LDFLAGS_vmlinux
:=
-Bstatic
-e
$(KERNELLOAD)
-Ttext
$(KERNELLOAD)
CFLAGS
+=
-msoft-float
-pipe
-Wno-uninitialized
-mminimal-toc
\
-m
traceback
=
full
-m
cpu
=
power4
-mcpu
=
power4
have_zero_bss
:=
$(
shell
if
$(CC)
-fno-zero-initialized-in-bss
-S
-o
/dev/null
-xc
/dev/null
>
/dev/null 2>&1
;
then
echo
y
;
else
echo
n
;
fi
)
...
...
arch/ppc64/kernel/irq.c
View file @
fc8ab213
...
...
@@ -39,6 +39,7 @@
#include <linux/irq.h>
#include <linux/proc_fs.h>
#include <linux/random.h>
#include <linux/kallsyms.h>
#include <asm/uaccess.h>
#include <asm/bitops.h>
...
...
@@ -350,14 +351,11 @@ int show_interrupts(struct seq_file *p, void *v)
return
0
;
}
extern
char
*
ppc_find_proc_name
(
unsigned
*
p
,
char
*
buf
,
unsigned
buflen
);
static
inline
void
handle_irq_event
(
int
irq
,
struct
pt_regs
*
regs
,
struct
irqaction
*
action
)
static
inline
int
handle_irq_event
(
int
irq
,
struct
pt_regs
*
regs
,
struct
irqaction
*
action
)
{
int
status
=
0
;
int
retval
=
0
;
struct
irqaction
*
first_action
=
action
;
if
(
!
(
action
->
flags
&
SA_INTERRUPT
))
local_irq_enable
();
...
...
@@ -370,30 +368,90 @@ static inline void handle_irq_event(int irq, struct pt_regs *regs,
if
(
status
&
SA_SAMPLE_RANDOM
)
add_interrupt_randomness
(
irq
);
local_irq_disable
();
if
(
retval
!=
1
)
{
static
int
count
=
100
;
char
name_buf
[
256
];
if
(
count
)
{
count
--
;
if
(
retval
)
{
printk
(
"irq event %d: bogus retval mask %x
\n
"
,
irq
,
retval
);
}
else
{
printk
(
"irq %d: nobody cared!
\n
"
,
irq
);
}
dump_stack
();
printk
(
"handlers:
\n
"
);
action
=
first_action
;
do
{
printk
(
"[<%p>]"
,
action
->
handler
);
printk
(
" (%s)
\n
"
,
ppc_find_proc_name
((
unsigned
*
)
action
->
handler
,
name_buf
,
256
));
action
=
action
->
next
;
}
while
(
action
);
}
return
retval
;
}
static
void
__report_bad_irq
(
int
irq
,
irq_desc_t
*
desc
,
irqreturn_t
action_ret
)
{
struct
irqaction
*
action
;
if
(
action_ret
!=
IRQ_HANDLED
&&
action_ret
!=
IRQ_NONE
)
{
printk
(
KERN_ERR
"irq event %d: bogus return value %x
\n
"
,
irq
,
action_ret
);
}
else
{
printk
(
KERN_ERR
"irq %d: nobody cared!
\n
"
,
irq
);
}
dump_stack
();
printk
(
KERN_ERR
"handlers:
\n
"
);
action
=
desc
->
action
;
do
{
printk
(
KERN_ERR
"[<%p>]"
,
action
->
handler
);
print_symbol
(
" (%s)"
,
(
unsigned
long
)
action
->
handler
);
printk
(
"
\n
"
);
action
=
action
->
next
;
}
while
(
action
);
}
static
void
report_bad_irq
(
int
irq
,
irq_desc_t
*
desc
,
irqreturn_t
action_ret
)
{
static
int
count
=
100
;
if
(
count
)
{
count
--
;
__report_bad_irq
(
irq
,
desc
,
action_ret
);
}
}
static
int
noirqdebug
;
static
int
__init
noirqdebug_setup
(
char
*
str
)
{
noirqdebug
=
1
;
printk
(
"IRQ lockup detection disabled
\n
"
);
return
1
;
}
__setup
(
"noirqdebug"
,
noirqdebug_setup
);
/*
* If 99,900 of the previous 100,000 interrupts have not been handled then
* assume that the IRQ is stuck in some manner. Drop a diagnostic and try to
* turn the IRQ off.
*
* (The other 100-of-100,000 interrupts may have been a correctly-functioning
* device sharing an IRQ with the failing one)
*
* Called under desc->lock
*/
static
void
note_interrupt
(
int
irq
,
irq_desc_t
*
desc
,
irqreturn_t
action_ret
)
{
if
(
action_ret
!=
IRQ_HANDLED
)
{
desc
->
irqs_unhandled
++
;
if
(
action_ret
!=
IRQ_NONE
)
report_bad_irq
(
irq
,
desc
,
action_ret
);
}
desc
->
irq_count
++
;
if
(
desc
->
irq_count
<
100000
)
return
;
desc
->
irq_count
=
0
;
if
(
desc
->
irqs_unhandled
>
99900
)
{
/*
* The interrupt is stuck
*/
__report_bad_irq
(
irq
,
desc
,
action_ret
);
/*
* Now kill the IRQ
*/
printk
(
KERN_EMERG
"Disabling IRQ #%d
\n
"
,
irq
);
desc
->
status
|=
IRQ_DISABLED
;
desc
->
handler
->
disable
(
irq
);
}
desc
->
irqs_unhandled
=
0
;
}
/*
* Eventually, this should take an array of interrupts and an array size
* so it can dispatch multiple interrupts.
...
...
@@ -462,10 +520,13 @@ void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq)
* SMP environment.
*/
for
(;;)
{
irqreturn_t
action_ret
;
spin_unlock
(
&
desc
->
lock
);
handle_irq_event
(
irq
,
regs
,
action
);
action_ret
=
handle_irq_event
(
irq
,
regs
,
action
);
spin_lock
(
&
desc
->
lock
);
if
(
!
noirqdebug
)
note_interrupt
(
irq
,
desc
,
action_ret
);
if
(
likely
(
!
(
desc
->
status
&
IRQ_PENDING
)))
break
;
desc
->
status
&=
~
IRQ_PENDING
;
...
...
arch/ppc64/kernel/process.c
View file @
fc8ab213
...
...
@@ -32,6 +32,7 @@
#include <linux/init_task.h>
#include <linux/prctl.h>
#include <linux/ptrace.h>
#include <linux/kallsyms.h>
#include <asm/pgtable.h>
#include <asm/uaccess.h>
...
...
@@ -130,12 +131,9 @@ struct task_struct *__switch_to(struct task_struct *prev,
return
last
;
}
char
*
ppc_find_proc_name
(
unsigned
*
p
,
char
*
buf
,
unsigned
buflen
);
void
show_regs
(
struct
pt_regs
*
regs
)
{
int
i
;
char
name_buf
[
256
];
printk
(
"NIP: %016lX XER: %016lX LR: %016lX
\n
"
,
regs
->
nip
,
regs
->
xer
,
regs
->
link
);
...
...
@@ -170,8 +168,7 @@ void show_regs(struct pt_regs * regs)
* above info out without failing
*/
printk
(
"NIP [%016lx] "
,
regs
->
nip
);
printk
(
"%s
\n
"
,
ppc_find_proc_name
((
unsigned
*
)
regs
->
nip
,
name_buf
,
256
));
print_symbol
(
"%s
\n
"
,
regs
->
nip
);
show_stack
(
current
,
(
unsigned
long
*
)
regs
->
gpr
[
1
]);
}
...
...
@@ -385,62 +382,6 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
return
error
;
}
char
*
ppc_find_proc_name
(
unsigned
*
p
,
char
*
buf
,
unsigned
buflen
)
{
unsigned
long
tb_flags
;
unsigned
short
name_len
;
unsigned
long
tb_start
,
code_start
,
code_ptr
,
code_offset
;
unsigned
int
code_len
;
unsigned
long
end
;
strcpy
(
buf
,
"Unknown"
);
code_ptr
=
(
unsigned
long
)
p
;
code_offset
=
0
;
/* handle functions in text and init sections */
if
(((
unsigned
long
)
p
>=
(
unsigned
long
)
_stext
)
&&
((
unsigned
long
)
p
<
(
unsigned
long
)
_etext
))
end
=
(
unsigned
long
)
_etext
;
else
if
(((
unsigned
long
)
p
>=
(
unsigned
long
)
__init_begin
)
&&
((
unsigned
long
)
p
<
(
unsigned
long
)
__init_end
))
end
=
(
unsigned
long
)
__init_end
;
else
return
buf
;
while
((
unsigned
long
)
p
<
end
)
{
if
(
*
p
==
0
)
{
tb_start
=
(
unsigned
long
)
p
;
++
p
;
/* Point to traceback flags */
tb_flags
=
*
((
unsigned
long
*
)
p
);
p
+=
2
;
/* Skip over traceback flags */
if
(
tb_flags
&
TB_NAME_PRESENT
)
{
if
(
tb_flags
&
TB_PARMINFO
)
++
p
;
/* skip over parminfo data */
if
(
tb_flags
&
TB_HAS_TBOFF
)
{
code_len
=
*
p
;
/* get code length */
code_start
=
tb_start
-
code_len
;
code_offset
=
code_ptr
-
code_start
+
1
;
if
(
code_offset
>
0x100000
)
break
;
++
p
;
/* skip over code size */
}
name_len
=
*
((
unsigned
short
*
)
p
);
if
(
name_len
>
(
buflen
-
20
))
name_len
=
buflen
-
20
;
memcpy
(
buf
,
((
char
*
)
p
)
+
2
,
name_len
);
buf
[
name_len
]
=
0
;
if
(
code_offset
)
sprintf
(
buf
+
name_len
,
"+0x%lx"
,
code_offset
-
1
);
}
break
;
}
++
p
;
}
return
buf
;
}
/*
* These bracket the sleeping functions..
*/
...
...
@@ -480,7 +421,6 @@ void show_stack(struct task_struct *p, unsigned long *_sp)
unsigned
long
ip
;
unsigned
long
stack_page
=
(
unsigned
long
)
p
->
thread_info
;
int
count
=
0
;
char
name_buf
[
256
];
unsigned
long
sp
=
(
unsigned
long
)
_sp
;
if
(
!
p
)
...
...
@@ -499,8 +439,7 @@ void show_stack(struct task_struct *p, unsigned long *_sp)
if
(
__get_user
(
ip
,
(
unsigned
long
*
)(
sp
+
16
)))
break
;
printk
(
"[%016lx] "
,
ip
);
printk
(
"%s
\n
"
,
ppc_find_proc_name
((
unsigned
*
)
ip
,
name_buf
,
256
));
print_symbol
(
"%s
\n
"
,
ip
);
}
while
(
count
++
<
32
);
}
...
...
arch/ppc64/xmon/xmon.c
View file @
fc8ab213
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment