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
494ec6f3
Commit
494ec6f3
authored
Sep 21, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/linux-ia64-release-2.6.9
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
ed81c78c
67da3ff6
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
108 additions
and
95 deletions
+108
-95
arch/ia64/configs/sn2_defconfig
arch/ia64/configs/sn2_defconfig
+10
-7
arch/ia64/ia32/binfmt_elf32.c
arch/ia64/ia32/binfmt_elf32.c
+39
-0
arch/ia64/ia32/ia32_entry.S
arch/ia64/ia32/ia32_entry.S
+2
-2
arch/ia64/ia32/ia32_signal.c
arch/ia64/ia32/ia32_signal.c
+22
-11
arch/ia64/ia32/ia32_support.c
arch/ia64/ia32/ia32_support.c
+25
-3
arch/ia64/ia32/ia32priv.h
arch/ia64/ia32/ia32priv.h
+8
-3
arch/ia64/ia32/sys_ia32.c
arch/ia64/ia32/sys_ia32.c
+0
-67
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+1
-1
include/asm-ia64/ia32.h
include/asm-ia64/ia32.h
+1
-1
No files found.
arch/ia64/configs/sn2_defconfig
View file @
494ec6f3
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.9-rc
1
# Fri
Aug 27 22:00:00
2004
# Linux kernel version: 2.6.9-rc
2
# Fri
Sep 17 13:58:32
2004
#
#
...
...
@@ -13,6 +13,7 @@ CONFIG_CLEAN_COMPILE=y
#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
...
...
@@ -33,6 +34,8 @@ CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y
# CONFIG_TINY_SHMEM is not set
#
# Loadable module support
...
...
@@ -54,6 +57,7 @@ CONFIG_MMU=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_TIME_INTERPOLATION=y
CONFIG_EFI=y
CONFIG_GENERIC_IOMAP=y
# CONFIG_IA64_GENERIC is not set
# CONFIG_IA64_DIG is not set
# CONFIG_IA64_HP_ZX1 is not set
...
...
@@ -210,7 +214,6 @@ CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
CONFIG_IDEDMA_PCI_AUTO=y
# CONFIG_IDEDMA_ONLYDISK is not set
CONFIG_BLK_DEV_ADMA=y
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
...
...
@@ -277,7 +280,8 @@ CONFIG_SCSI_FC_ATTRS=y
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_MEGARAID is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
CONFIG_SCSI_SATA=y
# CONFIG_SCSI_SATA_SVW is not set
# CONFIG_SCSI_ATA_PIIX is not set
...
...
@@ -334,8 +338,7 @@ CONFIG_DM_ZERO=m
# Fusion MPT device support
#
CONFIG_FUSION=y
CONFIG_FUSION_MAX_SGE=40
CONFIG_FUSION_ISENSE=m
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=m
#
...
...
@@ -550,7 +553,6 @@ CONFIG_SERIAL_SGI_L1_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_QIC02_TAPE is not set
#
# IPMI
...
...
@@ -575,6 +577,7 @@ CONFIG_EFI_RTC=y
CONFIG_RAW_DRIVER=m
# CONFIG_HPET is not set
CONFIG_MAX_RAW_DEVS=256
CONFIG_MMTIMER=y
#
# I2C support
...
...
arch/ia64/ia32/binfmt_elf32.c
View file @
494ec6f3
...
...
@@ -48,6 +48,7 @@ static void elf32_set_personality (void);
extern
struct
page
*
ia32_shared_page
[];
extern
unsigned
long
*
ia32_gdt
;
extern
struct
page
*
ia32_gate_page
;
struct
page
*
ia32_install_shared_page
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
,
int
*
type
)
...
...
@@ -59,10 +60,25 @@ ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int
return
pg
;
}
struct
page
*
ia32_install_gate_page
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
,
int
*
type
)
{
struct
page
*
pg
=
ia32_gate_page
;
get_page
(
pg
);
if
(
type
)
*
type
=
VM_FAULT_MINOR
;
return
pg
;
}
static
struct
vm_operations_struct
ia32_shared_page_vm_ops
=
{
.
nopage
=
ia32_install_shared_page
};
static
struct
vm_operations_struct
ia32_gate_page_vm_ops
=
{
.
nopage
=
ia32_install_gate_page
};
void
ia64_elf32_init
(
struct
pt_regs
*
regs
)
{
...
...
@@ -89,6 +105,29 @@ ia64_elf32_init (struct pt_regs *regs)
up_write
(
&
current
->
mm
->
mmap_sem
);
}
/*
* When user stack is not executable, push sigreturn code to stack makes
* segmentation fault raised when returning to kernel. So now sigreturn
* code is locked in specific gate page, which is pointed by pretcode
* when setup_frame_ia32
*/
vma
=
kmem_cache_alloc
(
vm_area_cachep
,
SLAB_KERNEL
);
if
(
vma
)
{
memset
(
vma
,
0
,
sizeof
(
*
vma
));
vma
->
vm_mm
=
current
->
mm
;
vma
->
vm_start
=
IA32_GATE_OFFSET
;
vma
->
vm_end
=
vma
->
vm_start
+
PAGE_SIZE
;
vma
->
vm_page_prot
=
PAGE_COPY_EXEC
;
vma
->
vm_flags
=
VM_READ
|
VM_MAYREAD
|
VM_EXEC
|
VM_MAYEXEC
|
VM_RESERVED
;
vma
->
vm_ops
=
&
ia32_gate_page_vm_ops
;
down_write
(
&
current
->
mm
->
mmap_sem
);
{
insert_vm_struct
(
current
->
mm
,
vma
);
}
up_write
(
&
current
->
mm
->
mmap_sem
);
}
/*
* Install LDT as anonymous memory. This gives us all-zero segment descriptors
* until a task modifies them via modify_ldt().
...
...
arch/ia64/ia32/ia32_entry.S
View file @
494ec6f3
...
...
@@ -311,7 +311,7 @@ ia32_syscall_table:
data8
sys_ni_syscall
/*
old
profil
syscall
holder
*/
data8
compat_sys_statfs
data8
compat_sys_fstatfs
/*
100
*/
data8
sys
32_ioperm
data8
sys
_ni_syscall
/*
ioperm
*/
data8
compat_sys_socketcall
data8
sys_syslog
data8
compat_sys_setitimer
...
...
@@ -320,7 +320,7 @@ ia32_syscall_table:
data8
compat_sys_newlstat
data8
compat_sys_newfstat
data8
sys_ni_syscall
data8
sys
32_iopl
/*
110
*/
data8
sys
_ni_syscall
/*
iopl
*/
/*
110
*/
data8
sys_vhangup
data8
sys_ni_syscall
/*
used
to
be
sys_idle
*/
data8
sys_ni_syscall
...
...
arch/ia64/ia32/ia32_signal.c
View file @
494ec6f3
...
...
@@ -853,14 +853,19 @@ setup_frame_ia32 (int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs
unsigned
int
restorer
=
IA32_SA_RESTORER
(
ka
);
err
|=
__put_user
(
restorer
,
&
frame
->
pretcode
);
}
else
{
err
|=
__put_user
((
long
)
frame
->
retcode
,
&
frame
->
pretcode
);
/* This is popl %eax ; movl $,%eax ; int $0x80 */
err
|=
__put_user
(
0xb858
,
(
short
*
)(
frame
->
retcode
+
0
));
err
|=
__put_user
(
__IA32_NR_sigreturn
&
0xffff
,
(
short
*
)(
frame
->
retcode
+
2
));
err
|=
__put_user
(
__IA32_NR_sigreturn
>>
16
,
(
short
*
)(
frame
->
retcode
+
4
));
err
|=
__put_user
(
0x80cd
,
(
short
*
)(
frame
->
retcode
+
6
));
/* Pointing to restorer in ia32 gate page */
err
|=
__put_user
(
IA32_GATE_OFFSET
,
&
frame
->
pretcode
);
}
/* This is popl %eax ; movl $,%eax ; int $0x80
* and there for historical reasons only.
* See arch/i386/kernel/signal.c
*/
err
|=
__put_user
(
0xb858
,
(
short
*
)(
frame
->
retcode
+
0
));
err
|=
__put_user
(
__IA32_NR_sigreturn
,
(
int
*
)(
frame
->
retcode
+
2
));
err
|=
__put_user
(
0x80cd
,
(
short
*
)(
frame
->
retcode
+
6
));
if
(
err
)
goto
give_sigsegv
;
...
...
@@ -922,13 +927,19 @@ setup_rt_frame_ia32 (int sig, struct k_sigaction *ka, siginfo_t *info,
unsigned
int
restorer
=
IA32_SA_RESTORER
(
ka
);
err
|=
__put_user
(
restorer
,
&
frame
->
pretcode
);
}
else
{
err
|=
__put_user
((
long
)
frame
->
retcode
,
&
frame
->
pretcode
);
/* This is movl $,%eax ; int $0x80 */
err
|=
__put_user
(
0xb8
,
(
char
*
)(
frame
->
retcode
+
0
));
err
|=
__put_user
(
__IA32_NR_rt_sigreturn
,
(
int
*
)(
frame
->
retcode
+
1
));
err
|=
__put_user
(
0x80cd
,
(
short
*
)(
frame
->
retcode
+
5
));
/* Pointing to rt_restorer in ia32 gate page */
err
|=
__put_user
(
IA32_GATE_OFFSET
+
8
,
&
frame
->
pretcode
);
}
/* This is movl $,%eax ; int $0x80
* and there for historical reasons only.
* See arch/i386/kernel/signal.c
*/
err
|=
__put_user
(
0xb8
,
(
char
*
)(
frame
->
retcode
+
0
));
err
|=
__put_user
(
__IA32_NR_rt_sigreturn
,
(
int
*
)(
frame
->
retcode
+
1
));
err
|=
__put_user
(
0x80cd
,
(
short
*
)(
frame
->
retcode
+
5
));
if
(
err
)
goto
give_sigsegv
;
...
...
arch/ia64/ia32/ia32_support.c
View file @
494ec6f3
...
...
@@ -33,6 +33,7 @@ struct exec_domain ia32_exec_domain;
struct
page
*
ia32_shared_page
[
NR_CPUS
];
unsigned
long
*
ia32_boot_gdt
;
unsigned
long
*
cpu_gdt_table
[
NR_CPUS
];
struct
page
*
ia32_gate_page
;
static
unsigned
long
load_desc
(
u16
selector
)
...
...
@@ -158,7 +159,7 @@ ia32_gdt_init (void)
/*
* Setup IA32 GDT and TSS
*/
void
static
void
ia32_boot_gdt_init
(
void
)
{
unsigned
long
ldt_size
;
...
...
@@ -172,12 +173,12 @@ ia32_boot_gdt_init (void)
/* CS descriptor in IA-32 (scrambled) format */
ia32_boot_gdt
[
__USER_CS
>>
3
]
=
IA32_SEG_DESCRIPTOR
(
0
,
(
IA32_
PAGE_OFFSET
-
1
)
>>
IA32_PAGE_SHIFT
,
=
IA32_SEG_DESCRIPTOR
(
0
,
(
IA32_
GATE_END
-
1
)
>>
IA32_PAGE_SHIFT
,
0xb
,
1
,
3
,
1
,
1
,
1
,
1
);
/* DS descriptor in IA-32 (scrambled) format */
ia32_boot_gdt
[
__USER_DS
>>
3
]
=
IA32_SEG_DESCRIPTOR
(
0
,
(
IA32_
PAGE_OFFSET
-
1
)
>>
IA32_PAGE_SHIFT
,
=
IA32_SEG_DESCRIPTOR
(
0
,
(
IA32_
GATE_END
-
1
)
>>
IA32_PAGE_SHIFT
,
0x3
,
1
,
3
,
1
,
1
,
1
,
1
);
ldt_size
=
PAGE_ALIGN
(
IA32_LDT_ENTRIES
*
IA32_LDT_ENTRY_SIZE
);
...
...
@@ -187,6 +188,27 @@ ia32_boot_gdt_init (void)
0x2
,
0
,
3
,
1
,
1
,
1
,
0
);
}
static
void
ia32_gate_page_init
(
void
)
{
unsigned
long
*
sr
;
ia32_gate_page
=
alloc_page
(
GFP_KERNEL
);
sr
=
page_address
(
ia32_gate_page
);
/* This is popl %eax ; movl $,%eax ; int $0x80 */
*
sr
++
=
0xb858
|
(
__IA32_NR_sigreturn
<<
16
)
|
(
0x80cdUL
<<
48
);
/* This is movl $,%eax ; int $0x80 */
*
sr
=
0xb8
|
(
__IA32_NR_rt_sigreturn
<<
8
)
|
(
0x80cdUL
<<
40
);
}
void
ia32_mem_init
(
void
)
{
ia32_boot_gdt_init
();
ia32_gate_page_init
();
}
/*
* Handle bad IA32 interrupt via syscall
*/
...
...
arch/ia64/ia32/ia32priv.h
View file @
494ec6f3
...
...
@@ -168,6 +168,9 @@ struct ia32_user_fxsr_struct {
#define IA32_SA_HANDLER(ka) ((unsigned long) (ka)->sa.sa_handler & 0xffffffff)
#define IA32_SA_RESTORER(ka) ((unsigned long) (ka)->sa.sa_handler >> 32)
#define __IA32_NR_sigreturn 119
#define __IA32_NR_rt_sigreturn 173
struct
sigaction32
{
unsigned
int
sa_handler
;
/* Really a pointer, but need to deal with 32 bits */
unsigned
int
sa_flags
;
...
...
@@ -324,14 +327,16 @@ struct old_linux32_dirent {
#define IA32_PAGE_OFFSET 0xc0000000
#define IA32_STACK_TOP IA32_PAGE_OFFSET
#define IA32_GATE_OFFSET IA32_PAGE_OFFSET
#define IA32_GATE_END IA32_PAGE_OFFSET + PAGE_SIZE
/*
* The system segments (GDT, TSS, LDT) have to be mapped below 4GB so the IA-32 engine can
* access them.
*/
#define IA32_GDT_OFFSET (IA32_PAGE_OFFSET)
#define IA32_TSS_OFFSET (IA32_PAGE_OFFSET + PAGE_SIZE)
#define IA32_LDT_OFFSET (IA32_PAGE_OFFSET +
2
*PAGE_SIZE)
#define IA32_GDT_OFFSET (IA32_PAGE_OFFSET
+ PAGE_SIZE
)
#define IA32_TSS_OFFSET (IA32_PAGE_OFFSET +
2*
PAGE_SIZE)
#define IA32_LDT_OFFSET (IA32_PAGE_OFFSET +
3
*PAGE_SIZE)
#define ELF_EXEC_PAGESIZE IA32_PAGE_SIZE
...
...
arch/ia64/ia32/sys_ia32.c
View file @
494ec6f3
...
...
@@ -1913,73 +1913,6 @@ sys32_ptrace (int request, pid_t pid, unsigned int addr, unsigned int data,
return
ret
;
}
/*
* The IA64 maps 4 I/O ports for each 4K page
*/
#define IOLEN ((65536 / 4) * 4096)
asmlinkage
long
sys32_iopl
(
int
level
)
{
extern
unsigned
long
ia64_iobase
;
int
fd
;
struct
file
*
file
;
unsigned
int
old
;
unsigned
long
addr
;
mm_segment_t
old_fs
=
get_fs
();
if
(
level
!=
3
)
return
(
-
EINVAL
);
/* Trying to gain more privileges? */
old
=
ia64_getreg
(
_IA64_REG_AR_EFLAG
);
if
((
unsigned
int
)
level
>
((
old
>>
12
)
&
3
))
{
if
(
!
capable
(
CAP_SYS_RAWIO
))
return
-
EPERM
;
}
set_fs
(
KERNEL_DS
);
fd
=
sys_open
(
"/dev/mem"
,
O_SYNC
|
O_RDWR
,
0
);
set_fs
(
old_fs
);
if
(
fd
<
0
)
return
fd
;
file
=
fget
(
fd
);
if
(
file
==
NULL
)
{
sys_close
(
fd
);
return
(
-
EFAULT
);
}
down_write
(
&
current
->
mm
->
mmap_sem
);
addr
=
do_mmap_pgoff
(
file
,
IA32_IOBASE
,
IOLEN
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
(
ia64_iobase
&
~
PAGE_OFFSET
)
>>
PAGE_SHIFT
);
up_write
(
&
current
->
mm
->
mmap_sem
);
if
(
addr
>=
0
)
{
old
=
(
old
&
~
0x3000
)
|
(
level
<<
12
);
ia64_setreg
(
_IA64_REG_AR_EFLAG
,
old
);
}
fput
(
file
);
sys_close
(
fd
);
return
0
;
}
asmlinkage
long
sys32_ioperm
(
unsigned
int
from
,
unsigned
int
num
,
int
on
)
{
/*
* Since IA64 doesn't have permission bits we'd have to go to
* a lot of trouble to simulate them in software. There's
* no point, only trusted programs can make this call so we'll
* just turn it into an iopl call and let the process have
* access to all I/O ports.
*
* XXX proper ioperm() support should be emulated by
* manipulating the page protections...
*/
return
sys32_iopl
(
3
);
}
typedef
struct
{
unsigned
int
ss_sp
;
unsigned
int
ss_flags
;
...
...
arch/ia64/mm/init.c
View file @
494ec6f3
...
...
@@ -587,6 +587,6 @@ mem_init (void)
setup_gate
();
#ifdef CONFIG_IA32_SUPPORT
ia32_
boot_gdt
_init
();
ia32_
mem
_init
();
#endif
}
include/asm-ia64/ia32.h
View file @
494ec6f3
...
...
@@ -14,7 +14,7 @@
# ifdef CONFIG_IA32_SUPPORT
extern
void
ia32_cpu_init
(
void
);
extern
void
ia32_
boot_gdt
_init
(
void
);
extern
void
ia32_
mem
_init
(
void
);
extern
void
ia32_gdt_init
(
void
);
extern
int
ia32_exception
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
extern
int
ia32_intercept
(
struct
pt_regs
*
regs
,
unsigned
long
isr
);
...
...
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