mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86: (77 commits) x86: UV startup of slave cpus x86: integrate pci-dma.c x86: don't do dma if mask is NULL. x86: return conditional to mmu x86: remove kludge from x86_64 x86: unify gfp masks x86: retry allocation if failed x86: don't try to allocate from DMA zone at first x86: use a fallback dev for i386 x86: use numa allocation function in i386 x86: remove virt_to_bus in pci-dma_64.c x86: adjust dma_free_coherent for i386 x86: move bad_dma_address x86: isolate coherent mapping functions x86: move dma_coherent functions to pci-dma.c x86: merge iommu initialization parameters x86: merge dma_supported x86: move pci fixup to pci-dma.c x86: move x86_64-specific to common code. x86: move initialization functions to pci-dma.c ...
This commit is contained in:
@@ -282,6 +282,13 @@ Why: Not used in-tree. The current out-of-tree users used it to
|
||||
out-of-tree driver.
|
||||
Who: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: usedac i386 kernel parameter
|
||||
When: 2.6.27
|
||||
Why: replaced by allowdac and no dac combination
|
||||
Who: Glauber Costa <gcosta@redhat.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/o2cb symlink
|
||||
|
||||
@@ -1280,8 +1280,16 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
noexec [IA-64]
|
||||
|
||||
noexec [X86-32,X86-64]
|
||||
On X86-32 available only on PAE configured kernels.
|
||||
noexec=on: enable non-executable mappings (default)
|
||||
noexec=off: disable nn-executable mappings
|
||||
noexec=off: disable non-executable mappings
|
||||
|
||||
noexec32 [X86-64]
|
||||
This affects only 32-bit executables.
|
||||
noexec32=on: enable non-executable mappings (default)
|
||||
read doesn't imply executable mappings
|
||||
noexec32=off: disable non-executable mappings
|
||||
read implies executable mappings
|
||||
|
||||
nofxsr [BUGS=X86-32] Disables x86 floating point extended
|
||||
register save and restore. The kernel will only save
|
||||
|
||||
96
Documentation/prctl/disable-tsc-ctxt-sw-stress-test.c
Normal file
96
Documentation/prctl/disable-tsc-ctxt-sw-stress-test.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)
|
||||
*
|
||||
* Tests if the control register is updated correctly
|
||||
* at context switches
|
||||
*
|
||||
* Warning: this test will cause a very high load for a few seconds
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <inttypes.h>
|
||||
#include <wait.h>
|
||||
|
||||
|
||||
#include <sys/prctl.h>
|
||||
#include <linux/prctl.h>
|
||||
|
||||
/* Get/set the process' ability to use the timestamp counter instruction */
|
||||
#ifndef PR_GET_TSC
|
||||
#define PR_GET_TSC 25
|
||||
#define PR_SET_TSC 26
|
||||
# define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */
|
||||
# define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */
|
||||
#endif
|
||||
|
||||
uint64_t rdtsc() {
|
||||
uint32_t lo, hi;
|
||||
/* We cannot use "=A", since this would use %rax on x86_64 */
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
|
||||
return (uint64_t)hi << 32 | lo;
|
||||
}
|
||||
|
||||
void sigsegv_expect(int sig)
|
||||
{
|
||||
/* */
|
||||
}
|
||||
|
||||
void segvtask(void)
|
||||
{
|
||||
if (prctl(PR_SET_TSC, PR_TSC_SIGSEGV) < 0)
|
||||
{
|
||||
perror("prctl");
|
||||
exit(0);
|
||||
}
|
||||
signal(SIGSEGV, sigsegv_expect);
|
||||
alarm(10);
|
||||
rdtsc();
|
||||
fprintf(stderr, "FATAL ERROR, rdtsc() succeeded while disabled\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
void sigsegv_fail(int sig)
|
||||
{
|
||||
fprintf(stderr, "FATAL ERROR, rdtsc() failed while enabled\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void rdtsctask(void)
|
||||
{
|
||||
if (prctl(PR_SET_TSC, PR_TSC_ENABLE) < 0)
|
||||
{
|
||||
perror("prctl");
|
||||
exit(0);
|
||||
}
|
||||
signal(SIGSEGV, sigsegv_fail);
|
||||
alarm(10);
|
||||
for(;;) rdtsc();
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int n_tasks = 100, i;
|
||||
|
||||
fprintf(stderr, "[No further output means we're allright]\n");
|
||||
|
||||
for (i=0; i<n_tasks; i++)
|
||||
if (fork() == 0)
|
||||
{
|
||||
if (i & 1)
|
||||
segvtask();
|
||||
else
|
||||
rdtsctask();
|
||||
}
|
||||
|
||||
for (i=0; i<n_tasks; i++)
|
||||
wait(NULL);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
95
Documentation/prctl/disable-tsc-on-off-stress-test.c
Normal file
95
Documentation/prctl/disable-tsc-on-off-stress-test.c
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)
|
||||
*
|
||||
* Tests if the control register is updated correctly
|
||||
* when set with prctl()
|
||||
*
|
||||
* Warning: this test will cause a very high load for a few seconds
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <inttypes.h>
|
||||
#include <wait.h>
|
||||
|
||||
|
||||
#include <sys/prctl.h>
|
||||
#include <linux/prctl.h>
|
||||
|
||||
/* Get/set the process' ability to use the timestamp counter instruction */
|
||||
#ifndef PR_GET_TSC
|
||||
#define PR_GET_TSC 25
|
||||
#define PR_SET_TSC 26
|
||||
# define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */
|
||||
# define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */
|
||||
#endif
|
||||
|
||||
/* snippet from wikipedia :-) */
|
||||
|
||||
uint64_t rdtsc() {
|
||||
uint32_t lo, hi;
|
||||
/* We cannot use "=A", since this would use %rax on x86_64 */
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
|
||||
return (uint64_t)hi << 32 | lo;
|
||||
}
|
||||
|
||||
int should_segv = 0;
|
||||
|
||||
void sigsegv_cb(int sig)
|
||||
{
|
||||
if (!should_segv)
|
||||
{
|
||||
fprintf(stderr, "FATAL ERROR, rdtsc() failed while enabled\n");
|
||||
exit(0);
|
||||
}
|
||||
if (prctl(PR_SET_TSC, PR_TSC_ENABLE) < 0)
|
||||
{
|
||||
perror("prctl");
|
||||
exit(0);
|
||||
}
|
||||
should_segv = 0;
|
||||
|
||||
rdtsc();
|
||||
}
|
||||
|
||||
void task(void)
|
||||
{
|
||||
signal(SIGSEGV, sigsegv_cb);
|
||||
alarm(10);
|
||||
for(;;)
|
||||
{
|
||||
rdtsc();
|
||||
if (should_segv)
|
||||
{
|
||||
fprintf(stderr, "FATAL ERROR, rdtsc() succeeded while disabled\n");
|
||||
exit(0);
|
||||
}
|
||||
if (prctl(PR_SET_TSC, PR_TSC_SIGSEGV) < 0)
|
||||
{
|
||||
perror("prctl");
|
||||
exit(0);
|
||||
}
|
||||
should_segv = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int n_tasks = 100, i;
|
||||
|
||||
fprintf(stderr, "[No further output means we're allright]\n");
|
||||
|
||||
for (i=0; i<n_tasks; i++)
|
||||
if (fork() == 0)
|
||||
task();
|
||||
|
||||
for (i=0; i<n_tasks; i++)
|
||||
wait(NULL);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
94
Documentation/prctl/disable-tsc-test.c
Normal file
94
Documentation/prctl/disable-tsc-test.c
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)
|
||||
*
|
||||
* Basic test to test behaviour of PR_GET_TSC and PR_SET_TSC
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
|
||||
#include <sys/prctl.h>
|
||||
#include <linux/prctl.h>
|
||||
|
||||
/* Get/set the process' ability to use the timestamp counter instruction */
|
||||
#ifndef PR_GET_TSC
|
||||
#define PR_GET_TSC 25
|
||||
#define PR_SET_TSC 26
|
||||
# define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */
|
||||
# define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */
|
||||
#endif
|
||||
|
||||
const char *tsc_names[] =
|
||||
{
|
||||
[0] = "[not set]",
|
||||
[PR_TSC_ENABLE] = "PR_TSC_ENABLE",
|
||||
[PR_TSC_SIGSEGV] = "PR_TSC_SIGSEGV",
|
||||
};
|
||||
|
||||
uint64_t rdtsc() {
|
||||
uint32_t lo, hi;
|
||||
/* We cannot use "=A", since this would use %rax on x86_64 */
|
||||
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
|
||||
return (uint64_t)hi << 32 | lo;
|
||||
}
|
||||
|
||||
void sigsegv_cb(int sig)
|
||||
{
|
||||
int tsc_val = 0;
|
||||
|
||||
printf("[ SIG_SEGV ]\n");
|
||||
printf("prctl(PR_GET_TSC, &tsc_val); ");
|
||||
fflush(stdout);
|
||||
|
||||
if ( prctl(PR_GET_TSC, &tsc_val) == -1)
|
||||
perror("prctl");
|
||||
|
||||
printf("tsc_val == %s\n", tsc_names[tsc_val]);
|
||||
printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
|
||||
fflush(stdout);
|
||||
if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
|
||||
perror("prctl");
|
||||
|
||||
printf("rdtsc() == ");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int tsc_val = 0;
|
||||
|
||||
signal(SIGSEGV, sigsegv_cb);
|
||||
|
||||
printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
|
||||
printf("prctl(PR_GET_TSC, &tsc_val); ");
|
||||
fflush(stdout);
|
||||
|
||||
if ( prctl(PR_GET_TSC, &tsc_val) == -1)
|
||||
perror("prctl");
|
||||
|
||||
printf("tsc_val == %s\n", tsc_names[tsc_val]);
|
||||
printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
|
||||
printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
|
||||
fflush(stdout);
|
||||
|
||||
if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
|
||||
perror("prctl");
|
||||
|
||||
printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
|
||||
printf("prctl(PR_SET_TSC, PR_TSC_SIGSEGV)\n");
|
||||
fflush(stdout);
|
||||
|
||||
if ( prctl(PR_SET_TSC, PR_TSC_SIGSEGV) == -1)
|
||||
perror("prctl");
|
||||
|
||||
printf("rdtsc() == ");
|
||||
fflush(stdout);
|
||||
printf("%llu\n", (unsigned long long)rdtsc());
|
||||
fflush(stdout);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
@@ -903,6 +903,15 @@ config X86_64_ACPI_NUMA
|
||||
help
|
||||
Enable ACPI SRAT based node topology detection.
|
||||
|
||||
# Some NUMA nodes have memory ranges that span
|
||||
# other nodes. Even though a pfn is valid and
|
||||
# between a node's start and end pfns, it may not
|
||||
# reside on that node. See memmap_init_zone()
|
||||
# for details.
|
||||
config NODES_SPAN_OTHER_NODES
|
||||
def_bool y
|
||||
depends on X86_64_ACPI_NUMA
|
||||
|
||||
config NUMA_EMU
|
||||
bool "NUMA emulation"
|
||||
depends on X86_64 && NUMA
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/a20.c
|
||||
*
|
||||
* Enable A20 gate (return -1 on failure)
|
||||
*/
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/apm.c
|
||||
*
|
||||
* Get APM BIOS information
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/bitops.h
|
||||
*
|
||||
* Very simple bitops for the boot code.
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/boot.h
|
||||
*
|
||||
* Header file for the real-mode kernel code
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/cmdline.c
|
||||
*
|
||||
* Simple command-line parser for early boot.
|
||||
*/
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ relocated:
|
||||
/*
|
||||
* Setup the stack for the decompressor
|
||||
*/
|
||||
leal stack_end(%ebx), %esp
|
||||
leal boot_stack_end(%ebx), %esp
|
||||
|
||||
/*
|
||||
* Do the decompression, and jump to the new kernel..
|
||||
@@ -142,8 +142,8 @@ relocated:
|
||||
pushl %eax # input_len
|
||||
leal input_data(%ebx), %eax
|
||||
pushl %eax # input_data
|
||||
leal _end(%ebx), %eax
|
||||
pushl %eax # end of the image as third argument
|
||||
leal boot_heap(%ebx), %eax
|
||||
pushl %eax # heap area as third argument
|
||||
pushl %esi # real mode pointer as second arg
|
||||
call decompress_kernel
|
||||
addl $20, %esp
|
||||
@@ -181,7 +181,10 @@ relocated:
|
||||
jmp *%ebp
|
||||
|
||||
.bss
|
||||
/* Stack and heap for uncompression */
|
||||
.balign 4
|
||||
stack:
|
||||
.fill 4096, 1, 0
|
||||
stack_end:
|
||||
boot_heap:
|
||||
.fill BOOT_HEAP_SIZE, 1, 0
|
||||
boot_stack:
|
||||
.fill BOOT_STACK_SIZE, 1, 0
|
||||
boot_stack_end:
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <asm/segment.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/boot.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
@@ -62,7 +63,7 @@ startup_32:
|
||||
subl $1b, %ebp
|
||||
|
||||
/* setup a stack and make sure cpu supports long mode. */
|
||||
movl $user_stack_end, %eax
|
||||
movl $boot_stack_end, %eax
|
||||
addl %ebp, %eax
|
||||
movl %eax, %esp
|
||||
|
||||
@@ -243,9 +244,9 @@ ENTRY(startup_64)
|
||||
/* Copy the compressed kernel to the end of our buffer
|
||||
* where decompression in place becomes safe.
|
||||
*/
|
||||
leaq _end(%rip), %r8
|
||||
leaq _end(%rbx), %r9
|
||||
movq $_end /* - $startup_32 */, %rcx
|
||||
leaq _end_before_pgt(%rip), %r8
|
||||
leaq _end_before_pgt(%rbx), %r9
|
||||
movq $_end_before_pgt /* - $startup_32 */, %rcx
|
||||
1: subq $8, %r8
|
||||
subq $8, %r9
|
||||
movq 0(%r8), %rax
|
||||
@@ -267,14 +268,14 @@ relocated:
|
||||
*/
|
||||
xorq %rax, %rax
|
||||
leaq _edata(%rbx), %rdi
|
||||
leaq _end(%rbx), %rcx
|
||||
leaq _end_before_pgt(%rbx), %rcx
|
||||
subq %rdi, %rcx
|
||||
cld
|
||||
rep
|
||||
stosb
|
||||
|
||||
/* Setup the stack */
|
||||
leaq user_stack_end(%rip), %rsp
|
||||
leaq boot_stack_end(%rip), %rsp
|
||||
|
||||
/* zero EFLAGS after setting rsp */
|
||||
pushq $0
|
||||
@@ -285,7 +286,7 @@ relocated:
|
||||
*/
|
||||
pushq %rsi # Save the real mode argument
|
||||
movq %rsi, %rdi # real mode address
|
||||
leaq _heap(%rip), %rsi # _heap
|
||||
leaq boot_heap(%rip), %rsi # malloc area for uncompression
|
||||
leaq input_data(%rip), %rdx # input_data
|
||||
movl input_len(%rip), %eax
|
||||
movq %rax, %rcx # input_len
|
||||
@@ -310,9 +311,12 @@ gdt:
|
||||
.quad 0x0080890000000000 /* TS descriptor */
|
||||
.quad 0x0000000000000000 /* TS continued */
|
||||
gdt_end:
|
||||
.bss
|
||||
/* Stack for uncompression */
|
||||
.balign 4
|
||||
user_stack:
|
||||
.fill 4096,4,0
|
||||
user_stack_end:
|
||||
|
||||
.bss
|
||||
/* Stack and heap for uncompression */
|
||||
.balign 4
|
||||
boot_heap:
|
||||
.fill BOOT_HEAP_SIZE, 1, 0
|
||||
boot_stack:
|
||||
.fill BOOT_STACK_SIZE, 1, 0
|
||||
boot_stack_end:
|
||||
|
||||
@@ -217,12 +217,6 @@ static void putstr(const char *);
|
||||
static memptr free_mem_ptr;
|
||||
static memptr free_mem_end_ptr;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define HEAP_SIZE 0x7000
|
||||
#else
|
||||
#define HEAP_SIZE 0x4000
|
||||
#endif
|
||||
|
||||
static char *vidmem;
|
||||
static int vidport;
|
||||
static int lines, cols;
|
||||
@@ -449,7 +443,7 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
|
||||
|
||||
window = output; /* Output buffer (Normally at 1M) */
|
||||
free_mem_ptr = heap; /* Heap */
|
||||
free_mem_end_ptr = heap + HEAP_SIZE;
|
||||
free_mem_end_ptr = heap + BOOT_HEAP_SIZE;
|
||||
inbuf = input_data; /* Input buffer */
|
||||
insize = input_len;
|
||||
inptr = 0;
|
||||
|
||||
@@ -39,10 +39,10 @@ SECTIONS
|
||||
*(.bss.*)
|
||||
*(COMMON)
|
||||
. = ALIGN(8);
|
||||
_end = . ;
|
||||
_end_before_pgt = . ;
|
||||
. = ALIGN(4096);
|
||||
pgtable = . ;
|
||||
. = . + 4096 * 6;
|
||||
_heap = .;
|
||||
_ebss = .;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/copy.S
|
||||
*
|
||||
* Memory copy routines
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/cpucheck.c
|
||||
*
|
||||
* Check for obligatory CPU features and abort if the features are not
|
||||
* present. This code should be compilable as 16-, 32- or 64-bit
|
||||
* code, so be very careful with types and inline assembly.
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/edd.c
|
||||
*
|
||||
* Get EDD BIOS disk information
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/i386/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* arch/i386/boot/main.c
|
||||
*
|
||||
* Main module for the real-mode kernel code
|
||||
*/
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user