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
nexedi
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