Commit d2c46c6c authored by Linus Torvalds's avatar Linus Torvalds

Merge http://lia64.bkbits.net/to-linus-2.5

into home.osdl.org:/home/torvalds/v2.5/linux
parents edbb65db b8e3ead1
...@@ -142,6 +142,19 @@ GLOBAL_ENTRY(ia32_trace_syscall) ...@@ -142,6 +142,19 @@ GLOBAL_ENTRY(ia32_trace_syscall)
;; ;;
st8 [r2]=r3 // initialize return code to -ENOSYS st8 [r2]=r3 // initialize return code to -ENOSYS
br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
// Need to reload arguments (they may be changed by the tracing process)
adds r2=IA64_PT_REGS_R9_OFFSET+16,sp // r2 = &pt_regs.r9
adds r3=IA64_PT_REGS_R13_OFFSET+16,sp // r3 = &pt_regs.r13
;;
ld4 r33=[r2],8 // r9 == ecx
ld4 r37=[r3],16 // r13 == ebp
;;
ld4 r34=[r2],8 // r10 == edx
ld4 r36=[r3],8 // r15 == edi
;;
ld4 r32=[r2],8 // r11 == ebx
ld4 r35=[r3],8 // r14 == esi
;;
.ret2: br.call.sptk.few rp=b6 // do the syscall .ret2: br.call.sptk.few rp=b6 // do the syscall
.ia32_strace_check_retval: .ia32_strace_check_retval:
cmp.lt p6,p0=r8,r0 // syscall failed? cmp.lt p6,p0=r8,r0 // syscall failed?
......
...@@ -297,9 +297,9 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg) ...@@ -297,9 +297,9 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
u64 start; u64 start;
u64 end; u64 end;
} prev, curr; } prev, curr;
void *efi_map_start, *efi_map_end, *p, *q, *r; void *efi_map_start, *efi_map_end, *p, *q;
efi_memory_desc_t *md, *check_md; efi_memory_desc_t *md, *check_md;
u64 efi_desc_size, start, end, granule_addr, first_non_wb_addr = 0; u64 efi_desc_size, start, end, granule_addr, last_granule_addr, first_non_wb_addr = 0;
efi_map_start = __va(ia64_boot_param->efi_memmap); efi_map_start = __va(ia64_boot_param->efi_memmap);
efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size; efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
...@@ -312,41 +312,34 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg) ...@@ -312,41 +312,34 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
if (!(md->attribute & EFI_MEMORY_WB)) if (!(md->attribute & EFI_MEMORY_WB))
continue; continue;
if (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) > first_non_wb_addr) { /*
/* * granule_addr is the base of md's first granule.
* Search for the next run of contiguous WB memory. Start search * [granule_addr - first_non_wb_addr) is guaranteed to
* at first granule boundary covered by md. * be contiguous WB memory.
*/ */
granule_addr = ((md->phys_addr + IA64_GRANULE_SIZE - 1) granule_addr = md->phys_addr & ~(IA64_GRANULE_SIZE - 1);
& -IA64_GRANULE_SIZE); first_non_wb_addr = max(first_non_wb_addr, granule_addr);
first_non_wb_addr = granule_addr;
for (q = p; q < efi_map_end; q += efi_desc_size) {
check_md = q;
if (check_md->attribute & EFI_MEMORY_WB)
trim_bottom(check_md, granule_addr);
if (check_md->phys_addr < granule_addr)
continue;
if (!(check_md->attribute & EFI_MEMORY_WB)) if (first_non_wb_addr < md->phys_addr) {
break; /* hit a non-WB region; stop search */ trim_bottom(md, granule_addr + IA64_GRANULE_SIZE);
granule_addr = md->phys_addr & ~(IA64_GRANULE_SIZE - 1);
first_non_wb_addr = max(first_non_wb_addr, granule_addr);
}
if (check_md->phys_addr != first_non_wb_addr) for (q = p; q < efi_map_end; q += efi_desc_size) {
break; /* hit a memory hole; stop search */ check_md = q;
if ((check_md->attribute & EFI_MEMORY_WB) &&
(check_md->phys_addr == first_non_wb_addr))
first_non_wb_addr += check_md->num_pages << EFI_PAGE_SHIFT; first_non_wb_addr += check_md->num_pages << EFI_PAGE_SHIFT;
} else
/* round it down to the previous granule-boundary: */ break; /* non-WB or hole */
first_non_wb_addr &= -IA64_GRANULE_SIZE;
if (!(first_non_wb_addr > granule_addr))
continue; /* couldn't find enough contiguous memory */
for (r = p; r < q; r += efi_desc_size)
trim_top(r, first_non_wb_addr);
} }
last_granule_addr = first_non_wb_addr & ~(IA64_GRANULE_SIZE - 1);
if (last_granule_addr < md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT))
trim_top(md, last_granule_addr);
if (is_available_memory(md)) { if (is_available_memory(md)) {
if (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) > mem_limit) { if (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) > mem_limit) {
if (md->phys_addr > mem_limit) if (md->phys_addr > mem_limit)
......
...@@ -34,13 +34,8 @@ EXPORT_SYMBOL(disable_irq_nosync); ...@@ -34,13 +34,8 @@ EXPORT_SYMBOL(disable_irq_nosync);
#include <linux/interrupt.h> #include <linux/interrupt.h>
EXPORT_SYMBOL(probe_irq_mask); EXPORT_SYMBOL(probe_irq_mask);
#include <linux/in6.h>
#include <asm/checksum.h> #include <asm/checksum.h>
/* not coded yet?? EXPORT_SYMBOL(csum_ipv6_magic); */ EXPORT_SYMBOL(ip_fast_csum); /* hand-coded assembly */
EXPORT_SYMBOL(csum_partial_copy_nocheck);
EXPORT_SYMBOL(csum_tcpudp_magic);
EXPORT_SYMBOL(ip_compute_csum);
EXPORT_SYMBOL(ip_fast_csum);
#include <asm/io.h> #include <asm/io.h>
EXPORT_SYMBOL(__ia64_memcpy_fromio); EXPORT_SYMBOL(__ia64_memcpy_fromio);
...@@ -58,9 +53,11 @@ EXPORT_SYMBOL_NOVERS(__up); ...@@ -58,9 +53,11 @@ EXPORT_SYMBOL_NOVERS(__up);
EXPORT_SYMBOL(clear_page); EXPORT_SYMBOL(clear_page);
#ifdef CONFIG_VIRTUAL_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP
#include <linux/bootmem.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
EXPORT_SYMBOL(vmalloc_end); EXPORT_SYMBOL(vmalloc_end);
EXPORT_SYMBOL(ia64_pfn_valid); EXPORT_SYMBOL(ia64_pfn_valid);
EXPORT_SYMBOL(max_low_pfn); /* defined by bootmem.c, but not exported by generic code */
#endif #endif
#include <asm/processor.h> #include <asm/processor.h>
......
...@@ -379,8 +379,11 @@ inline void disable_irq_nosync(unsigned int irq) ...@@ -379,8 +379,11 @@ inline void disable_irq_nosync(unsigned int irq)
void disable_irq(unsigned int irq) void disable_irq(unsigned int irq)
{ {
irq_desc_t *desc = irq_descp(irq);
disable_irq_nosync(irq); disable_irq_nosync(irq);
synchronize_irq(irq); if (desc->action)
synchronize_irq(irq);
} }
/** /**
...@@ -402,7 +405,7 @@ void enable_irq(unsigned int irq) ...@@ -402,7 +405,7 @@ void enable_irq(unsigned int irq)
spin_lock_irqsave(&desc->lock, flags); spin_lock_irqsave(&desc->lock, flags);
switch (desc->depth) { switch (desc->depth) {
case 1: { case 1: {
unsigned int status = desc->status & ~IRQ_DISABLED; unsigned int status = desc->status & ~(IRQ_DISABLED | IRQ_INPROGRESS);
desc->status = status; desc->status = status;
if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
desc->status = status | IRQ_REPLAY; desc->status = status | IRQ_REPLAY;
......
...@@ -4225,7 +4225,7 @@ pfm_context_load(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs) ...@@ -4225,7 +4225,7 @@ pfm_context_load(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
ret = -EBUSY; ret = -EBUSY;
} else { } else {
pfm_sessions.pfs_sys_use_dbregs++; pfm_sessions.pfs_sys_use_dbregs++;
DPRINT(("load [%d] increased sys_use_dbreg=%lu\n", task->pid, pfm_sessions.pfs_sys_use_dbregs)); DPRINT(("load [%d] increased sys_use_dbreg=%u\n", task->pid, pfm_sessions.pfs_sys_use_dbregs));
set_dbregs = 1; set_dbregs = 1;
} }
} }
......
...@@ -93,17 +93,17 @@ default_init(struct task_struct *task, void *buf, unsigned int flags, int cpu, v ...@@ -93,17 +93,17 @@ default_init(struct task_struct *task, void *buf, unsigned int flags, int cpu, v
hdr->hdr_version = PFM_DEFAULT_SMPL_VERSION; hdr->hdr_version = PFM_DEFAULT_SMPL_VERSION;
hdr->hdr_buf_size = arg->buf_size; hdr->hdr_buf_size = arg->buf_size;
hdr->hdr_cur_pos = (void *)((unsigned long)buf)+sizeof(*hdr); hdr->hdr_cur_offs = sizeof(*hdr);
hdr->hdr_last_pos = (void *)((unsigned long)buf)+arg->buf_size;
hdr->hdr_overflows = 0UL; hdr->hdr_overflows = 0UL;
hdr->hdr_count = 0UL; hdr->hdr_count = 0UL;
DPRINT(("[%d] buffer=%p buf_size=%lu hdr_size=%lu hdr_version=%u\n", DPRINT(("[%d] buffer=%p buf_size=%lu hdr_size=%lu hdr_version=%u cur_offs=%lu\n",
task->pid, task->pid,
buf, buf,
hdr->hdr_buf_size, hdr->hdr_buf_size,
sizeof(*hdr), sizeof(*hdr),
hdr->hdr_version)); hdr->hdr_version,
hdr->hdr_cur_offs));
return 0; return 0;
} }
...@@ -125,8 +125,8 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -125,8 +125,8 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
} }
hdr = (pfm_default_smpl_hdr_t *)buf; hdr = (pfm_default_smpl_hdr_t *)buf;
cur = hdr->hdr_cur_pos; cur = buf+hdr->hdr_cur_offs;
last = hdr->hdr_last_pos; last = buf+hdr->hdr_buf_size;
ovfl_pmd = arg->ovfl_pmd; ovfl_pmd = arg->ovfl_pmd;
ovfl_notify = arg->ovfl_notify; ovfl_notify = arg->ovfl_notify;
...@@ -191,7 +191,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -191,7 +191,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
/* /*
* update position for next entry * update position for next entry
*/ */
hdr->hdr_cur_pos = cur + sizeof(*ent) + (npmds << 3); hdr->hdr_cur_offs += sizeof(*ent) + (npmds << 3);
/* /*
* keep same ovfl_pmds, ovfl_notify * keep same ovfl_pmds, ovfl_notify
...@@ -212,10 +212,9 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct ...@@ -212,10 +212,9 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct
hdr->hdr_overflows++; hdr->hdr_overflows++;
/* /*
* if no notification is needed, then we saturate the buffer * if no notification requested, then we saturate the buffer
*/ */
if (ovfl_notify == 0) { if (ovfl_notify == 0) {
hdr->hdr_count = 0UL;
arg->ovfl_ctrl.bits.notify_user = 0; arg->ovfl_ctrl.bits.notify_user = 0;
arg->ovfl_ctrl.bits.block_task = 0; arg->ovfl_ctrl.bits.block_task = 0;
arg->ovfl_ctrl.bits.mask_monitoring = 1; arg->ovfl_ctrl.bits.mask_monitoring = 1;
...@@ -236,8 +235,8 @@ default_restart(struct task_struct *task, pfm_ovfl_ctrl_t *ctrl, void *buf, stru ...@@ -236,8 +235,8 @@ default_restart(struct task_struct *task, pfm_ovfl_ctrl_t *ctrl, void *buf, stru
hdr = (pfm_default_smpl_hdr_t *)buf; hdr = (pfm_default_smpl_hdr_t *)buf;
hdr->hdr_count = 0UL; hdr->hdr_count = 0UL;
hdr->hdr_cur_pos = (void *)((unsigned long)buf)+sizeof(*hdr); hdr->hdr_cur_offs = sizeof(*hdr);
ctrl->bits.mask_monitoring = 0; ctrl->bits.mask_monitoring = 0;
ctrl->bits.reset_ovfl_pmds = 1; /* uses long-reset values */ ctrl->bits.reset_ovfl_pmds = 1; /* uses long-reset values */
......
...@@ -685,12 +685,16 @@ machine_restart (char *restart_cmd) ...@@ -685,12 +685,16 @@ machine_restart (char *restart_cmd)
(*efi.reset_system)(EFI_RESET_WARM, 0, 0, 0); (*efi.reset_system)(EFI_RESET_WARM, 0, 0, 0);
} }
EXPORT_SYMBOL(machine_restart);
void void
machine_halt (void) machine_halt (void)
{ {
cpu_halt(); cpu_halt();
} }
EXPORT_SYMBOL(machine_halt);
void void
machine_power_off (void) machine_power_off (void)
{ {
...@@ -698,3 +702,5 @@ machine_power_off (void) ...@@ -698,3 +702,5 @@ machine_power_off (void)
pm_power_off(); pm_power_off();
machine_halt(); machine_halt();
} }
EXPORT_SYMBOL(machine_power_off);
...@@ -327,9 +327,11 @@ setup_arch (char **cmdline_p) ...@@ -327,9 +327,11 @@ setup_arch (char **cmdline_p)
* because we don't *really* know whether there's anything there, but we hope that * because we don't *really* know whether there's anything there, but we hope that
* all new boxes will implement HCDP. * all new boxes will implement HCDP.
*/ */
extern unsigned char acpi_legacy_devices; {
if (!efi.hcdp && acpi_legacy_devices) extern unsigned char acpi_legacy_devices;
setup_serial_legacy(); if (!efi.hcdp && acpi_legacy_devices)
setup_serial_legacy();
}
#endif #endif
#ifdef CONFIG_VT #ifdef CONFIG_VT
......
/* /*
* Network checksum routines * Network checksum routines
* *
* Copyright (C) 1999 Hewlett-Packard Co * Copyright (C) 1999, 2003 Hewlett-Packard Co
* Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com> * Stephane Eranian <eranian@hpl.hp.com>
* *
* Most of the code coming from arch/alpha/lib/checksum.c * Most of the code coming from arch/alpha/lib/checksum.c
* *
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
* in an architecture-specific manner due to speed.. * in an architecture-specific manner due to speed..
*/ */
#include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
...@@ -40,6 +41,8 @@ csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len, ...@@ -40,6 +41,8 @@ csum_tcpudp_magic (unsigned long saddr, unsigned long daddr, unsigned short len,
((unsigned long) proto << 8)); ((unsigned long) proto << 8));
} }
EXPORT_SYMBOL(csum_tcpudp_magic);
unsigned int unsigned int
csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len, csum_tcpudp_nofold (unsigned long saddr, unsigned long daddr, unsigned short len,
unsigned short proto, unsigned int sum) unsigned short proto, unsigned int sum)
...@@ -84,6 +87,7 @@ csum_partial (const unsigned char * buff, int len, unsigned int sum) ...@@ -84,6 +87,7 @@ csum_partial (const unsigned char * buff, int len, unsigned int sum)
return result; return result;
} }
EXPORT_SYMBOL(csum_partial);
/* /*
* this routine is used for miscellaneous IP-like checksums, mainly * this routine is used for miscellaneous IP-like checksums, mainly
...@@ -94,3 +98,5 @@ ip_compute_csum (unsigned char * buff, int len) ...@@ -94,3 +98,5 @@ ip_compute_csum (unsigned char * buff, int len)
{ {
return ~do_csum(buff,len); return ~do_csum(buff,len);
} }
EXPORT_SYMBOL(ip_compute_csum);
/* /*
* Network Checksum & Copy routine * Network Checksum & Copy routine
* *
* Copyright (C) 1999 Hewlett-Packard Co * Copyright (C) 1999, 2003 Hewlett-Packard Co
* Copyright (C) 1999 Stephane Eranian <eranian@hpl.hp.com> * Stephane Eranian <eranian@hpl.hp.com>
* *
* Most of the code has been imported from Linux/Alpha * Most of the code has been imported from Linux/Alpha
*/ */
#include <linux/module.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/string.h> #include <linux/string.h>
...@@ -146,3 +147,4 @@ csum_partial_copy_nocheck(const char *src, char *dst, int len, unsigned int sum) ...@@ -146,3 +147,4 @@ csum_partial_copy_nocheck(const char *src, char *dst, int len, unsigned int sum)
return do_csum_partial_copy_from_user(src, dst, len, sum, NULL); return do_csum_partial_copy_from_user(src, dst, len, sum, NULL);
} }
EXPORT_SYMBOL(csum_partial_copy_nocheck);
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/mmzone.h> #include <linux/mmzone.h>
#include <linux/module.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -43,6 +44,8 @@ unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL; ...@@ -43,6 +44,8 @@ unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL;
#ifdef CONFIG_VIRTUAL_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP
unsigned long vmalloc_end = VMALLOC_END_INIT; unsigned long vmalloc_end = VMALLOC_END_INIT;
struct page *vmem_map; struct page *vmem_map;
EXPORT_SYMBOL(vmem_map);
#endif #endif
static int pgt_cache_water[2] = { 25, 50 }; static int pgt_cache_water[2] = { 25, 50 };
......
...@@ -11,12 +11,19 @@ ...@@ -11,12 +11,19 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/cpu.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/memblk.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/node.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <asm/numa.h> #include <asm/numa.h>
static struct memblk *sysfs_memblks;
static struct node *sysfs_nodes;
static struct cpu *sysfs_cpus;
/* /*
* The following structures are usually initialized by ACPI or * The following structures are usually initialized by ACPI or
* similar mechanisms and describe the NUMA characteristics of the machine. * similar mechanisms and describe the NUMA characteristics of the machine.
...@@ -43,3 +50,52 @@ paddr_to_nid(unsigned long paddr) ...@@ -43,3 +50,52 @@ paddr_to_nid(unsigned long paddr)
return (i < num_memblks) ? node_memblk[i].nid : (num_memblks ? -1 : 0); return (i < num_memblks) ? node_memblk[i].nid : (num_memblks ? -1 : 0);
} }
static int __init topology_init(void)
{
int i, err = 0;
sysfs_nodes = kmalloc(sizeof(struct node) * numnodes, GFP_KERNEL);
if (!sysfs_nodes) {
err = -ENOMEM;
goto out;
}
memset(sysfs_nodes, 0, sizeof(struct node) * numnodes);
sysfs_memblks = kmalloc(sizeof(struct memblk) * num_memblks,
GFP_KERNEL);
if (!sysfs_memblks) {
kfree(sysfs_nodes);
err = -ENOMEM;
goto out;
}
memset(sysfs_memblks, 0, sizeof(struct memblk) * num_memblks);
sysfs_cpus = kmalloc(sizeof(struct cpu) * NR_CPUS, GFP_KERNEL);
if (!sysfs_cpus) {
kfree(sysfs_memblks);
kfree(sysfs_nodes);
err = -ENOMEM;
goto out;
}
memset(sysfs_cpus, 0, sizeof(struct cpu) * NR_CPUS);
for (i = 0; i < numnodes; i++)
if ((err = register_node(&sysfs_nodes[i], i, 0)))
goto out;
for (i = 0; i < num_memblks; i++)
if ((err = register_memblk(&sysfs_memblks[i], i,
&sysfs_nodes[memblk_to_node(i)])))
goto out;
for (i = 0; i < NR_CPUS; i++)
if (cpu_online(i))
if((err = register_cpu(&sysfs_cpus[i], i,
&sysfs_nodes[cpu_to_node(i)])))
goto out;
out:
return err;
}
__initcall(topology_init);
...@@ -36,11 +36,12 @@ typedef struct { ...@@ -36,11 +36,12 @@ typedef struct {
*/ */
typedef struct { typedef struct {
unsigned long hdr_count; /* how many valid entries */ unsigned long hdr_count; /* how many valid entries */
void *hdr_cur_pos; /* current position in the buffer */ unsigned long hdr_cur_offs; /* current offset from top of buffer */
void *hdr_last_pos; /* first byte beyond buffer */ unsigned long hdr_reserved2; /* reserved for future use */
unsigned long hdr_overflows; /* how many times the buffer overflowed */ unsigned long hdr_overflows; /* how many times the buffer overflowed */
unsigned long hdr_buf_size; /* how many bytes in the buffer */ unsigned long hdr_buf_size; /* how many bytes in the buffer */
unsigned int hdr_version; /* contains perfmon version (smpl format diffs) */ unsigned int hdr_version; /* contains perfmon version (smpl format diffs) */
unsigned int hdr_reserved1; /* for future use */ unsigned int hdr_reserved1; /* for future use */
unsigned long hdr_reserved[10]; /* for future use */ unsigned long hdr_reserved[10]; /* for future use */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment