Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
odroid-linux-3.10.y-rt
Commits
3f00d3e8
Commit
3f00d3e8
authored
Nov 07, 2005
by
Linus Torvalds
Browse files
Merge branch 'upstream' of
git://ftp.linux-mips.org/pub/scm/upstream-linus
parents
407cf84f
a637a114
Changes
38
Hide whitespace changes
Inline
Side-by-side
arch/mips/Kconfig
View file @
3f00d3e8
...
...
@@ -958,7 +958,7 @@ config SOC_PNX8550
bool
select DMA_NONCOHERENT
select HW_HAS_PCI
select SYS_HAS_CPU_
R4X00
select SYS_HAS_CPU_
MIPS32_R1
select SYS_SUPPORTS_32BIT_KERNEL
config SWAP_IO_SPACE
...
...
arch/mips/boot/.gitignore
0 → 100644
View file @
3f00d3e8
mkboot
elf2ecoff
zImage
zImage.tmp
arch/mips/configs/pnx8550-jbs_defconfig
View file @
3f00d3e8
...
...
@@ -129,7 +129,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
#
# CPU selection
#
#
CONFIG_CPU_MIPS32_R1
is not set
CONFIG_CPU_MIPS32_R1
=y
# CONFIG_CPU_MIPS32_R2 is not set
# CONFIG_CPU_MIPS64_R1 is not set
# CONFIG_CPU_MIPS64_R2 is not set
...
...
@@ -137,7 +137,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
# CONFIG_CPU_TX39XX is not set
# CONFIG_CPU_VR41XX is not set
# CONFIG_CPU_R4300 is not set
CONFIG_CPU_R4X00
=y
#
CONFIG_CPU_R4X00
is not set
# CONFIG_CPU_TX49XX is not set
# CONFIG_CPU_R5000 is not set
# CONFIG_CPU_R5432 is not set
...
...
@@ -148,10 +148,11 @@ CONFIG_CPU_R4X00=y
# CONFIG_CPU_RM7000 is not set
# CONFIG_CPU_RM9000 is not set
# CONFIG_CPU_SB1 is not set
CONFIG_SYS_HAS_CPU_R4X00=y
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
CONFIG_CPU_MIPS32=y
CONFIG_CPU_MIPSR1=y
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
#
# Kernel type
...
...
@@ -162,11 +163,11 @@ CONFIG_PAGE_SIZE_4KB=y
# CONFIG_PAGE_SIZE_8KB is not set
# CONFIG_PAGE_SIZE_16KB is not set
# CONFIG_PAGE_SIZE_64KB is not set
CONFIG_CPU_HAS_PREFETCH=y
# CONFIG_MIPS_MT is not set
# CONFIG_64BIT_PHYS_ADDR is not set
# CONFIG_CPU_ADVANCED is not set
CONFIG_CPU_HAS_LLSC=y
CONFIG_CPU_HAS_LLDSCD=y
CONFIG_CPU_HAS_SYNC=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
...
...
arch/mips/configs/pnx8550-v2pci_defconfig
View file @
3f00d3e8
...
...
@@ -128,7 +128,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
#
# CPU selection
#
#
CONFIG_CPU_MIPS32_R1
is not set
CONFIG_CPU_MIPS32_R1
=y
# CONFIG_CPU_MIPS32_R2 is not set
# CONFIG_CPU_MIPS64_R1 is not set
# CONFIG_CPU_MIPS64_R2 is not set
...
...
@@ -136,7 +136,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
# CONFIG_CPU_TX39XX is not set
# CONFIG_CPU_VR41XX is not set
# CONFIG_CPU_R4300 is not set
CONFIG_CPU_R4X00
=y
#
CONFIG_CPU_R4X00
is not set
# CONFIG_CPU_TX49XX is not set
# CONFIG_CPU_R5000 is not set
# CONFIG_CPU_R5432 is not set
...
...
@@ -147,10 +147,11 @@ CONFIG_CPU_R4X00=y
# CONFIG_CPU_RM7000 is not set
# CONFIG_CPU_RM9000 is not set
# CONFIG_CPU_SB1 is not set
CONFIG_SYS_HAS_CPU_R4X00=y
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
CONFIG_CPU_MIPS32=y
CONFIG_CPU_MIPSR1=y
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
#
# Kernel type
...
...
@@ -161,6 +162,7 @@ CONFIG_PAGE_SIZE_4KB=y
# CONFIG_PAGE_SIZE_8KB is not set
# CONFIG_PAGE_SIZE_16KB is not set
# CONFIG_PAGE_SIZE_64KB is not set
CONFIG_CPU_HAS_PREFETCH=y
# CONFIG_MIPS_MT is not set
# CONFIG_64BIT_PHYS_ADDR is not set
CONFIG_CPU_ADVANCED=y
...
...
arch/mips/ddb5xxx/common/rtc_ds1386.c
View file @
3f00d3e8
...
...
@@ -41,7 +41,9 @@ rtc_ds1386_get_time(void)
u8
byte
;
u8
temp
;
unsigned
int
year
,
month
,
day
,
hour
,
minute
,
second
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
/* let us freeze external registers */
byte
=
READ_RTC
(
0xB
);
byte
&=
0x3f
;
...
...
@@ -60,6 +62,7 @@ rtc_ds1386_get_time(void)
/* enable time transfer */
byte
|=
0x80
;
WRITE_RTC
(
0xB
,
byte
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
/* calc hour */
if
(
temp
&
0x40
)
{
...
...
@@ -81,7 +84,9 @@ rtc_ds1386_set_time(unsigned long t)
u8
byte
;
u8
temp
;
u8
year
,
month
,
day
,
hour
,
minute
,
second
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
/* let us freeze external registers */
byte
=
READ_RTC
(
0xB
);
byte
&=
0x3f
;
...
...
@@ -133,6 +138,7 @@ rtc_ds1386_set_time(unsigned long t)
if
(
second
!=
READ_RTC
(
0x1
))
{
WRITE_RTC
(
0x1
,
second
);
}
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
0
;
}
...
...
arch/mips/dec/time.c
View file @
3f00d3e8
...
...
@@ -37,10 +37,25 @@
#include <asm/dec/machtype.h>
/*
* Returns true if a clock update is in progress
*/
static
inline
unsigned
char
dec_rtc_is_updating
(
void
)
{
unsigned
char
uip
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
uip
=
(
CMOS_READ
(
RTC_FREQ_SELECT
)
&
RTC_UIP
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
uip
;
}
static
unsigned
long
dec_rtc_get_time
(
void
)
{
unsigned
int
year
,
mon
,
day
,
hour
,
min
,
sec
,
real_year
;
int
i
;
unsigned
long
flags
;
/* The Linux interpretation of the DS1287 clock register contents:
* When the Update-In-Progress (UIP) flag goes from 1 to 0, the
...
...
@@ -49,11 +64,12 @@ static unsigned long dec_rtc_get_time(void)
*/
/* read RTC exactly on falling edge of update flag */
for
(
i
=
0
;
i
<
1000000
;
i
++
)
/* may take up to 1 second... */
if
(
CMOS_READ
(
RTC_FREQ_SELECT
)
&
RTC_UIP
)
if
(
dec_rtc_is_updating
()
)
break
;
for
(
i
=
0
;
i
<
1000000
;
i
++
)
/* must try at least 2.228 ms */
if
(
!
(
CMOS_READ
(
RTC_FREQ_SELECT
)
&
RTC_UIP
))
if
(
!
dec_rtc_is_updating
(
))
break
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
/* Isn't this overkill? UIP above should guarantee consistency */
do
{
sec
=
CMOS_READ
(
RTC_SECONDS
);
...
...
@@ -77,6 +93,7 @@ static unsigned long dec_rtc_get_time(void)
* of unused BBU RAM locations.
*/
real_year
=
CMOS_READ
(
RTC_DEC_YEAR
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
year
+=
real_year
-
72
+
2000
;
return
mktime
(
year
,
mon
,
day
,
hour
,
min
,
sec
);
...
...
@@ -95,6 +112,8 @@ static int dec_rtc_set_mmss(unsigned long nowtime)
int
real_seconds
,
real_minutes
,
cmos_minutes
;
unsigned
char
save_control
,
save_freq_select
;
/* irq are locally disabled here */
spin_lock
(
&
rtc_lock
);
/* tell the clock it's being set */
save_control
=
CMOS_READ
(
RTC_CONTROL
);
CMOS_WRITE
((
save_control
|
RTC_SET
),
RTC_CONTROL
);
...
...
@@ -141,6 +160,7 @@ static int dec_rtc_set_mmss(unsigned long nowtime)
*/
CMOS_WRITE
(
save_control
,
RTC_CONTROL
);
CMOS_WRITE
(
save_freq_select
,
RTC_FREQ_SELECT
);
spin_unlock
(
&
rtc_lock
);
return
retval
;
}
...
...
arch/mips/jmr3927/common/rtc_ds1742.c
View file @
3f00d3e8
...
...
@@ -57,7 +57,9 @@ rtc_ds1742_get_time(void)
{
unsigned
int
year
,
month
,
day
,
hour
,
minute
,
second
;
unsigned
int
century
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
CMOS_WRITE
(
RTC_READ
,
RTC_CONTROL
);
second
=
BCD2BIN
(
CMOS_READ
(
RTC_SECONDS
)
&
RTC_SECONDS_MASK
);
minute
=
BCD2BIN
(
CMOS_READ
(
RTC_MINUTES
));
...
...
@@ -67,6 +69,7 @@ rtc_ds1742_get_time(void)
year
=
BCD2BIN
(
CMOS_READ
(
RTC_YEAR
));
century
=
BCD2BIN
(
CMOS_READ
(
RTC_CENTURY
)
&
RTC_CENTURY_MASK
);
CMOS_WRITE
(
0
,
RTC_CONTROL
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
year
+=
century
*
100
;
...
...
@@ -81,7 +84,9 @@ rtc_ds1742_set_time(unsigned long t)
u8
year
,
month
,
day
,
hour
,
minute
,
second
;
u8
cmos_year
,
cmos_month
,
cmos_day
,
cmos_hour
,
cmos_minute
,
cmos_second
;
int
cmos_century
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
CMOS_WRITE
(
RTC_READ
,
RTC_CONTROL
);
cmos_second
=
(
u8
)(
CMOS_READ
(
RTC_SECONDS
)
&
RTC_SECONDS_MASK
);
cmos_minute
=
(
u8
)
CMOS_READ
(
RTC_MINUTES
);
...
...
@@ -139,6 +144,7 @@ rtc_ds1742_set_time(unsigned long t)
/* RTC_CENTURY and RTC_CONTROL share same address... */
CMOS_WRITE
(
cmos_century
,
RTC_CONTROL
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
0
;
}
...
...
arch/mips/kernel/irixsig.c
View file @
3f00d3e8
...
...
@@ -502,8 +502,7 @@ asmlinkage int irix_sigpoll_sys(unsigned long __user *set,
while
(
1
)
{
long
tmp
=
0
;
current
->
state
=
TASK_INTERRUPTIBLE
;
expire
=
schedule_timeout
(
expire
);
expire
=
schedule_timeout_interruptible
(
expire
);
for
(
i
=
0
;
i
<=
4
;
i
++
)
tmp
|=
(
current
->
pending
.
signal
.
sig
[
i
]
&
kset
.
sig
[
i
]);
...
...
arch/mips/kernel/rtlx.c
View file @
3f00d3e8
...
...
@@ -20,42 +20,42 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/vmalloc.h>
#include <linux/elf.h>
#include <linux/seq_file.h>
#include <linux/syscalls.h>
#include <linux/moduleloader.h>
#include <linux/interrupt.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <asm/mipsmtregs.h>
#include <asm/cacheflush.h>
#include <asm/atomic.h>
#include <asm/bitops.h>
#include <asm/cpu.h>
#include <asm/processor.h>
#include <asm/system.h>
#include <asm/rtlx.h>
#include <asm/uaccess.h>
#define RTLX_MAJOR 64
#define RTLX_TARG_VPE 1
struct
rtlx_info
*
rtlx
;
static
struct
rtlx_info
*
rtlx
;
static
int
major
;
static
char
module_name
[]
=
"rtlx"
;
static
inline
int
spacefree
(
int
read
,
int
write
,
int
size
);
static
struct
irqaction
irq
;
static
int
irq_num
;
static
inline
int
spacefree
(
int
read
,
int
write
,
int
size
)
{
if
(
read
==
write
)
{
/*
* never fill the buffer completely, so indexes are always
* equal if empty and only empty, or !equal if data available
*/
return
size
-
1
;
}
return
((
read
+
size
-
write
)
%
size
)
-
1
;
}
static
struct
chan_waitqueues
{
wait_queue_head_t
rt_queue
;
wait_queue_head_t
lx_queue
;
}
channel_wqs
[
RTLX_CHANNELS
];
static
struct
irqaction
irq
;
static
int
irq_num
;
extern
void
*
vpe_get_shared
(
int
index
);
static
void
rtlx_dispatch
(
struct
pt_regs
*
regs
)
...
...
@@ -63,9 +63,8 @@ static void rtlx_dispatch(struct pt_regs *regs)
do_IRQ
(
MIPSCPU_INT_BASE
+
MIPS_CPU_RTLX_IRQ
,
regs
);
}
irqreturn_t
rtlx_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
irqreturn_t
rtlx_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
irqreturn_t
r
=
IRQ_HANDLED
;
int
i
;
for
(
i
=
0
;
i
<
RTLX_CHANNELS
;
i
++
)
{
...
...
@@ -75,30 +74,7 @@ irqreturn_t rtlx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
wake_up_interruptible
(
&
channel_wqs
[
i
].
lx_queue
);
}
return
r
;
}
void
dump_rtlx
(
void
)
{
int
i
;
printk
(
"id 0x%lx state %d
\n
"
,
rtlx
->
id
,
rtlx
->
state
);
for
(
i
=
0
;
i
<
RTLX_CHANNELS
;
i
++
)
{
struct
rtlx_channel
*
chan
=
&
rtlx
->
channel
[
i
];
printk
(
" rt_state %d lx_state %d buffer_size %d
\n
"
,
chan
->
rt_state
,
chan
->
lx_state
,
chan
->
buffer_size
);
printk
(
" rt_read %d rt_write %d
\n
"
,
chan
->
rt_read
,
chan
->
rt_write
);
printk
(
" lx_read %d lx_write %d
\n
"
,
chan
->
lx_read
,
chan
->
lx_write
);
printk
(
" rt_buffer <%s>
\n
"
,
chan
->
rt_buffer
);
printk
(
" lx_buffer <%s>
\n
"
,
chan
->
lx_buffer
);
}
return
IRQ_HANDLED
;
}
/* call when we have the address of the shared structure from the SP side. */
...
...
@@ -108,7 +84,7 @@ static int rtlx_init(struct rtlx_info *rtlxi)
if
(
rtlxi
->
id
!=
RTLX_ID
)
{
printk
(
KERN_WARNING
"no valid RTLX id at 0x%p
\n
"
,
rtlxi
);
return
(
-
ENOEXEC
)
;
return
-
ENOEXEC
;
}
/* initialise the wait queues */
...
...
@@ -120,9 +96,8 @@ static int rtlx_init(struct rtlx_info *rtlxi)
/* set up for interrupt handling */
memset
(
&
irq
,
0
,
sizeof
(
struct
irqaction
));
if
(
cpu_has_vint
)
{
if
(
cpu_has_vint
)
set_vi_handler
(
MIPS_CPU_RTLX_IRQ
,
rtlx_dispatch
);
}
irq_num
=
MIPSCPU_INT_BASE
+
MIPS_CPU_RTLX_IRQ
;
irq
.
handler
=
rtlx_interrupt
;
...
...
@@ -132,7 +107,8 @@ static int rtlx_init(struct rtlx_info *rtlxi)
setup_irq
(
irq_num
,
&
irq
);
rtlx
=
rtlxi
;
return
(
0
);
return
0
;
}
/* only allow one open process at a time to open each channel */
...
...
@@ -147,36 +123,36 @@ static int rtlx_open(struct inode *inode, struct file *filp)
if
(
rtlx
==
NULL
)
{
struct
rtlx_info
**
p
;
if
(
(
p
=
vpe_get_shared
(
RTLX_TARG_VPE
))
==
NULL
)
{
printk
(
" vpe_get_shared is NULL. Has an SP program been loaded?
\n
"
);
return
(
-
EFAULT
);
printk
(
KERN_ERR
"vpe_get_shared is NULL. "
"Has an SP program been loaded?
\n
"
);
return
-
EFAULT
;
}
if
(
*
p
==
NULL
)
{
printk
(
"
vpe_shared %p %p
\n
"
,
p
,
*
p
);
return
(
-
EFAULT
)
;
printk
(
KERN_ERR
"vpe_shared %p %p
\n
"
,
p
,
*
p
);
return
-
EFAULT
;
}
if
((
ret
=
rtlx_init
(
*
p
))
<
0
)
return
(
ret
)
;
return
ret
;
}
chan
=
&
rtlx
->
channel
[
minor
];
/* already open? */
if
(
chan
->
lx_state
==
RTLX_STATE_OPENED
)
return
(
-
EBUSY
);
if
(
test_and_set_bit
(
RTLX_STATE_OPENED
,
&
chan
->
lx_state
))
return
-
EBUSY
;
chan
->
lx_state
=
RTLX_STATE_OPENED
;
return
(
0
);
return
0
;
}
static
int
rtlx_release
(
struct
inode
*
inode
,
struct
file
*
filp
)
{
int
minor
;
int
minor
=
MINOR
(
inode
->
i_rdev
)
;
minor
=
MINOR
(
inode
->
i_rdev
);
rtlx
->
channel
[
minor
].
lx_state
=
RTLX_STATE_UNUSED
;
return
(
0
);
clear_bit
(
RTLX_STATE_OPENED
,
&
rtlx
->
channel
[
minor
].
lx_state
);
smp_mb__after_clear_bit
();
return
0
;
}
static
unsigned
int
rtlx_poll
(
struct
file
*
file
,
poll_table
*
wait
)
...
...
@@ -199,12 +175,13 @@ static unsigned int rtlx_poll(struct file *file, poll_table * wait)
if
(
spacefree
(
chan
->
rt_read
,
chan
->
rt_write
,
chan
->
buffer_size
))
mask
|=
POLLOUT
|
POLLWRNORM
;
return
(
mask
)
;
return
mask
;
}
static
ssize_t
rtlx_read
(
struct
file
*
file
,
char
__user
*
buffer
,
size_t
count
,
loff_t
*
ppos
)
{
unsigned
long
failed
;
size_t
fl
=
0L
;
int
minor
;
struct
rtlx_channel
*
lx
;
...
...
@@ -216,7 +193,7 @@ static ssize_t rtlx_read(struct file *file, char __user * buffer, size_t count,
/* data available? */
if
(
lx
->
lx_write
==
lx
->
lx_read
)
{
if
(
file
->
f_flags
&
O_NONBLOCK
)
return
(
0
)
;
/
/
-EAGAIN makes cat whinge
return
0
;
/
*
-EAGAIN makes cat whinge
*/
/* go to sleep */
add_wait_queue
(
&
channel_wqs
[
minor
].
lx_queue
,
&
wait
);
...
...
@@ -232,39 +209,39 @@ static ssize_t rtlx_read(struct file *file, char __user * buffer, size_t count,
}
/* find out how much in total */
count
=
min
(
count
,
(
size_t
)(
lx
->
lx_write
+
lx
->
buffer_size
-
lx
->
lx_read
)
%
lx
->
buffer_size
);
count
=
min
(
count
,
(
size_t
)(
lx
->
lx_write
+
lx
->
buffer_size
-
lx
->
lx_read
)
%
lx
->
buffer_size
);
/* then how much from the read pointer onwards */
fl
=
min
(
count
,
(
size_t
)
lx
->
buffer_size
-
lx
->
lx_read
);
fl
=
min
(
count
,
(
size_t
)
lx
->
buffer_size
-
lx
->
lx_read
);
copy_to_user
(
buffer
,
&
lx
->
lx_buffer
[
lx
->
lx_read
],
fl
);
failed
=
copy_to_user
(
buffer
,
&
lx
->
lx_buffer
[
lx
->
lx_read
],
fl
);
if
(
failed
)
{
count
=
fl
-
failed
;
goto
out
;
}
/* and if there is anything left at the beginning of the buffer */
if
(
count
-
fl
)
copy_to_user
(
buffer
+
fl
,
lx
->
lx_buffer
,
count
-
fl
);
if
(
count
-
fl
)
{
failed
=
copy_to_user
(
buffer
+
fl
,
lx
->
lx_buffer
,
count
-
fl
);
if
(
failed
)
{
count
-=
failed
;
goto
out
;
}
}
out:
/* update the index */
lx
->
lx_read
+=
count
;
lx
->
lx_read
%=
lx
->
buffer_size
;
return
(
count
);
}
static
inline
int
spacefree
(
int
read
,
int
write
,
int
size
)
{
if
(
read
==
write
)
{
/* never fill the buffer completely, so indexes are always equal if empty
and only empty, or !equal if data available */
return
(
size
-
1
);
}
return
((
read
+
size
-
write
)
%
size
)
-
1
;
return
count
;
}
static
ssize_t
rtlx_write
(
struct
file
*
file
,
const
char
__user
*
buffer
,
size_t
count
,
loff_t
*
ppos
)
{
unsigned
long
failed
;
int
minor
;
struct
rtlx_channel
*
rt
;
size_t
fl
;
...
...
@@ -277,7 +254,7 @@ static ssize_t rtlx_write(struct file *file, const char __user * buffer,
if
(
!
spacefree
(
rt
->
rt_read
,
rt
->
rt_write
,
rt
->
buffer_size
))
{
if
(
file
->
f_flags
&
O_NONBLOCK
)
return
(
-
EAGAIN
)
;
return
-
EAGAIN
;
add_wait_queue
(
&
channel_wqs
[
minor
].
rt_queue
,
&
wait
);
set_current_state
(
TASK_INTERRUPTIBLE
);
...
...
@@ -290,52 +267,64 @@ static ssize_t rtlx_write(struct file *file, const char __user * buffer,
}
/* total number of bytes to copy */
count
=
min
(
count
,
(
size_t
)
spacefree
(
rt
->
rt_read
,
rt
->
rt_write
,
rt
->
buffer_size
)
);
count
=
min
(
count
,
(
size_t
)
spacefree
(
rt
->
rt_read
,
rt
->
rt_write
,
rt
->
buffer_size
)
);
/* first bit from write pointer to the end of the buffer, or count */
fl
=
min
(
count
,
(
size_t
)
rt
->
buffer_size
-
rt
->
rt_write
);
copy_from_user
(
&
rt
->
rt_buffer
[
rt
->
rt_write
],
buffer
,
fl
);
failed
=
copy_from_user
(
&
rt
->
rt_buffer
[
rt
->
rt_write
],
buffer
,
fl
);
if
(
failed
)
{
count
=
fl
-
failed
;
goto
out
;
}
/* if there's any left copy to the beginning of the buffer */
if
(
count
-
fl
)
copy_from_user
(
rt
->
rt_buffer
,
buffer
+
fl
,
count
-
fl
);
if
(
count
-
fl
)
{
failed
=
copy_from_user
(
rt
->
rt_buffer
,
buffer
+
fl
,
count
-
fl
);
if
(
failed
)
{
count
-=
failed
;
goto
out
;
}
}
out:
rt
->
rt_write
+=
count
;
rt
->
rt_write
%=
rt
->
buffer_size
;
return
(
count
)
;
return
count
;
}
static
struct
file_operations
rtlx_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
rtlx_open
,
.
release
=
rtlx_release
,
.
write
=
rtlx_write
,
.
read
=
rtlx_read
,
.
poll
=
rtlx_poll
.
owner
=
THIS_MODULE
,
.
open
=
rtlx_open
,
.
release
=
rtlx_release
,
.
write
=
rtlx_write
,
.
read
=
rtlx_read
,
.
poll
=
rtlx_poll
};
static
int
rtlx_module_init
(
void
)
static
char
register_chrdev_failed
[]
__initdata
=
KERN_ERR
"rtlx_module_init: unable to register device
\n
"
;
static
int
__init
rtlx_module_init
(
void
)
{
if
((
major
=
register_chrdev
(
RTLX_MAJOR
,
module_name
,
&
rtlx_fops
))
<
0
)
{
printk
(
"rtlx_module_init: unable to register device
\n
"
);
return
(
-
EBUSY
);
major
=
register_chrdev
(
0
,
module_name
,
&
rtlx_fops
);
if
(
major
<
0
)
{
printk
(
register_chrdev_failed
);
return
major
;
}
if
(
major
==
0
)
major
=
RTLX_MAJOR
;
return
(
0
);
return
0
;
}
static
void
rtlx_module_exit
(
void
)
static
void
__exit
rtlx_module_exit
(
void
)
{
unregister_chrdev
(
major
,
module_name
);
}
module_init
(
rtlx_module_init
);
module_exit
(
rtlx_module_exit
);
MODULE_DESCRIPTION
(
"MIPS RTLX"
);
MODULE_AUTHOR
(
"Elizabeth Clarke, MIPS Technologies, Inc"
);
MODULE_AUTHOR
(
"Elizabeth Clarke, MIPS Technologies, Inc
.
"
);
MODULE_LICENSE
(
"GPL"
);
arch/mips/kernel/signal.c
View file @
3f00d3e8
...
...
@@ -384,9 +384,6 @@ give_sigsegv:
return
0
;
}
extern
void
setup_rt_frame_n32
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
set
,
siginfo_t
*
info
);
static
inline
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
...
...
arch/mips/kernel/signal32.c
View file @
3f00d3e8
...
...
@@ -647,8 +647,8 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
return
(
void
*
)((
sp
-
frame_size
)
&
ALMASK
);
}
void
setup_frame_32
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
set
)
int
setup_frame_32
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
set
)
{
struct
sigframe
*
frame
;
int
err
=
0
;
...
...
@@ -694,13 +694,15 @@ void setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
current
->
comm
,
current
->
pid
,