mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
Update the ia64 linux-2.6-xen-sparse tree to 2.6.16-rc3.
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
This commit is contained in:
1 parent
9a5bf16779
commit
9ff4a6f68e
10 files changed
+432
-39
No files matched your search
@@ -1,14 +1,13 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc2-xen0
|
||||
# Mon Feb 6 02:48:43 2006
|
||||
# Linux kernel version: 2.6.16-rc3-xen0
|
||||
# Thu Feb 16 13:20:46 2006
|
||||
#
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
@@ -212,6 +211,7 @@ CONFIG_NET=y
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
@@ -359,6 +359,7 @@ CONFIG_BLK_DEV_INITRD=y
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_IDE=y
|
||||
CONFIG_IDE_MAX_HWIFS=4
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
@@ -739,6 +740,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
@@ -860,6 +862,7 @@ CONFIG_HWMON=y
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc2-xenU
|
||||
# Mon Feb 6 03:35:30 2006
|
||||
# Linux kernel version: 2.6.16-rc3-xenU
|
||||
# Thu Feb 16 13:47:59 2006
|
||||
#
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
# CONFIG_CLEAN_COMPILE is not set
|
||||
CONFIG_BROKEN=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
@@ -211,6 +208,7 @@ CONFIG_NET=y
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
@@ -397,13 +395,11 @@ CONFIG_SCSI_SAS_ATTRS=y
|
||||
# CONFIG_SCSI_AIC7XXX is not set
|
||||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_ADVANSYS is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA_PIO is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
@@ -752,6 +748,7 @@ CONFIG_HWMON=y
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
@@ -809,7 +806,6 @@ CONFIG_VIDEO_DEV=y
|
||||
# CONFIG_TUNER_3036 is not set
|
||||
# CONFIG_VIDEO_STRADIS is not set
|
||||
# CONFIG_VIDEO_ZORAN is not set
|
||||
# CONFIG_VIDEO_ZR36120 is not set
|
||||
# CONFIG_VIDEO_SAA7134 is not set
|
||||
# CONFIG_VIDEO_MXB is not set
|
||||
# CONFIG_VIDEO_DPC is not set
|
||||
@@ -865,7 +861,6 @@ CONFIG_FB_RADEON_DEBUG=y
|
||||
# CONFIG_FB_3DFX is not set
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_PM3 is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
|
||||
@@ -236,7 +236,6 @@ config IA64_L1_CACHE_SHIFT
|
||||
default "7" if MCKINLEY
|
||||
default "6" if ITANIUM
|
||||
|
||||
# align cache-sensitive data to 64 bytes
|
||||
config IA64_CYCLONE
|
||||
bool "Cyclone (EXA) Time Source support"
|
||||
help
|
||||
@@ -416,6 +415,9 @@ config IA64_PALINFO
|
||||
To use this option, you have to ensure that the "/proc file system
|
||||
support" (CONFIG_PROC_FS) is enabled, too.
|
||||
|
||||
config SGI_SN
|
||||
def_bool y if (IA64_SGI_SN2 || IA64_GENERIC)
|
||||
|
||||
source "drivers/firmware/Kconfig"
|
||||
|
||||
source "fs/Kconfig.binfmt"
|
||||
|
||||
@@ -74,6 +74,8 @@ all: compressed unwcheck
|
||||
|
||||
compressed: vmlinux.gz
|
||||
|
||||
vmlinuz: vmlinux.gz
|
||||
|
||||
vmlinux.gz: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
@@ -88,7 +90,7 @@ CLEAN_FILES += vmlinux.gz bootloader
|
||||
boot: lib/lib.a vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
install: vmlinux.gz
|
||||
install:
|
||||
sh $(srctree)/arch/ia64/install.sh $(KERNELRELEASE) $< System.map "$(INSTALL_PATH)"
|
||||
|
||||
define archhelp
|
||||
|
||||
@@ -1607,5 +1607,21 @@ sys_call_table:
|
||||
data8 sys_inotify_add_watch
|
||||
data8 sys_inotify_rm_watch
|
||||
data8 sys_migrate_pages // 1280
|
||||
data8 sys_openat
|
||||
data8 sys_mkdirat
|
||||
data8 sys_mknodat
|
||||
data8 sys_fchownat
|
||||
data8 sys_futimesat // 1285
|
||||
data8 sys_newfstatat
|
||||
data8 sys_unlinkat
|
||||
data8 sys_renameat
|
||||
data8 sys_linkat
|
||||
data8 sys_symlinkat // 1290
|
||||
data8 sys_readlinkat
|
||||
data8 sys_fchmodat
|
||||
data8 sys_faccessat
|
||||
data8 sys_ni_syscall // reserved for pselect
|
||||
data8 sys_ni_syscall // 1295 reserved for ppoll
|
||||
data8 sys_unshare
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
@@ -352,6 +352,7 @@ start_ap:
|
||||
mov ar.rsc=0 // place RSE in enforced lazy mode
|
||||
;;
|
||||
loadrs // clear the dirty partition
|
||||
mov IA64_KR(PER_CPU_DATA)=r0 // clear physical per-CPU base
|
||||
;;
|
||||
mov ar.bspstore=r2 // establish the new RSE stack
|
||||
;;
|
||||
|
||||
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
* System Abstraction Layer (SAL) interface routines.
|
||||
*
|
||||
* Copyright (C) 1998, 1999, 2001, 2003 Hewlett-Packard Co
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||
* Copyright (C) 1999 VA Linux Systems
|
||||
* Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/sal.h>
|
||||
#include <asm/pal.h>
|
||||
|
||||
__cacheline_aligned DEFINE_SPINLOCK(sal_lock);
|
||||
unsigned long sal_platform_features;
|
||||
|
||||
unsigned short sal_revision;
|
||||
unsigned short sal_version;
|
||||
|
||||
#define SAL_MAJOR(x) ((x) >> 8)
|
||||
#define SAL_MINOR(x) ((x) & 0xff)
|
||||
|
||||
static struct {
|
||||
void *addr; /* function entry point */
|
||||
void *gpval; /* gp value to use */
|
||||
} pdesc;
|
||||
|
||||
static long
|
||||
default_handler (void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
ia64_sal_handler ia64_sal = (ia64_sal_handler) default_handler;
|
||||
ia64_sal_desc_ptc_t *ia64_ptc_domain_info;
|
||||
|
||||
const char *
|
||||
ia64_sal_strerror (long status)
|
||||
{
|
||||
const char *str;
|
||||
switch (status) {
|
||||
case 0: str = "Call completed without error"; break;
|
||||
case 1: str = "Effect a warm boot of the system to complete "
|
||||
"the update"; break;
|
||||
case -1: str = "Not implemented"; break;
|
||||
case -2: str = "Invalid argument"; break;
|
||||
case -3: str = "Call completed with error"; break;
|
||||
case -4: str = "Virtual address not registered"; break;
|
||||
case -5: str = "No information available"; break;
|
||||
case -6: str = "Insufficient space to add the entry"; break;
|
||||
case -7: str = "Invalid entry_addr value"; break;
|
||||
case -8: str = "Invalid interrupt vector"; break;
|
||||
case -9: str = "Requested memory not available"; break;
|
||||
case -10: str = "Unable to write to the NVM device"; break;
|
||||
case -11: str = "Invalid partition type specified"; break;
|
||||
case -12: str = "Invalid NVM_Object id specified"; break;
|
||||
case -13: str = "NVM_Object already has the maximum number "
|
||||
"of partitions"; break;
|
||||
case -14: str = "Insufficient space in partition for the "
|
||||
"requested write sub-function"; break;
|
||||
case -15: str = "Insufficient data buffer space for the "
|
||||
"requested read record sub-function"; break;
|
||||
case -16: str = "Scratch buffer required for the write/delete "
|
||||
"sub-function"; break;
|
||||
case -17: str = "Insufficient space in the NVM_Object for the "
|
||||
"requested create sub-function"; break;
|
||||
case -18: str = "Invalid value specified in the partition_rec "
|
||||
"argument"; break;
|
||||
case -19: str = "Record oriented I/O not supported for this "
|
||||
"partition"; break;
|
||||
case -20: str = "Bad format of record to be written or "
|
||||
"required keyword variable not "
|
||||
"specified"; break;
|
||||
default: str = "Unknown SAL status code"; break;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
void __init
|
||||
ia64_sal_handler_init (void *entry_point, void *gpval)
|
||||
{
|
||||
/* fill in the SAL procedure descriptor and point ia64_sal to it: */
|
||||
pdesc.addr = entry_point;
|
||||
pdesc.gpval = gpval;
|
||||
ia64_sal = (ia64_sal_handler) &pdesc;
|
||||
}
|
||||
|
||||
static void __init
|
||||
check_versions (struct ia64_sal_systab *systab)
|
||||
{
|
||||
sal_revision = (systab->sal_rev_major << 8) | systab->sal_rev_minor;
|
||||
sal_version = (systab->sal_b_rev_major << 8) | systab->sal_b_rev_minor;
|
||||
|
||||
/* Check for broken firmware */
|
||||
if ((sal_revision == SAL_VERSION_CODE(49, 29))
|
||||
&& (sal_version == SAL_VERSION_CODE(49, 29)))
|
||||
{
|
||||
/*
|
||||
* Old firmware for zx2000 prototypes have this weird version number,
|
||||
* reset it to something sane.
|
||||
*/
|
||||
sal_revision = SAL_VERSION_CODE(2, 8);
|
||||
sal_version = SAL_VERSION_CODE(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init
|
||||
sal_desc_entry_point (void *p)
|
||||
{
|
||||
struct ia64_sal_desc_entry_point *ep = p;
|
||||
ia64_pal_handler_init(__va(ep->pal_proc));
|
||||
ia64_sal_handler_init(__va(ep->sal_proc), __va(ep->gp));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void __init
|
||||
set_smp_redirect (int flag)
|
||||
{
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
if (no_int_routing)
|
||||
smp_int_redirect &= ~flag;
|
||||
else
|
||||
smp_int_redirect |= flag;
|
||||
#else
|
||||
/*
|
||||
* For CPU Hotplug we dont want to do any chipset supported
|
||||
* interrupt redirection. The reason is this would require that
|
||||
* All interrupts be stopped and hard bind the irq to a cpu.
|
||||
* Later when the interrupt is fired we need to set the redir hint
|
||||
* on again in the vector. This is combersome for something that the
|
||||
* user mode irq balancer will solve anyways.
|
||||
*/
|
||||
no_int_routing=1;
|
||||
smp_int_redirect &= ~flag;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
#define set_smp_redirect(flag) do { } while (0)
|
||||
#endif
|
||||
|
||||
static void __init
|
||||
sal_desc_platform_feature (void *p)
|
||||
{
|
||||
struct ia64_sal_desc_platform_feature *pf = p;
|
||||
sal_platform_features = pf->feature_mask;
|
||||
|
||||
printk(KERN_INFO "SAL Platform features:");
|
||||
if (!sal_platform_features) {
|
||||
printk(" None\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (sal_platform_features & IA64_SAL_PLATFORM_FEATURE_BUS_LOCK)
|
||||
printk(" BusLock");
|
||||
if (sal_platform_features & IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT) {
|
||||
printk(" IRQ_Redirection");
|
||||
set_smp_redirect(SMP_IRQ_REDIRECTION);
|
||||
}
|
||||
if (sal_platform_features & IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT) {
|
||||
printk(" IPI_Redirection");
|
||||
set_smp_redirect(SMP_IPI_REDIRECTION);
|
||||
}
|
||||
if (sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)
|
||||
printk(" ITC_Drift");
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void __init
|
||||
sal_desc_ap_wakeup (void *p)
|
||||
{
|
||||
struct ia64_sal_desc_ap_wakeup *ap = p;
|
||||
|
||||
switch (ap->mechanism) {
|
||||
case IA64_SAL_AP_EXTERNAL_INT:
|
||||
ap_wakeup_vector = ap->vector;
|
||||
printk(KERN_INFO "SAL: AP wakeup using external interrupt "
|
||||
"vector 0x%lx\n", ap_wakeup_vector);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "SAL: AP wakeup mechanism unsupported!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init
|
||||
chk_nointroute_opt(void)
|
||||
{
|
||||
char *cp;
|
||||
extern char saved_command_line[];
|
||||
|
||||
for (cp = saved_command_line; *cp; ) {
|
||||
if (memcmp(cp, "nointroute", 10) == 0) {
|
||||
no_int_routing = 1;
|
||||
printk ("no_int_routing on\n");
|
||||
break;
|
||||
} else {
|
||||
while (*cp != ' ' && *cp)
|
||||
++cp;
|
||||
while (*cp == ' ')
|
||||
++cp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
static void __init sal_desc_ap_wakeup(void *p) { }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* HP rx5670 firmware polls for interrupts during SAL_CACHE_FLUSH by reading
|
||||
* cr.ivr, but it never writes cr.eoi. This leaves any interrupt marked as
|
||||
* "in-service" and masks other interrupts of equal or lower priority.
|
||||
*
|
||||
* HP internal defect reports: F1859, F2775, F3031.
|
||||
*/
|
||||
static int sal_cache_flush_drops_interrupts;
|
||||
|
||||
static void __init
|
||||
check_sal_cache_flush (void)
|
||||
{
|
||||
unsigned long flags, itv;
|
||||
int cpu;
|
||||
u64 vector;
|
||||
|
||||
cpu = get_cpu();
|
||||
local_irq_save(flags);
|
||||
|
||||
/*
|
||||
* Schedule a timer interrupt, wait until it's reported, and see if
|
||||
* SAL_CACHE_FLUSH drops it.
|
||||
*/
|
||||
itv = ia64_get_itv();
|
||||
BUG_ON((itv & (1 << 16)) == 0);
|
||||
|
||||
ia64_set_itv(IA64_TIMER_VECTOR);
|
||||
ia64_set_itm(ia64_get_itc() + 1000);
|
||||
|
||||
while (!ia64_get_irr(IA64_TIMER_VECTOR))
|
||||
cpu_relax();
|
||||
|
||||
ia64_sal_cache_flush(3);
|
||||
|
||||
if (ia64_get_irr(IA64_TIMER_VECTOR)) {
|
||||
vector = ia64_get_ivr();
|
||||
ia64_eoi();
|
||||
WARN_ON(vector != IA64_TIMER_VECTOR);
|
||||
} else {
|
||||
sal_cache_flush_drops_interrupts = 1;
|
||||
printk(KERN_ERR "SAL: SAL_CACHE_FLUSH drops interrupts; "
|
||||
"PAL_CACHE_FLUSH will be used instead\n");
|
||||
ia64_eoi();
|
||||
}
|
||||
|
||||
ia64_set_itv(itv);
|
||||
local_irq_restore(flags);
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
s64
|
||||
ia64_sal_cache_flush (u64 cache_type)
|
||||
{
|
||||
struct ia64_sal_retval isrv;
|
||||
|
||||
if (sal_cache_flush_drops_interrupts) {
|
||||
unsigned long flags;
|
||||
u64 progress;
|
||||
s64 rc;
|
||||
|
||||
progress = 0;
|
||||
local_irq_save(flags);
|
||||
rc = ia64_pal_cache_flush(cache_type,
|
||||
PAL_CACHE_FLUSH_INVALIDATE, &progress, NULL);
|
||||
local_irq_restore(flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
SAL_CALL(isrv, SAL_CACHE_FLUSH, cache_type, 0, 0, 0, 0, 0, 0);
|
||||
return isrv.status;
|
||||
}
|
||||
|
||||
void __init
|
||||
ia64_sal_init (struct ia64_sal_systab *systab)
|
||||
{
|
||||
char *p;
|
||||
int i;
|
||||
|
||||
if (!systab) {
|
||||
printk(KERN_WARNING "Hmm, no SAL System Table.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncmp(systab->signature, "SST_", 4) != 0)
|
||||
printk(KERN_ERR "bad signature in system table!");
|
||||
|
||||
check_versions(systab);
|
||||
#ifdef CONFIG_SMP
|
||||
chk_nointroute_opt();
|
||||
#endif
|
||||
|
||||
/* revisions are coded in BCD, so %x does the job for us */
|
||||
printk(KERN_INFO "SAL %x.%x: %.32s %.32s%sversion %x.%x\n",
|
||||
SAL_MAJOR(sal_revision), SAL_MINOR(sal_revision),
|
||||
systab->oem_id, systab->product_id,
|
||||
systab->product_id[0] ? " " : "",
|
||||
SAL_MAJOR(sal_version), SAL_MINOR(sal_version));
|
||||
|
||||
p = (char *) (systab + 1);
|
||||
for (i = 0; i < systab->entry_count; i++) {
|
||||
/*
|
||||
* The first byte of each entry type contains the type
|
||||
* descriptor.
|
||||
*/
|
||||
switch (*p) {
|
||||
case SAL_DESC_ENTRY_POINT:
|
||||
sal_desc_entry_point(p);
|
||||
break;
|
||||
case SAL_DESC_PLATFORM_FEATURE:
|
||||
sal_desc_platform_feature(p);
|
||||
break;
|
||||
case SAL_DESC_PTC:
|
||||
ia64_ptc_domain_info = (ia64_sal_desc_ptc_t *)p;
|
||||
break;
|
||||
case SAL_DESC_AP_WAKEUP:
|
||||
sal_desc_ap_wakeup(p);
|
||||
break;
|
||||
}
|
||||
p += SAL_DESC_SIZE(*p);
|
||||
}
|
||||
|
||||
if (!running_on_xen)
|
||||
check_sal_cache_flush();
|
||||
}
|
||||
|
||||
int
|
||||
ia64_sal_oemcall(struct ia64_sal_retval *isrvp, u64 oemfunc, u64 arg1,
|
||||
u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7)
|
||||
{
|
||||
if (oemfunc < IA64_SAL_OEMFUNC_MIN || oemfunc > IA64_SAL_OEMFUNC_MAX)
|
||||
return -1;
|
||||
SAL_CALL(*isrvp, oemfunc, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ia64_sal_oemcall);
|
||||
|
||||
int
|
||||
ia64_sal_oemcall_nolock(struct ia64_sal_retval *isrvp, u64 oemfunc, u64 arg1,
|
||||
u64 arg2, u64 arg3, u64 arg4, u64 arg5, u64 arg6,
|
||||
u64 arg7)
|
||||
{
|
||||
if (oemfunc < IA64_SAL_OEMFUNC_MIN || oemfunc > IA64_SAL_OEMFUNC_MAX)
|
||||
return -1;
|
||||
SAL_CALL_NOLOCK(*isrvp, oemfunc, arg1, arg2, arg3, arg4, arg5, arg6,
|
||||
arg7);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ia64_sal_oemcall_nolock);
|
||||
|
||||
int
|
||||
ia64_sal_oemcall_reentrant(struct ia64_sal_retval *isrvp, u64 oemfunc,
|
||||
u64 arg1, u64 arg2, u64 arg3, u64 arg4, u64 arg5,
|
||||
u64 arg6, u64 arg7)
|
||||
{
|
||||
if (oemfunc < IA64_SAL_OEMFUNC_MIN || oemfunc > IA64_SAL_OEMFUNC_MAX)
|
||||
return -1;
|
||||
SAL_CALL_REENTRANT(*isrvp, oemfunc, arg1, arg2, arg3, arg4, arg5, arg6,
|
||||
arg7);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ia64_sal_oemcall_reentrant);
|
||||
@@ -71,6 +71,8 @@ unsigned long __per_cpu_offset[NR_CPUS];
|
||||
EXPORT_SYMBOL(__per_cpu_offset);
|
||||
#endif
|
||||
|
||||
extern void ia64_setup_printk_clock(void);
|
||||
|
||||
DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
|
||||
DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
|
||||
DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
|
||||
@@ -449,6 +451,8 @@ setup_arch (char **cmdline_p)
|
||||
/* process SAL system table: */
|
||||
ia64_sal_init(efi.sal_systab);
|
||||
|
||||
ia64_setup_printk_clock();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpu_physical_id(0) = hard_smp_processor_id();
|
||||
|
||||
|
||||
@@ -560,6 +560,23 @@ ia64_eoi (void)
|
||||
|
||||
#define cpu_relax() ia64_hint(ia64_hint_pause)
|
||||
|
||||
static inline int
|
||||
ia64_get_irr(unsigned int vector)
|
||||
{
|
||||
unsigned int reg = vector / 64;
|
||||
unsigned int bit = vector % 64;
|
||||
u64 irr;
|
||||
|
||||
switch (reg) {
|
||||
case 0: irr = ia64_getreg(_IA64_REG_CR_IRR0); break;
|
||||
case 1: irr = ia64_getreg(_IA64_REG_CR_IRR1); break;
|
||||
case 2: irr = ia64_getreg(_IA64_REG_CR_IRR2); break;
|
||||
case 3: irr = ia64_getreg(_IA64_REG_CR_IRR3); break;
|
||||
}
|
||||
|
||||
return test_bit(bit, &irr);
|
||||
}
|
||||
|
||||
static inline void
|
||||
ia64_set_lrr0 (unsigned long val)
|
||||
{
|
||||
|
||||
@@ -249,32 +249,7 @@ extern void ia64_load_extra (struct task_struct *task);
|
||||
# define switch_to(prev,next,last) __switch_to(prev, next, last)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On IA-64, we don't want to hold the runqueue's lock during the low-level context-switch,
|
||||
* because that could cause a deadlock. Here is an example by Erich Focht:
|
||||
*
|
||||
* Example:
|
||||
* CPU#0:
|
||||
* schedule()
|
||||
* -> spin_lock_irq(&rq->lock)
|
||||
* -> context_switch()
|
||||
* -> wrap_mmu_context()
|
||||
* -> read_lock(&tasklist_lock)
|
||||
*
|
||||
* CPU#1:
|
||||
* sys_wait4() or release_task() or forget_original_parent()
|
||||
* -> write_lock(&tasklist_lock)
|
||||
* -> do_notify_parent()
|
||||
* -> wake_up_parent()
|
||||
* -> try_to_wake_up()
|
||||
* -> spin_lock_irq(&parent_rq->lock)
|
||||
*
|
||||
* If the parent's rq happens to be on CPU#0, we'll wait for the rq->lock
|
||||
* of that CPU which will not be released, because there we wait for the
|
||||
* tasklist_lock to become available.
|
||||
*/
|
||||
#define __ARCH_WANT_UNLOCKED_CTXSW
|
||||
|
||||
#define ARCH_HAS_PREFETCH_SWITCH_STACK
|
||||
#define ia64_platform_is(x) (strcmp(x, platform_name) == 0)
|
||||
|
||||
|
||||