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
22277879
Commit
22277879
authored
Oct 24, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/to-linus-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
80d63a94
60b75a3c
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
240 additions
and
102 deletions
+240
-102
arch/ia64/kernel/efi.c
arch/ia64/kernel/efi.c
+26
-0
arch/ia64/kernel/gate-data.S
arch/ia64/kernel/gate-data.S
+1
-1
arch/ia64/kernel/irq.c
arch/ia64/kernel/irq.c
+1
-1
arch/ia64/kernel/module.c
arch/ia64/kernel/module.c
+75
-7
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+118
-82
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+6
-2
arch/ia64/kernel/unwind_i.h
arch/ia64/kernel/unwind_i.h
+1
-7
include/asm-ia64/io.h
include/asm-ia64/io.h
+3
-0
include/asm-ia64/module.h
include/asm-ia64/module.h
+2
-1
include/asm-ia64/namei.h
include/asm-ia64/namei.h
+1
-1
include/asm-ia64/unwind.h
include/asm-ia64/unwind.h
+6
-0
No files found.
arch/ia64/kernel/efi.c
View file @
22277879
...
...
@@ -711,6 +711,32 @@ efi_mem_attributes (unsigned long phys_addr)
return
0
;
}
int
valid_phys_addr_range
(
unsigned
long
phys_addr
,
unsigned
long
*
size
)
{
void
*
efi_map_start
,
*
efi_map_end
,
*
p
;
efi_memory_desc_t
*
md
;
u64
efi_desc_size
;
efi_map_start
=
__va
(
ia64_boot_param
->
efi_memmap
);
efi_map_end
=
efi_map_start
+
ia64_boot_param
->
efi_memmap_size
;
efi_desc_size
=
ia64_boot_param
->
efi_memdesc_size
;
for
(
p
=
efi_map_start
;
p
<
efi_map_end
;
p
+=
efi_desc_size
)
{
md
=
p
;
if
(
phys_addr
-
md
->
phys_addr
<
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
))
{
if
(
!
(
md
->
attribute
&
EFI_MEMORY_WB
))
return
0
;
if
(
*
size
>
md
->
phys_addr
+
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
)
-
phys_addr
)
*
size
=
md
->
phys_addr
+
(
md
->
num_pages
<<
EFI_PAGE_SHIFT
)
-
phys_addr
;
return
1
;
}
}
return
0
;
}
static
void
__exit
efivars_exit
(
void
)
{
...
...
arch/ia64/kernel/gate-data.S
View file @
22277879
.
section
.
data
.
gate
,
"a
x
"
.
section
.
data
.
gate
,
"a
w
"
.
incbin
"arch/ia64/kernel/gate.so"
arch/ia64/kernel/irq.c
View file @
22277879
...
...
@@ -405,7 +405,7 @@ void enable_irq(unsigned int irq)
spin_lock_irqsave
(
&
desc
->
lock
,
flags
);
switch
(
desc
->
depth
)
{
case
1
:
{
unsigned
int
status
=
desc
->
status
&
~
(
IRQ_DISABLED
|
IRQ_INPROGRESS
)
;
unsigned
int
status
=
desc
->
status
&
~
IRQ_DISABLED
;
desc
->
status
=
status
;
if
((
status
&
(
IRQ_PENDING
|
IRQ_REPLAY
))
==
IRQ_PENDING
)
{
desc
->
status
=
status
|
IRQ_REPLAY
;
...
...
arch/ia64/kernel/module.c
View file @
22277879
...
...
@@ -322,6 +322,10 @@ module_alloc (unsigned long size)
void
module_free
(
struct
module
*
mod
,
void
*
module_region
)
{
if
(
mod
->
arch
.
init_unw_table
&&
module_region
==
mod
->
module_init
)
{
unw_remove_unwind_table
(
mod
->
arch
.
init_unw_table
);
mod
->
arch
.
init_unw_table
=
NULL
;
}
vfree
(
module_region
);
}
...
...
@@ -843,28 +847,92 @@ apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return
-
ENOEXEC
;
}
/*
* Modules contain a single unwind table which covers both the core and the init text
* sections but since the two are not contiguous, we need to split this table up such that
* we can register (and unregister) each "segment" seperately. Fortunately, this sounds
* more complicated than it really is.
*/
static
void
register_unwind_table
(
struct
module
*
mod
)
{
struct
unw_table_entry
*
start
=
(
void
*
)
mod
->
arch
.
unwind
->
sh_addr
;
struct
unw_table_entry
*
end
=
start
+
mod
->
arch
.
unwind
->
sh_size
/
sizeof
(
*
start
);
struct
unw_table_entry
tmp
,
*
e1
,
*
e2
,
*
core
,
*
init
;
unsigned
long
num_init
=
0
,
num_core
=
0
;
/* First, count how many init and core unwind-table entries there are. */
for
(
e1
=
start
;
e1
<
end
;
++
e1
)
if
(
in_init
(
mod
,
e1
->
start_offset
))
++
num_init
;
else
++
num_core
;
/*
* Second, sort the table such that all unwind-table entries for the init and core
* text sections are nicely separated. We do this with a stupid bubble sort
* (unwind tables don't get ridiculously huge).
*/
for
(
e1
=
start
;
e1
<
end
;
++
e1
)
{
for
(
e2
=
e1
+
1
;
e2
<
end
;
++
e2
)
{
if
(
e2
->
start_offset
<
e1
->
start_offset
)
{
tmp
=
*
e1
;
*
e1
=
*
e2
;
*
e2
=
tmp
;
}
}
}
/*
* Third, locate the init and core segments in the unwind table:
*/
if
(
in_init
(
mod
,
start
->
start_offset
))
{
init
=
start
;
core
=
start
+
num_init
;
}
else
{
core
=
start
;
init
=
start
+
num_core
;
}
DEBUGP
(
"%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu
\n
"
,
__FUNCTION__
,
mod
->
name
,
mod
->
arch
.
gp
,
num_init
,
num_core
);
/*
* Fourth, register both tables (if not empty).
*/
if
(
num_core
>
0
)
{
mod
->
arch
.
core_unw_table
=
unw_add_unwind_table
(
mod
->
name
,
0
,
mod
->
arch
.
gp
,
core
,
core
+
num_core
);
DEBUGP
(
"%s: core: handle=%p [%p-%p)
\n
"
,
__FUNCTION__
,
mod
->
arch
.
core_unw_table
,
core
,
core
+
num_core
);
}
if
(
num_init
>
0
)
{
mod
->
arch
.
init_unw_table
=
unw_add_unwind_table
(
mod
->
name
,
0
,
mod
->
arch
.
gp
,
init
,
init
+
num_init
);
DEBUGP
(
"%s: init: handle=%p [%p-%p)
\n
"
,
__FUNCTION__
,
mod
->
arch
.
init_unw_table
,
init
,
init
+
num_init
);
}
}
int
module_finalize
(
const
Elf_Ehdr
*
hdr
,
const
Elf_Shdr
*
sechdrs
,
struct
module
*
mod
)
{
DEBUGP
(
"%s: init: entry=%p
\n
"
,
__FUNCTION__
,
mod
->
init
);
if
(
mod
->
arch
.
unwind
)
mod
->
arch
.
unw_table
=
unw_add_unwind_table
(
mod
->
name
,
0
,
mod
->
arch
.
gp
,
(
void
*
)
mod
->
arch
.
unwind
->
sh_addr
,
((
void
*
)
mod
->
arch
.
unwind
->
sh_addr
+
mod
->
arch
.
unwind
->
sh_size
));
register_unwind_table
(
mod
);
return
0
;
}
void
module_arch_cleanup
(
struct
module
*
mod
)
{
if
(
mod
->
arch
.
unwind
)
unw_remove_unwind_table
(
mod
->
arch
.
unw_table
);
if
(
mod
->
arch
.
init_unw_table
)
unw_remove_unwind_table
(
mod
->
arch
.
init_unw_table
);
if
(
mod
->
arch
.
core_unw_table
)
unw_remove_unwind_table
(
mod
->
arch
.
core_unw_table
);
}
#ifdef CONFIG_SMP
void
percpu_modcopy
(
void
*
pcpudst
,
const
void
*
src
,
unsigned
long
size
)
percpu_modcopy
(
void
*
pcpudst
,
const
void
*
src
,
unsigned
long
size
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
...
...
arch/ia64/kernel/perfmon.c
View file @
22277879
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/process.c
View file @
22277879
...
...
@@ -353,9 +353,13 @@ copy_thread (int nr, unsigned long clone_flags,
/* copy parts of thread_struct: */
p
->
thread
.
ksp
=
(
unsigned
long
)
child_stack
-
16
;
/* stop some PSR bits from being inherited: */
/* stop some PSR bits from being inherited.
* the psr.up/psr.pp bits must be cleared on fork but inherited on execve()
* therefore we must specify them explicitly here and not include them in
* IA64_PSR_BITS_TO_CLEAR.
*/
child_ptregs
->
cr_ipsr
=
((
child_ptregs
->
cr_ipsr
|
IA64_PSR_BITS_TO_SET
)
&
~
IA64_PSR_BITS_TO_CLEAR
);
&
~
(
IA64_PSR_BITS_TO_CLEAR
|
IA64_PSR_PP
|
IA64_PSR_UP
)
);
/*
* NOTE: The calling convention considers all floating point
...
...
arch/ia64/kernel/unwind_i.h
View file @
22277879
/*
* Copyright (C) 2000, 2002 Hewlett-Packard Co
* Copyright (C) 2000, 2002
-2003
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
*
* Kernel unwind support.
...
...
@@ -45,12 +45,6 @@ struct unw_info_block {
/* personality routine and language-specific data follow behind descriptors */
};
struct
unw_table_entry
{
u64
start_offset
;
u64
end_offset
;
u64
info_offset
;
};
struct
unw_table
{
struct
unw_table
*
next
;
/* must be first member! */
const
char
*
name
;
...
...
include/asm-ia64/io.h
View file @
22277879
...
...
@@ -72,6 +72,9 @@ phys_to_virt (unsigned long address)
return
(
void
*
)
(
address
+
PAGE_OFFSET
);
}
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
extern
int
valid_phys_addr_range
(
unsigned
long
addr
,
size_t
*
count
);
/* efi.c */
/*
* The following two macros are deprecated and scheduled for removal.
* Please use the PCI-DMA interface defined in <asm/pci.h> instead.
...
...
include/asm-ia64/module.h
View file @
22277879
...
...
@@ -18,7 +18,8 @@ struct mod_arch_specific {
struct
elf64_shdr
*
unwind
;
/* unwind-table section */
unsigned
long
gp
;
/* global-pointer for module */
void
*
unw_table
;
/* unwind-table cookie returned by unwinder */
void
*
core_unw_table
;
/* core unwind-table cookie returned by unwinder */
void
*
init_unw_table
;
/* init unwind-table cookie returned by unwinder */
unsigned
int
next_got_entry
;
/* index of next available got entry */
};
...
...
include/asm-ia64/namei.h
View file @
22277879
...
...
@@ -9,7 +9,7 @@
#include <asm/ptrace.h>
#include <asm/system.h>
#define EMUL_PREFIX_LINUX_IA32 "emul/ia32-linux/"
#define EMUL_PREFIX_LINUX_IA32 "
/
emul/ia32-linux/"
static
inline
char
*
__emul_prefix
(
void
)
...
...
include/asm-ia64/unwind.h
View file @
22277879
...
...
@@ -93,6 +93,12 @@ struct unw_frame_info {
* The official API follows below:
*/
struct
unw_table_entry
{
u64
start_offset
;
u64
end_offset
;
u64
info_offset
;
};
/*
* Initialize unwind support.
*/
...
...
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