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
8c78000c
Commit
8c78000c
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 1.3.3
parent
aea252fa
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
468 additions
and
158 deletions
+468
-158
Makefile
Makefile
+1
-1
arch/i386/boot/compressed/misc.c
arch/i386/boot/compressed/misc.c
+1
-0
arch/i386/boot/setup.S
arch/i386/boot/setup.S
+4
-2
arch/i386/lib/Makefile
arch/i386/lib/Makefile
+2
-0
drivers/char/console.c
drivers/char/console.c
+260
-28
drivers/char/tty_io.c
drivers/char/tty_io.c
+8
-0
drivers/char/vt.c
drivers/char/vt.c
+76
-7
drivers/net/8390.c
drivers/net/8390.c
+12
-21
drivers/net/8390.h
drivers/net/8390.h
+1
-1
drivers/net/ne.c
drivers/net/ne.c
+13
-13
drivers/net/ppp.c
drivers/net/ppp.c
+3
-3
fs/binfmt_elf.c
fs/binfmt_elf.c
+51
-65
fs/readdir.c
fs/readdir.c
+7
-7
include/linux/kd.h
include/linux/kd.h
+4
-1
include/linux/tty.h
include/linux/tty.h
+4
-1
include/linux/vt.h
include/linux/vt.h
+10
-0
kernel/ksyms.c
kernel/ksyms.c
+2
-0
kernel/panic.c
kernel/panic.c
+9
-0
mm/memory.c
mm/memory.c
+0
-8
No files found.
Makefile
View file @
8c78000c
VERSION
=
1
PATCHLEVEL
=
3
SUBLEVEL
=
2
SUBLEVEL
=
3
ARCH
=
i386
...
...
arch/i386/boot/compressed/misc.c
View file @
8c78000c
...
...
@@ -28,6 +28,7 @@ struct screen_info {
unsigned
short
orig_video_ega_bx
;
unsigned
short
orig_video_ega_cx
;
unsigned
char
orig_video_lines
;
unsigned
char
orig_video_isVGA
;
};
/*
...
...
arch/i386/boot/setup.S
View file @
8c78000c
...
...
@@ -160,10 +160,12 @@ good_sig:
int
0x10
mov
bx
,
ax
mov
ax
,#
0x5019
movb
[
15
],#
0
!
by
default
,
no
VGA
cmp
bl
,#
0x1a
!
1
a
means
VGA
,
anything
else
EGA
or
lower
jne
novga
jne
novga
movb
[
15
],#
1
!
we
've detected a VGA
call
chsvga
novga
:
mov
[
14
],
a
x
novga
:
mov
[
14
],
a
l
mov
ah
,#
0x03
!
read
cursor
pos
xor
bh
,
bh
!
clear
bh
int
0x10
!
save
it
in
known
place
,
con_init
fetches
...
...
arch/i386/lib/Makefile
View file @
8c78000c
...
...
@@ -17,6 +17,8 @@ lib.a: $(OBJS)
dep
:
modules
:
#
# include a dependency file if one exists
#
...
...
drivers/char/console.c
View file @
8c78000c
This diff is collapsed.
Click to expand it.
drivers/char/tty_io.c
View file @
8c78000c
...
...
@@ -102,6 +102,9 @@ static int tty_ioctl(struct inode * inode, struct file * file,
unsigned
int
cmd
,
unsigned
long
arg
);
static
int
tty_fasync
(
struct
inode
*
inode
,
struct
file
*
filp
,
int
on
);
extern
void
reset_palette
(
int
currcons
)
;
extern
void
set_palette
(
void
)
;
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
...
...
@@ -497,6 +500,7 @@ void reset_vc(unsigned int new_console)
vt_cons
[
new_console
]
->
vt_mode
.
frsig
=
0
;
vt_cons
[
new_console
]
->
vt_pid
=
-
1
;
vt_cons
[
new_console
]
->
vt_newvt
=
-
1
;
reset_palette
(
new_console
)
;
}
/*
...
...
@@ -561,6 +565,10 @@ void complete_change_console(unsigned int new_console)
do_blank_screen
(
1
);
}
/* Set the colour palette for this VT */
if
(
vt_cons
[
new_console
]
->
vc_mode
==
KD_TEXT
)
set_palette
()
;
/*
* Wake anyone waiting for their VT to activate
*/
...
...
drivers/char/vt.c
View file @
8c78000c
...
...
@@ -63,7 +63,8 @@ extern void do_unblank_screen(void);
extern
unsigned
int
keymap_count
;
/*
* routines to load custom translation table and EGA/VGA font from console.c
* routines to load custom translation table, EGA/VGA font and
* VGA colour palette from console.c
*/
extern
int
con_set_trans_old
(
char
*
table
);
extern
int
con_get_trans_old
(
char
*
table
);
...
...
@@ -74,10 +75,14 @@ extern int con_set_unimap(ushort ct, struct unipair *list);
extern
int
con_get_unimap
(
ushort
ct
,
ushort
*
uct
,
struct
unipair
*
list
);
extern
int
con_set_font
(
char
*
fontmap
,
int
ch512
);
extern
int
con_get_font
(
char
*
fontmap
);
extern
int
con_set_cmap
(
unsigned
char
*
cmap
);
extern
int
con_get_cmap
(
unsigned
char
*
cmap
);
extern
void
reset_palette
(
int
currcons
);
extern
int
con_adjust_height
(
unsigned
long
fontheight
);
extern
int
video_mode_512ch
;
extern
unsigned
long
video_font_height
;
extern
unsigned
long
video_scan_lines
;
/*
* these are the valid i/o ports we're allowed to change. they map all the
...
...
@@ -95,13 +100,13 @@ extern unsigned long video_font_height;
* tty.
*/
static
void
static
int
kd_size_changed
(
int
row
,
int
col
)
{
struct
task_struct
*
p
;
int
i
;
if
(
!
row
&&
!
col
)
return
;
if
(
!
row
&&
!
col
)
return
0
;
for
(
i
=
0
;
i
<
MAX_NR_CONSOLES
;
i
++
)
{
...
...
@@ -120,6 +125,8 @@ kd_size_changed(int row, int col)
send_sig
(
SIGWINCH
,
p
,
1
);
}
}
return
0
;
}
/*
...
...
@@ -864,7 +871,61 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return
i
;
ll
=
get_fs_word
(
&
vtsizes
->
v_rows
);
cc
=
get_fs_word
(
&
vtsizes
->
v_cols
);
return
vc_resize
(
ll
,
cc
);
i
=
vc_resize
(
ll
,
cc
);
return
i
?
i
:
kd_size_changed
(
ll
,
cc
);
}
case
VT_RESIZEX
:
{
struct
vt_consize
*
vtconsize
=
(
struct
vt_consize
*
)
arg
;
ushort
ll
,
cc
,
vlin
,
clin
,
vcol
,
ccol
;
if
(
!
perm
)
return
-
EPERM
;
i
=
verify_area
(
VERIFY_READ
,
(
void
*
)
vtconsize
,
sizeof
(
struct
vt_consize
));
if
(
i
)
return
i
;
ll
=
get_fs_word
(
&
vtconsize
->
v_rows
);
cc
=
get_fs_word
(
&
vtconsize
->
v_cols
);
vlin
=
get_fs_word
(
&
vtconsize
->
v_vlin
);
clin
=
get_fs_word
(
&
vtconsize
->
v_clin
);
vcol
=
get_fs_word
(
&
vtconsize
->
v_vcol
);
ccol
=
get_fs_word
(
&
vtconsize
->
v_ccol
);
vlin
=
vlin
?
vlin
:
video_scan_lines
;
if
(
clin
)
{
if
(
ll
)
{
if
(
ll
!=
vlin
/
clin
)
return
EINVAL
;
/* Parameters don't add up */
}
else
ll
=
vlin
/
clin
;
}
if
(
vcol
&&
ccol
)
{
if
(
cc
)
{
if
(
cc
!=
vcol
/
ccol
)
return
EINVAL
;
}
else
cc
=
vcol
/
ccol
;
}
if
(
clin
>
32
)
return
EINVAL
;
if
(
vlin
)
video_scan_lines
=
vlin
;
if
(
clin
)
video_font_height
=
clin
;
i
=
vc_resize
(
ll
,
cc
);
if
(
i
)
return
i
;
kd_size_changed
(
ll
,
cc
);
return
0
;
}
case
PIO_FONT
:
...
...
@@ -882,6 +943,16 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return
con_get_font
((
char
*
)
arg
);
/* con_get_font() defined in console.c */
case
PIO_CMAP
:
if
(
!
perm
)
return
-
EPERM
;
return
con_set_cmap
((
char
*
)
arg
);
/* con_set_cmap() defined in console.c */
case
GIO_CMAP
:
return
con_get_cmap
((
char
*
)
arg
);
/* con_get_cmap() defined in console.c */
case
PIO_FONTX
:
{
struct
consolefontdesc
cfdarg
;
...
...
@@ -903,9 +974,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
if
(
i
)
return
i
;
i
=
con_adjust_height
(
cfdarg
.
charheight
);
if
(
i
<=
0
)
return
i
;
kd_size_changed
(
i
,
0
);
return
0
;
return
(
i
<=
0
)
?
i
:
kd_size_changed
(
i
,
0
);
}
else
return
-
EINVAL
;
}
...
...
drivers/net/8390.c
View file @
8c78000c
...
...
@@ -16,9 +16,9 @@
This is not a complete driver, it must be combined with board-specific
code such as ne.c, wd.c, 3c503.c, etc.
13/04/95 -- Don't blindly swallow ENISR_RDC interrupts for non-shared
memory cards. We need to follow these closely for neX000 cards.
P
lus other minor cleanups. -- Paul Gortmaker
Changelog:
P
aul Gortmaker : remove set_bit lock, other cleanups.
*/
...
...
@@ -129,7 +129,6 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
int
e8390_base
=
dev
->
base_addr
;
struct
ei_device
*
ei_local
=
(
struct
ei_device
*
)
dev
->
priv
;
int
length
,
send_length
;
unsigned
long
flags
;
/*
* We normally shouldn't be called if dev->tbusy is set, but the
...
...
@@ -177,22 +176,14 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
if
(
skb
->
len
<=
0
)
return
0
;
save_flags
(
flags
);
cli
();
/* Block a timer-based transmit from overlapping. */
if
((
set_bit
(
0
,
(
void
*
)
&
dev
->
tbusy
)
!=
0
)
||
ei_local
->
irqlock
)
{
printk
(
"%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d
\n
"
,
dev
->
name
,
dev
->
interrupt
,
ei_local
->
irqlock
,
ei_local
->
tx1
,
ei_local
->
tx2
,
ei_local
->
lasttx
);
restore_flags
(
flags
);
return
1
;
}
/* Mask interrupts from the ethercard. */
outb_p
(
0x00
,
e8390_base
+
EN0_IMR
);
if
(
dev
->
interrupt
)
{
printk
(
"%s: Tx request while isr active.
\n
"
,
dev
->
name
);
outb_p
(
ENISR_ALL
,
e8390_base
+
EN0_IMR
);
return
1
;
}
ei_local
->
irqlock
=
1
;
restore_flags
(
flags
);
send_length
=
ETH_ZLEN
<
length
?
length
:
ETH_ZLEN
;
...
...
@@ -314,17 +305,17 @@ void ei_interrupt(int irq, struct pt_regs * regs)
outb_p
(
ENISR_TX_ERR
,
e8390_base
+
EN0_ISR
);
/* Ack intr. */
}
/* Ignore any RDC interrupts that make it back to here. */
if
(
interrupts
&
ENISR_RDC
)
{
if
(
dev
->
mem_start
)
outb_p
(
ENISR_RDC
,
e8390_base
+
EN0_ISR
);
}
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
e8390_base
+
E8390_CMD
);
}
if
(
(
interrupts
&
~
ENISR_RDC
)
&&
ei_debug
)
{
if
(
interrupts
&&
ei_debug
)
{
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
e8390_base
+
E8390_CMD
);
if
(
nr_serviced
=
=
MAX_SERVICE
)
{
if
(
nr_serviced
>
=
MAX_SERVICE
)
{
printk
(
"%s: Too much work at interrupt, status %#2.2x
\n
"
,
dev
->
name
,
interrupts
);
outb_p
(
ENISR_ALL
,
e8390_base
+
EN0_ISR
);
/* Ack. most intrs. */
...
...
@@ -501,7 +492,7 @@ static void ei_receive(struct device *dev)
ei_local
->
current_page
=
next_frame
;
outb_p
(
next_frame
-
1
,
e8390_base
+
EN0_BOUNDARY
);
}
/* If any worth-while packets have been received,
dev_rint
()
/* If any worth-while packets have been received,
netif_rx
()
has done a mark_bh(NET_BH) for us and will work on them
when we get to the bottom-half routine. */
...
...
drivers/net/8390.h
View file @
8c78000c
...
...
@@ -45,12 +45,12 @@ struct ei_device {
unsigned
word16
:
1
;
/* We have the 16-bit (vs 8-bit) version of the card. */
unsigned
txing
:
1
;
/* Transmit Active */
unsigned
irqlock
:
1
;
/* 8390's intrs disabled when '1'. */
unsigned
dmaing
:
1
;
/* Remote DMA Active */
unsigned
pingpong
:
1
;
/* Using the ping-pong driver */
unsigned
char
tx_start_page
,
rx_start_page
,
stop_page
;
unsigned
char
current_page
;
/* Read pointer in buffer */
unsigned
char
interface_num
;
/* Net port (AUI, 10bT.) to use. */
unsigned
char
txqueue
;
/* Tx Packet buffer queue length. */
unsigned
char
dmaing
;
/* Remote DMA (Tx/Rx/Active) */
short
tx1
,
tx2
;
/* Packet lengths for ping-pong tx. */
short
lasttx
;
/* Alpha version consistency check. */
unsigned
char
reg0
;
/* Register '0' in a WD8013 */
...
...
drivers/net/ne.c
View file @
8c78000c
...
...
@@ -16,12 +16,10 @@
boards. Currently it supports the NE1000, NE2000, many clones,
and some Cabletron products.
13/04/95 -- Change in philosophy. We now monitor ENISR_RDC for
handshaking the Tx PIO xfers. If we don't get a RDC within a
reasonable period of time, we know the 8390 has gone south, and we
kick the board before it locks the system. Also use set_bit() to
create atomic locks on the PIO xfers, and added some defines
that the end user can play with to save memory. -- Paul Gortmaker
Changelog:
Paul Gortmaker : use ENISR_RDC to monitor Tx PIO uploads, made
sanity checks and bad clone support optional.
*/
...
...
@@ -335,6 +333,7 @@ ne_reset_8390(struct device *dev)
if
(
ei_debug
>
1
)
printk
(
"resetting the 8390 t=%ld..."
,
jiffies
);
ei_status
.
txing
=
0
;
ei_status
.
dmaing
=
0
;
outb_p
(
tmp
,
NE_BASE
+
NE_RESET
);
/* This check _should_not_ be necessary, omit eventually. */
...
...
@@ -343,10 +342,11 @@ ne_reset_8390(struct device *dev)
printk
(
"%s: ne_reset_8390() did not complete.
\n
"
,
dev
->
name
);
break
;
}
outb_p
(
ENISR_RESET
,
NE_BASE
+
NE_RESET
);
/* Ack intr. */
}
/* Block input and output, similar to the Crynwr packet driver. If you
porting to a new ethercard
look at the packet driver source for hints.
are porting to a new ethercard,
look at the packet driver source for hints.
The NEx000 doesn't share it on-board packet memory -- you have to put
the packet out through the "remote DMA" dataport using outb. */
...
...
@@ -359,7 +359,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
int
nic_base
=
dev
->
base_addr
;
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if
(
set_bit
(
0
,(
void
*
)
&
ei_status
.
dmaing
)
)
{
if
(
ei_status
.
dmaing
)
{
if
(
ei_debug
>
0
)
printk
(
"%s: DMAing conflict in ne_block_input "
"[DMAstat:%d][irqlock:%d][intr:%d].
\n
"
,
...
...
@@ -367,7 +367,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
dev
->
interrupt
);
return
0
;
}
ei_status
.
dmaing
|=
0x0
2
;
ei_status
.
dmaing
|=
0x0
1
;
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
outb_p
(
count
&
0xff
,
nic_base
+
EN0_RCNTLO
);
outb_p
(
count
>>
8
,
nic_base
+
EN0_RCNTHI
);
...
...
@@ -409,7 +409,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
}
#endif
outb_p
(
ENISR_RDC
,
nic_base
+
EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x0
3
;
ei_status
.
dmaing
&=
~
0x0
1
;
return
ring_offset
+
count
;
}
...
...
@@ -430,7 +430,7 @@ ne_block_output(struct device *dev, int count,
count
++
;
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if
(
set_bit
(
0
,(
void
*
)
&
ei_status
.
dmaing
)
)
{
if
(
ei_status
.
dmaing
)
{
if
(
ei_debug
>
0
)
printk
(
"%s: DMAing conflict in ne_block_output."
"[DMAstat:%d][irqlock:%d][intr:%d]
\n
"
,
...
...
@@ -438,7 +438,7 @@ ne_block_output(struct device *dev, int count,
dev
->
interrupt
);
return
;
}
ei_status
.
dmaing
|=
0x0
4
;
ei_status
.
dmaing
|=
0x0
1
;
/* We should already be in page 0, but to be safe... */
outb_p
(
E8390_PAGE0
+
E8390_START
+
E8390_NODMA
,
nic_base
+
NE_CMD
);
...
...
@@ -510,7 +510,7 @@ ne_block_output(struct device *dev, int count,
}
outb_p
(
ENISR_RDC
,
nic_base
+
EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x0
5
;
ei_status
.
dmaing
&=
~
0x0
1
;
return
;
}
...
...
drivers/net/ppp.c
View file @
8c78000c
...
...
@@ -504,6 +504,9 @@ ppp_close(struct tty_struct *tty)
ppp_release
(
ppp
);
PRINTKN
(
2
,(
KERN_INFO
"ppp: channel %s closing.
\n
"
,
ppp
->
dev
->
name
));
#ifdef MODULE
MOD_DEC_USE_COUNT
;
#endif
}
}
...
...
@@ -612,9 +615,6 @@ ppp_dev_close(struct device *dev)
PRINTKN
(
2
,(
KERN_INFO
"ppp: channel %s going down for IP packets!
\n
"
,
dev
->
name
));
CHECK_PPP
(
-
ENXIO
);
#ifdef MODULE
MOD_DEC_USE_COUNT
;
#endif
return
0
;
}
...
...
fs/binfmt_elf.c
View file @
8c78000c
...
...
@@ -78,7 +78,7 @@ static void padzero(unsigned long elf_bss)
}
}
unsigned
long
*
create_elf_tables
(
char
*
p
,
int
argc
,
int
envc
,
struct
elfhdr
*
exec
,
unsigned
int
load_addr
,
int
ibcs
)
unsigned
long
*
create_elf_tables
(
char
*
p
,
int
argc
,
int
envc
,
struct
elfhdr
*
exec
,
unsigned
int
load_addr
,
unsigned
int
interp_load_addr
,
int
ibcs
)
{
unsigned
long
*
argv
,
*
envp
,
*
dlinfo
;
unsigned
long
*
sp
;
...
...
@@ -129,11 +129,11 @@ unsigned long * create_elf_tables(char * p,int argc,int envc,struct elfhdr * exe
put_fs_long
(
4
,
dlinfo
++
);
put_fs_long
(
sizeof
(
struct
elf_phdr
),
dlinfo
++
);
put_fs_long
(
5
,
dlinfo
++
);
put_fs_long
(
exec
->
e_phnum
,
dlinfo
++
);
put_fs_long
(
9
,
dlinfo
++
);
put_fs_long
((
unsigned
long
)
exec
->
e_entry
,
dlinfo
++
);
put_fs_long
(
7
,
dlinfo
++
);
put_fs_long
(
SHM_RANGE_START
,
dlinfo
++
);
put_fs_long
(
7
,
dlinfo
++
);
put_fs_long
(
interp_load_addr
,
dlinfo
++
);
put_fs_long
(
8
,
dlinfo
++
);
put_fs_long
(
0
,
dlinfo
++
);
put_fs_long
(
6
,
dlinfo
++
);
put_fs_long
(
PAGE_SIZE
,
dlinfo
++
);
put_fs_long
(
0
,
dlinfo
++
);
put_fs_long
(
0
,
dlinfo
++
);
}
;
}
put_fs_long
((
unsigned
long
)
argc
,
--
sp
);
current
->
mm
->
arg_start
=
(
unsigned
long
)
p
;
...
...
@@ -159,7 +159,7 @@ unsigned long * create_elf_tables(char * p,int argc,int envc,struct elfhdr * exe
an ELF header */
static
unsigned
int
load_elf_interp
(
struct
elfhdr
*
interp_elf_ex
,
struct
inode
*
interpreter_inode
)
struct
inode
*
interpreter_inode
,
unsigned
int
*
interp_load_addr
)
{
struct
file
*
file
;
struct
elf_phdr
*
elf_phdata
=
NULL
;
...
...
@@ -184,7 +184,7 @@ static unsigned int load_elf_interp(struct elfhdr * interp_elf_ex,
(
!
interpreter_inode
->
i_op
||
!
interpreter_inode
->
i_op
->
default_file_ops
->
mmap
)){
return
0xffffffff
;
}
;
}
/* Now read in all of the header information */
...
...
@@ -202,52 +202,32 @@ static unsigned int load_elf_interp(struct elfhdr * interp_elf_ex,
if
(
elf_exec_fileno
<
0
)
return
0xffffffff
;
file
=
current
->
files
->
fd
[
elf_exec_fileno
];
/*
* First calculate the maximum range of VMA that we need to
* use, and then allocate the entire thing. Then unmap
* and remap the individual portions of the file to the
* correct address.
*/
if
(
interp_elf_ex
->
e_type
==
ET_DYN
)
{
int
maxvma
=
0
;
eppnt
=
elf_phdata
;
for
(
i
=
0
;
i
<
interp_elf_ex
->
e_phnum
;
i
++
,
eppnt
++
)
if
(
eppnt
->
p_type
==
PT_LOAD
)
{
if
(
maxvma
<
eppnt
->
p_vaddr
+
eppnt
->
p_memsz
)
maxvma
=
eppnt
->
p_vaddr
+
eppnt
->
p_memsz
;
}
error
=
do_mmap
(
file
,
0
,
maxvma
,
PROT_READ
,
MAP_PRIVATE
|
MAP_DENYWRITE
,
0
);
if
(
error
<
0
&&
error
>
-
1024
)
goto
oops
;
/* Real error */
load_addr
=
error
;
SYS
(
munmap
)(
load_addr
,
maxvma
);
}
else
{
/*
* For normal executables, we do not use this offset,
* since the vaddr field contains an absolute address.
*/
load_addr
=
0
;
}
eppnt
=
elf_phdata
;
for
(
i
=
0
;
i
<
interp_elf_ex
->
e_phnum
;
i
++
,
eppnt
++
)
if
(
eppnt
->
p_type
==
PT_LOAD
)
{
int
elf_prot
=
(
eppnt
->
p_flags
&
PF_R
)
?
PROT_READ
:
0
;
int
elf_type
=
MAP_PRIVATE
|
MAP_DENYWRITE
;
int
elf_prot
=
0
;
unsigned
long
vaddr
=
0
;
if
(
eppnt
->
p_flags
&
PF_R
)
elf_prot
=
PROT_READ
;
if
(
eppnt
->
p_flags
&
PF_W
)
elf_prot
|=
PROT_WRITE
;
if
(
eppnt
->
p_flags
&
PF_X
)
elf_prot
|=
PROT_EXEC
;
if
(
interp_elf_ex
->
e_type
==
ET_EXEC
)
{
elf_type
|=
MAP_FIXED
;
vaddr
=
eppnt
->
p_vaddr
;
}
error
=
do_mmap
(
file
,
load_addr
+
(
eppnt
->
p_vaddr
&
0xfffff000
)
,
eppnt
->
p_filesz
+
(
eppnt
->
p_
vaddr
&
0xfff
),
vaddr
&
0xfffff000
,
eppnt
->
p_filesz
+
(
vaddr
&
0xfff
),
elf_prot
,
MAP_PRIVATE
|
MAP_DENYWRITE
|
MAP_FIXED
,
elf_type
,
eppnt
->
p_offset
&
0xfffff000
);
if
(
error
<
0
&&
error
>
-
1024
)
break
;
/* Real error */
if
(
!
load_addr
&&
interp_elf_ex
->
e_type
==
ET_DYN
)
load_addr
=
error
;
/*
* Find the end of the file mapping for this phdr, and keep
* track of the largest address we see for this.
...
...
@@ -265,7 +245,6 @@ static unsigned int load_elf_interp(struct elfhdr * interp_elf_ex,
/* Now use mmap to map the library into memory. */
oops:
SYS
(
close
)(
elf_exec_fileno
);
if
(
error
<
0
&&
error
>
-
1024
)
{
kfree
(
elf_phdata
);
...
...
@@ -288,6 +267,7 @@ static unsigned int load_elf_interp(struct elfhdr * interp_elf_ex,
MAP_FIXED
|
MAP_PRIVATE
,
0
);
kfree
(
elf_phdata
);
*
interp_load_addr
=
load_addr
;
return
((
unsigned
int
)
interp_elf_ex
->
e_entry
)
+
load_addr
;
}
...
...
@@ -358,7 +338,7 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
unsigned
int
elf_bss
,
k
,
elf_brk
;
int
retval
;
char
*
elf_interpreter
;
unsigned
int
elf_entry
;
unsigned
int
elf_entry
,
interp_load_addr
=
0
;
int
status
;
unsigned
int
start_code
,
end_code
,
end_data
;
unsigned
int
elf_stack
;
...
...
@@ -385,7 +365,7 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
!
bprm
->
inode
->
i_op
->
default_file_ops
->
mmap
)){
MOD_DEC_USE_COUNT
;
return
-
ENOEXEC
;
}
;
}
/* Now read in all of the header information */
...
...
@@ -440,25 +420,30 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
#if 0
printk("Using ELF interpreter %s\n", elf_interpreter);
#endif
if
(
retval
>=
0
)
if
(
retval
>=
0
)
{
old_fs
=
get_fs
();
/* This could probably be optimized */
set_fs
(
get_ds
());
retval
=
namei
(
elf_interpreter
,
&
interpreter_inode
);
set_fs
(
old_fs
);
}
if
(
retval
>=
0
)
retval
=
read_exec
(
interpreter_inode
,
0
,
bprm
->
buf
,
128
,
1
);
if
(
retval
>=
0
){
if
(
retval
>=
0
)
{
interp_ex
=
*
((
struct
exec
*
)
bprm
->
buf
);
/* exec-header */
interp_elf_ex
=
*
((
struct
elfhdr
*
)
bprm
->
buf
);
/* exec-header */
}
;
}
if
(
retval
<
0
)
{
kfree
(
elf_phdata
);
kfree
(
elf_interpreter
);
MOD_DEC_USE_COUNT
;
return
retval
;
}
;
}
;
kfree
(
elf_phdata
);
kfree
(
elf_interpreter
);
MOD_DEC_USE_COUNT
;
return
retval
;
}
}
elf_ppnt
++
;
}
;
}
/* Some simple consistency checks for the interpreter */
if
(
elf_interpreter
){
...
...
@@ -468,7 +453,7 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
kfree
(
elf_phdata
);
MOD_DEC_USE_COUNT
;
return
-
ELIBACC
;
}
;
}
/* Now figure out which format our binary is */
if
((
N_MAGIC
(
interp_ex
)
!=
OMAGIC
)
&&
(
N_MAGIC
(
interp_ex
)
!=
ZMAGIC
)
&&
...
...
@@ -485,7 +470,7 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
kfree
(
elf_phdata
);
MOD_DEC_USE_COUNT
;
return
-
ELIBBAD
;
}
;
}
}
/* OK, we are done with that, now set up the arg stuff,
...
...
@@ -501,8 +486,8 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
if
(
elf_interpreter
)
{
bprm
->
p
=
copy_strings
(
1
,
&
passed_p
,
bprm
->
page
,
bprm
->
p
,
2
);
bprm
->
argc
++
;
}
;
}
;
}
}
if
(
!
bprm
->
p
)
{
if
(
elf_interpreter
)
{
kfree
(
elf_interpreter
);
...
...
@@ -548,7 +533,7 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
load_aout_interp
(
&
interp_ex
,
interpreter_inode
);
if
(
interpreter_type
&
2
)
elf_entry
=
load_elf_interp
(
&
interp_elf_ex
,
interpreter_inode
);
load_elf_interp
(
&
interp_elf_ex
,
interpreter_inode
,
&
interp_load_addr
);
old_fs
=
get_fs
();
set_fs
(
get_ds
());
...
...
@@ -562,8 +547,8 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
send_sig
(
SIGSEGV
,
current
,
0
);
MOD_DEC_USE_COUNT
;
return
0
;
}
;
}
;
}
}
if
(
elf_ppnt
->
p_type
==
PT_LOAD
)
{
...
...
@@ -593,9 +578,9 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
if
(
end_data
<
k
)
end_data
=
k
;
k
=
elf_ppnt
->
p_vaddr
+
elf_ppnt
->
p_memsz
;
if
(
k
>
elf_brk
)
elf_brk
=
k
;
}
;
}
elf_ppnt
++
;
}
;
}
set_fs
(
old_fs
);
kfree
(
elf_phdata
);
...
...
@@ -627,7 +612,8 @@ load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
bprm
->
argc
,
bprm
->
envc
,
(
interpreter_type
==
INTERPRETER_ELF
?
&
elf_ex
:
NULL
),
load_addr
,
load_addr
,
interp_load_addr
,
(
interpreter_type
==
INTERPRETER_AOUT
?
0
:
1
));
if
(
interpreter_type
==
INTERPRETER_AOUT
)
current
->
mm
->
arg_start
+=
strlen
(
passed_fileno
)
+
1
;
...
...
@@ -714,7 +700,7 @@ load_elf_library(int fd){
(
!
inode
->
i_op
||
!
inode
->
i_op
->
default_file_ops
->
mmap
)){
MOD_DEC_USE_COUNT
;
return
-
ENOEXEC
;
}
;
}
/* Now read in all of the header information */
...
...
@@ -737,7 +723,7 @@ load_elf_library(int fd){
kfree
(
elf_phdata
);
MOD_DEC_USE_COUNT
;
return
-
ENOEXEC
;
}
;
}
while
(
elf_phdata
->
p_type
!=
PT_LOAD
)
elf_phdata
++
;
...
...
fs/readdir.c
View file @
8c78000c
...
...
@@ -45,11 +45,11 @@ static int fillonedir(void * __buf, char * name, int namlen, off_t offset, ino_t
return
-
EINVAL
;
buf
->
count
++
;
dirent
=
buf
->
dirent
;
put_
fs_long
(
ino
,
&
dirent
->
d_ino
);
put_
fs_long
(
offset
,
&
dirent
->
d_offset
);
put_
fs_word
(
namlen
,
&
dirent
->
d_namlen
);
put_
user
(
ino
,
&
dirent
->
d_ino
);
put_
user
(
offset
,
&
dirent
->
d_offset
);
put_
user
(
namlen
,
&
dirent
->
d_namlen
);
memcpy_tofs
(
dirent
->
d_name
,
name
,
namlen
);
put_
fs_byte
(
0
,
dirent
->
d_name
+
namlen
);
put_
user
(
0
,
dirent
->
d_name
+
namlen
);
return
0
;
}
...
...
@@ -106,10 +106,10 @@ static int filldir(void * __buf, char * name, int namlen, off_t offset, ino_t in
put_user
(
offset
,
&
dirent
->
d_off
);
dirent
=
buf
->
current
;
buf
->
previous
=
dirent
;
put_
fs_long
(
ino
,
&
dirent
->
d_ino
);
put_
fs_word
(
reclen
,
&
dirent
->
d_reclen
);
put_
user
(
ino
,
&
dirent
->
d_ino
);
put_
user
(
reclen
,
&
dirent
->
d_reclen
);
memcpy_tofs
(
dirent
->
d_name
,
name
,
namlen
);
put_
fs_byte
(
0
,
dirent
->
d_name
+
namlen
);
put_
user
(
0
,
dirent
->
d_name
+
namlen
);
((
char
*
)
dirent
)
+=
reclen
;
buf
->
current
=
dirent
;
buf
->
count
-=
reclen
;
...
...
include/linux/kd.h
View file @
8c78000c
...
...
@@ -15,6 +15,9 @@ struct consolefontdesc {
char
*
chardata
;
/* font data in expanded form */
};
#define GIO_CMAP 0x4B70
/* gets colour palette on VGA+ */
#define PIO_CMAP 0x4B71
/* sets colour palette on VGA+ */
#define KIOCSOUND 0x4B2F
/* start sound generation (0 for off) */
#define KDMKTONE 0x4B30
/* generate tone */
...
...
@@ -129,6 +132,6 @@ struct kbkeycode {
/* note: 0x4B00-0x4B4E all have had a value at some time;
don't reuse for the time being */
/* note: 0x4B60-0x4B6C used above */
/* note: 0x4B60-0x4B6C
, 0x4B70, 0x4B71
used above */
#endif
/* _LINUX_KD_H */
include/linux/tty.h
View file @
8c78000c
...
...
@@ -44,6 +44,7 @@ struct screen_info {
unsigned
short
orig_video_ega_bx
;
unsigned
short
orig_video_ega_cx
;
unsigned
char
orig_video_lines
;
unsigned
char
orig_video_isVGA
;
unsigned
short
orig_video_points
;
};
...
...
@@ -58,12 +59,14 @@ extern struct screen_info screen_info;
#define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx)
#define ORIG_VIDEO_EGA_CX (screen_info.orig_video_ega_cx)
#define ORIG_VIDEO_LINES (screen_info.orig_video_lines)
#define ORIG_VIDEO_ISVGA (screen_info.orig_video_isVGA)
#define ORIG_VIDEO_POINTS (screen_info.orig_video_points)
#define VIDEO_TYPE_MDA 0x10
/* Monochrome Text Display */
#define VIDEO_TYPE_CGA 0x11
/* CGA Display */
#define VIDEO_TYPE_EGAM 0x20
/* EGA/VGA in Monochrome Mode */
#define VIDEO_TYPE_EGAC 0x21
/* EGA/VGA in Color Mode */
#define VIDEO_TYPE_EGAC 0x21
/* EGA in Color Mode */
#define VIDEO_TYPE_VGAC 0x22
/* VGA+ in Color Mode */
/*
* This character is the same as _POSIX_VDISABLE: it cannot be used as
...
...
include/linux/vt.h
View file @
8c78000c
...
...
@@ -39,4 +39,14 @@ struct vt_sizes {
};
#define VT_RESIZE 0x5609
/* set kernel's idea of screensize */
struct
vt_consize
{
ushort
v_rows
;
/* number of rows */
ushort
v_cols
;
/* number of columns */
ushort
v_vlin
;
/* number of pixel rows on screen */
ushort
v_clin
;
/* number of pixel rows per character */
ushort
v_vcol
;
/* number of pixel columns on screen */
ushort
v_ccol
;
/* number of pixel columns per character */
};
#define VT_RESIZEX 0x560A
/* set kernel's idea of screensize + more */
#endif
/* _LINUX_VT_H */
kernel/ksyms.c
View file @
8c78000c
...
...
@@ -39,6 +39,7 @@
#include <linux/netdevice.h>
#ifdef CONFIG_INET
#include <linux/ip.h>
#include <linux/etherdevice.h>
#include <net/protocol.h>
#include <net/arp.h>
#include <net/tcp.h>
...
...
@@ -303,6 +304,7 @@ struct symbol_table symbol_table = {
X
(
register_netdev
),
X
(
unregister_netdev
),
X
(
ether_setup
),
X
(
eth_type_trans
),
X
(
alloc_skb
),
X
(
kfree_skb
),
X
(
dev_kfree_skb
),
...
...
kernel/panic.c
View file @
8c78000c
...
...
@@ -30,3 +30,12 @@ NORET_TYPE void panic(const char * fmt, ...)
sys_sync
();
for
(;;);
}
/*
* GCC 2.5.8 doesn't always optimize correctly; see include/asm/segment.h
*/
int
bad_user_access_length
(
void
)
{
panic
(
"bad_user_access_length executed (not cool, dude)"
);
}
mm/memory.c
View file @
8c78000c
...
...
@@ -831,10 +831,6 @@ static int try_to_share(unsigned long to_address, struct vm_area_struct * to_are
if
(
pte_dirty
(
from
))
{
if
(
!
(
from_area
->
vm_flags
&
VM_SHARED
))
return
0
;
if
(
pte_write
(
from
))
{
printk
(
"nonwritable, but dirty, shared page
\n
"
);
return
0
;
}
}
/* is the page reasonable at all? */
if
(
pte_page
(
from
)
>=
high_memory
)
...
...
@@ -869,10 +865,6 @@ static int try_to_share(unsigned long to_address, struct vm_area_struct * to_are
if
(
in_swap_cache
(
pte_page
(
from
)))
{
if
(
!
(
from_area
->
vm_flags
&
VM_SHARED
))
return
0
;
if
(
!
pte_write
(
from
))
{
printk
(
"nonwritable, but dirty, shared page
\n
"
);
return
0
;
}
}
copy_page
(
pte_page
(
from
),
newpage
);
*
to_table
=
mk_pte
(
newpage
,
to_area
->
vm_page_prot
);
...
...
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