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
cf8ba7a9
Commit
cf8ba7a9
authored
May 04, 2007
by
Martin Schwidefsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[S390] add hardware capability support (ELF_HWCAP).
Signed-off-by:
Martin Schwidefsky
<
schwidefsky@de.ibm.com
>
parent
e2963062
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
120 additions
and
6 deletions
+120
-6
arch/s390/kernel/setup.c
arch/s390/kernel/setup.c
+109
-0
include/asm-s390/elf.h
include/asm-s390/elf.h
+5
-2
include/asm-s390/lowcore.h
include/asm-s390/lowcore.h
+6
-4
No files found.
arch/s390/kernel/setup.c
View file @
cf8ba7a9
...
@@ -74,6 +74,8 @@ unsigned int console_mode = 0;
...
@@ -74,6 +74,8 @@ unsigned int console_mode = 0;
unsigned
int
console_devno
=
-
1
;
unsigned
int
console_devno
=
-
1
;
unsigned
int
console_irq
=
-
1
;
unsigned
int
console_irq
=
-
1
;
unsigned
long
machine_flags
=
0
;
unsigned
long
machine_flags
=
0
;
unsigned
long
elf_hwcap
=
0
;
char
elf_platform
[
ELF_PLATFORM_SIZE
];
struct
mem_chunk
__initdata
memory_chunk
[
MEMORY_CHUNKS
];
struct
mem_chunk
__initdata
memory_chunk
[
MEMORY_CHUNKS
];
volatile
int
__cpu_logical_map
[
NR_CPUS
];
/* logical cpu to cpu address */
volatile
int
__cpu_logical_map
[
NR_CPUS
];
/* logical cpu to cpu address */
...
@@ -749,6 +751,98 @@ setup_memory(void)
...
@@ -749,6 +751,98 @@ setup_memory(void)
#endif
#endif
}
}
static
__init
unsigned
int
stfl
(
void
)
{
asm
volatile
(
" .insn s,0xb2b10000,0(0)
\n
"
/* stfl */
"0:
\n
"
EX_TABLE
(
0
b
,
0
b
));
return
S390_lowcore
.
stfl_fac_list
;
}
static
__init
int
stfle
(
unsigned
long
long
*
list
,
int
doublewords
)
{
typedef
struct
{
unsigned
long
long
_
[
doublewords
];
}
addrtype
;
register
unsigned
long
__nr
asm
(
"0"
)
=
doublewords
-
1
;
asm
volatile
(
".insn s,0xb2b00000,%0"
/* stfle */
:
"=m"
(
*
(
addrtype
*
)
list
),
"+d"
(
__nr
)
:
:
"cc"
);
return
__nr
+
1
;
}
/*
* Setup hardware capabilities.
*/
static
void
__init
setup_hwcaps
(
void
)
{
static
const
int
stfl_bits
[
6
]
=
{
0
,
2
,
7
,
17
,
19
,
21
};
struct
cpuinfo_S390
*
cpuinfo
=
&
S390_lowcore
.
cpu_data
;
unsigned
long
long
facility_list_extended
;
unsigned
int
facility_list
;
int
i
;
facility_list
=
stfl
();
/*
* The store facility list bits numbers as found in the principles
* of operation are numbered with bit 1UL<<31 as number 0 to
* bit 1UL<<0 as number 31.
* Bit 0: instructions named N3, "backported" to esa-mode
* Bit 2: z/Architecture mode is active
* Bit 7: the store-facility-list-extended facility is installed
* Bit 17: the message-security assist is installed
* Bit 19: the long-displacement facility is installed
* Bit 21: the extended-immediate facility is installed
* These get translated to:
* HWCAP_S390_ESAN3 bit 0, HWCAP_S390_ZARCH bit 1,
* HWCAP_S390_STFLE bit 2, HWCAP_S390_MSA bit 3,
* HWCAP_S390_LDISP bit 4, and HWCAP_S390_EIMM bit 5.
*/
for
(
i
=
0
;
i
<
6
;
i
++
)
if
(
facility_list
&
(
1UL
<<
(
31
-
stfl_bits
[
i
])))
elf_hwcap
|=
1UL
<<
i
;
/*
* Check for additional facilities with store-facility-list-extended.
* stfle stores doublewords (8 byte) with bit 1ULL<<63 as bit 0
* and 1ULL<<0 as bit 63. Bits 0-31 contain the same information
* as stored by stfl, bits 32-xxx contain additional facilities.
* How many facility words are stored depends on the number of
* doublewords passed to the instruction. The additional facilites
* are:
* Bit 43: decimal floating point facility is installed
* translated to:
* HWCAP_S390_DFP bit 6.
*/
if
((
elf_hwcap
&
(
1UL
<<
2
))
&&
stfle
(
&
facility_list_extended
,
1
)
>
0
)
{
if
(
facility_list_extended
&
(
1ULL
<<
(
64
-
43
)))
elf_hwcap
|=
1UL
<<
6
;
}
switch
(
cpuinfo
->
cpu_id
.
machine
)
{
case
0x9672
:
#if !defined(CONFIG_64BIT)
default:
/* Use "g5" as default for 31 bit kernels. */
#endif
strcpy
(
elf_platform
,
"g5"
);
break
;
case
0x2064
:
case
0x2066
:
#if defined(CONFIG_64BIT)
default:
/* Use "z900" as default for 64 bit kernels. */
#endif
strcpy
(
elf_platform
,
"z900"
);
break
;
case
0x2084
:
case
0x2086
:
strcpy
(
elf_platform
,
"z990"
);
break
;
case
0x2094
:
strcpy
(
elf_platform
,
"z9-109"
);
break
;
}
}
/*
/*
* Setup function called from init/main.c just after the banner
* Setup function called from init/main.c just after the banner
* was printed.
* was printed.
...
@@ -804,6 +898,11 @@ setup_arch(char **cmdline_p)
...
@@ -804,6 +898,11 @@ setup_arch(char **cmdline_p)
__cpu_logical_map
[
0
]
=
S390_lowcore
.
cpu_data
.
cpu_addr
;
__cpu_logical_map
[
0
]
=
S390_lowcore
.
cpu_data
.
cpu_addr
;
smp_setup_cpu_possible_map
();
smp_setup_cpu_possible_map
();
/*
* Setup capabilities (ELF_HWCAP & ELF_PLATFORM).
*/
setup_hwcaps
();
/*
/*
* Create kernel page tables and switch to virtual addressing.
* Create kernel page tables and switch to virtual addressing.
*/
*/
...
@@ -839,8 +938,12 @@ void print_cpu_info(struct cpuinfo_S390 *cpuinfo)
...
@@ -839,8 +938,12 @@ void print_cpu_info(struct cpuinfo_S390 *cpuinfo)
static
int
show_cpuinfo
(
struct
seq_file
*
m
,
void
*
v
)
static
int
show_cpuinfo
(
struct
seq_file
*
m
,
void
*
v
)
{
{
static
const
char
*
hwcap_str
[
7
]
=
{
"esan3"
,
"zarch"
,
"stfle"
,
"msa"
,
"ldisp"
,
"eimm"
,
"dfp"
};
struct
cpuinfo_S390
*
cpuinfo
;
struct
cpuinfo_S390
*
cpuinfo
;
unsigned
long
n
=
(
unsigned
long
)
v
-
1
;
unsigned
long
n
=
(
unsigned
long
)
v
-
1
;
int
i
;
s390_adjust_jiffies
();
s390_adjust_jiffies
();
preempt_disable
();
preempt_disable
();
...
@@ -850,7 +953,13 @@ static int show_cpuinfo(struct seq_file *m, void *v)
...
@@ -850,7 +953,13 @@ static int show_cpuinfo(struct seq_file *m, void *v)
"bogomips per cpu: %lu.%02lu
\n
"
,
"bogomips per cpu: %lu.%02lu
\n
"
,
num_online_cpus
(),
loops_per_jiffy
/
(
500000
/
HZ
),
num_online_cpus
(),
loops_per_jiffy
/
(
500000
/
HZ
),
(
loops_per_jiffy
/
(
5000
/
HZ
))
%
100
);
(
loops_per_jiffy
/
(
5000
/
HZ
))
%
100
);
seq_puts
(
m
,
"features
\t
: "
);
for
(
i
=
0
;
i
<
7
;
i
++
)
if
(
hwcap_str
[
i
]
&&
(
elf_hwcap
&
(
1UL
<<
i
)))
seq_printf
(
m
,
"%s "
,
hwcap_str
[
i
]);
seq_puts
(
m
,
"
\n
"
);
}
}
if
(
cpu_online
(
n
))
{
if
(
cpu_online
(
n
))
{
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
if
(
smp_processor_id
()
==
n
)
if
(
smp_processor_id
()
==
n
)
...
...
include/asm-s390/elf.h
View file @
cf8ba7a9
...
@@ -188,7 +188,8 @@ static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs)
...
@@ -188,7 +188,8 @@ static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs)
/* This yields a mask that user programs can use to figure out what
/* This yields a mask that user programs can use to figure out what
instruction set this CPU supports. */
instruction set this CPU supports. */
#define ELF_HWCAP (0)
extern
unsigned
long
elf_hwcap
;
#define ELF_HWCAP (elf_hwcap)
/* This yields a string that ld.so will use to load implementation
/* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in
specific libraries for optimization. This is more specific in
...
@@ -197,7 +198,9 @@ static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs)
...
@@ -197,7 +198,9 @@ static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs)
For the moment, we have only optimizations for the Intel generations,
For the moment, we have only optimizations for the Intel generations,
but that could change... */
but that could change... */
#define ELF_PLATFORM (NULL)
#define ELF_PLATFORM_SIZE 8
extern
char
elf_platform
[];
#define ELF_PLATFORM (elf_platform)
#ifndef __s390x__
#ifndef __s390x__
#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
...
...
include/asm-s390/lowcore.h
View file @
cf8ba7a9
...
@@ -229,17 +229,19 @@ struct _lowcore
...
@@ -229,17 +229,19 @@ struct _lowcore
__u16
subchannel_nr
;
/* 0x0ba */
__u16
subchannel_nr
;
/* 0x0ba */
__u32
io_int_parm
;
/* 0x0bc */
__u32
io_int_parm
;
/* 0x0bc */
__u32
io_int_word
;
/* 0x0c0 */
__u32
io_int_word
;
/* 0x0c0 */
__u8
pad3
[
0xD4
-
0xC4
];
/* 0x0c4 */
__u8
pad3
[
0xc8
-
0xc4
];
/* 0x0c4 */
__u32
stfl_fac_list
;
/* 0x0c8 */
__u8
pad4
[
0xd4
-
0xcc
];
/* 0x0cc */
__u32
extended_save_area_addr
;
/* 0x0d4 */
__u32
extended_save_area_addr
;
/* 0x0d4 */
__u32
cpu_timer_save_area
[
2
];
/* 0x0d8 */
__u32
cpu_timer_save_area
[
2
];
/* 0x0d8 */
__u32
clock_comp_save_area
[
2
];
/* 0x0e0 */
__u32
clock_comp_save_area
[
2
];
/* 0x0e0 */
__u32
mcck_interruption_code
[
2
];
/* 0x0e8 */
__u32
mcck_interruption_code
[
2
];
/* 0x0e8 */
__u8
pad4
[
0xf4
-
0xf0
];
/* 0x0f0 */
__u8
pad5
[
0xf4
-
0xf0
];
/* 0x0f0 */
__u32
external_damage_code
;
/* 0x0f4 */
__u32
external_damage_code
;
/* 0x0f4 */
__u32
failing_storage_address
;
/* 0x0f8 */
__u32
failing_storage_address
;
/* 0x0f8 */
__u8
pad5
[
0x100
-
0xfc
];
/* 0x0fc */
__u8
pad6
[
0x100
-
0xfc
];
/* 0x0fc */
__u32
st_status_fixed_logout
[
4
];
/* 0x100 */
__u32
st_status_fixed_logout
[
4
];
/* 0x100 */
__u8
pad6
[
0x120
-
0x110
];
/* 0x110 */
__u8
pad7
[
0x120
-
0x110
];
/* 0x110 */
__u32
access_regs_save_area
[
16
];
/* 0x120 */
__u32
access_regs_save_area
[
16
];
/* 0x120 */
__u32
floating_pt_save_area
[
8
];
/* 0x160 */
__u32
floating_pt_save_area
[
8
];
/* 0x160 */
__u32
gpregs_save_area
[
16
];
/* 0x180 */
__u32
gpregs_save_area
[
16
];
/* 0x180 */
...
...
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