generic-y += clkdev.h
generic-y += cputime.h
generic-y += exec.h
-generic-y += export.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
obj-y := entry.o traps.o process.o osf_sys.o irq.o \
irq_alpha.o signal.o setup.o ptrace.o time.o \
- systbls.o err_common.o io.o
+ alpha_ksyms.o systbls.o err_common.o io.o
obj-$(CONFIG_VGA_HOSE) += console.o
obj-$(CONFIG_SMP) += smp.o
--- /dev/null
+/*
+ * linux/arch/alpha/kernel/alpha_ksyms.c
+ *
+ * Export the alpha-specific functions that are needed for loadable
+ * modules.
+ */
+
+#include <linux/module.h>
+#include <asm/console.h>
+#include <asm/uaccess.h>
+#include <asm/checksum.h>
+#include <asm/fpu.h>
+#include <asm/machvec.h>
+
+#include <linux/syscalls.h>
+
+/* these are C runtime functions with special calling conventions: */
+extern void __divl (void);
+extern void __reml (void);
+extern void __divq (void);
+extern void __remq (void);
+extern void __divlu (void);
+extern void __remlu (void);
+extern void __divqu (void);
+extern void __remqu (void);
+
+EXPORT_SYMBOL(alpha_mv);
+EXPORT_SYMBOL(callback_getenv);
+EXPORT_SYMBOL(callback_setenv);
+EXPORT_SYMBOL(callback_save_env);
+
+/* platform dependent support */
+EXPORT_SYMBOL(strcat);
+EXPORT_SYMBOL(strcpy);
+EXPORT_SYMBOL(strlen);
+EXPORT_SYMBOL(strncpy);
+EXPORT_SYMBOL(strncat);
+EXPORT_SYMBOL(strchr);
+EXPORT_SYMBOL(strrchr);
+EXPORT_SYMBOL(memmove);
+EXPORT_SYMBOL(__memcpy);
+EXPORT_SYMBOL(__memset);
+EXPORT_SYMBOL(___memset);
+EXPORT_SYMBOL(__memsetw);
+EXPORT_SYMBOL(__constant_c_memset);
+EXPORT_SYMBOL(copy_page);
+EXPORT_SYMBOL(clear_page);
+
+EXPORT_SYMBOL(alpha_read_fp_reg);
+EXPORT_SYMBOL(alpha_read_fp_reg_s);
+EXPORT_SYMBOL(alpha_write_fp_reg);
+EXPORT_SYMBOL(alpha_write_fp_reg_s);
+
+/* Networking helper routines. */
+EXPORT_SYMBOL(csum_tcpudp_magic);
+EXPORT_SYMBOL(ip_compute_csum);
+EXPORT_SYMBOL(ip_fast_csum);
+EXPORT_SYMBOL(csum_partial_copy_nocheck);
+EXPORT_SYMBOL(csum_partial_copy_from_user);
+EXPORT_SYMBOL(csum_ipv6_magic);
+
+#ifdef CONFIG_MATHEMU_MODULE
+extern long (*alpha_fp_emul_imprecise)(struct pt_regs *, unsigned long);
+extern long (*alpha_fp_emul) (unsigned long pc);
+EXPORT_SYMBOL(alpha_fp_emul_imprecise);
+EXPORT_SYMBOL(alpha_fp_emul);
+#endif
+
+/*
+ * The following are specially called from the uaccess assembly stubs.
+ */
+EXPORT_SYMBOL(__copy_user);
+EXPORT_SYMBOL(__do_clear_user);
+
+/*
+ * SMP-specific symbols.
+ */
+
+#ifdef CONFIG_SMP
+EXPORT_SYMBOL(_atomic_dec_and_lock);
+#endif /* CONFIG_SMP */
+
+/*
+ * The following are special because they're not called
+ * explicitly (the C compiler or assembler generates them in
+ * response to division operations). Fortunately, their
+ * interface isn't gonna change any time soon now, so it's OK
+ * to leave it out of version control.
+ */
+# undef memcpy
+# undef memset
+EXPORT_SYMBOL(__divl);
+EXPORT_SYMBOL(__divlu);
+EXPORT_SYMBOL(__divq);
+EXPORT_SYMBOL(__divqu);
+EXPORT_SYMBOL(__reml);
+EXPORT_SYMBOL(__remlu);
+EXPORT_SYMBOL(__remq);
+EXPORT_SYMBOL(__remqu);
+EXPORT_SYMBOL(memcpy);
+EXPORT_SYMBOL(memset);
+EXPORT_SYMBOL(memchr);
else beforehand. Fine. We'll do it ourselves. */
#if 0
#define ALIAS_MV(system) \
- struct alpha_machine_vector alpha_mv __attribute__((alias(#system "_mv"))); \
- EXPORT_SYMBOL(alpha_mv);
+ struct alpha_machine_vector alpha_mv __attribute__((alias(#system "_mv")));
#else
#define ALIAS_MV(system) \
- asm(".global alpha_mv\nalpha_mv = " #system "_mv"); \
- EXPORT_SYMBOL(alpha_mv);
+ asm(".global alpha_mv\nalpha_mv = " #system "_mv");
#endif
#endif /* GENERIC */
#ifdef CONFIG_ALPHA_GENERIC
struct alpha_machine_vector alpha_mv;
-EXPORT_SYMBOL(alpha_mv);
#endif
#ifndef alpha_using_srm
*/
#include <asm/console.h>
-#include <asm/export.h>
.text
#define HWRPB_CRB_OFFSET 0xc0
CALLBACK(save_env, CCB_SAVE_ENV, 1)
CALLBACK(pswitch, CCB_PSWITCH, 3)
CALLBACK(bios_emul, CCB_BIOS_EMUL, 5)
-
-EXPORT_SYMBOL(callback_getenv)
-EXPORT_SYMBOL(callback_setenv)
-EXPORT_SYMBOL(callback_save_env)
.data
__alpha_using_srm: # For use by bootpheader
(__force u64)saddr + (__force u64)daddr +
(__force u64)sum + ((len + proto) << 8));
}
-EXPORT_SYMBOL(csum_tcpudp_magic);
__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
__u32 len, __u8 proto, __wsum sum)
{
return (__force __sum16)~do_csum(iph,ihl*4);
}
-EXPORT_SYMBOL(ip_fast_csum);
/*
* computes the checksum of a memory block at buff, length len,
{
return (__force __sum16)~from64to16(do_csum(buff,len));
}
-EXPORT_SYMBOL(ip_compute_csum);
*
* Zero an entire page.
*/
-#include <asm/export.h>
+
.text
.align 4
.global clear_page
nop
.end clear_page
- EXPORT_SYMBOL(clear_page)
* Clobbers:
* $1,$2,$3,$4,$5,$6
*/
-#include <asm/export.h>
/* Allow an exception for an insn; exit if we get one. */
#define EX(x,y...) \
ret $31, ($28), 1 # .. e1 :
.end __do_clear_user
- EXPORT_SYMBOL(__do_clear_user)
*
* Copy an entire page.
*/
-#include <asm/export.h>
+
.text
.align 4
.global copy_page
nop
.end copy_page
- EXPORT_SYMBOL(copy_page)
* $1,$2,$3,$4,$5,$6,$7
*/
-#include <asm/export.h>
-
/* Allow an exception for an insn; exit if we get one. */
#define EXI(x,y...) \
99: x,##y; \
ret $31,($28),1
.end __copy_user
-EXPORT_SYMBOL(__copy_user)
* added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
*/
-#include <asm/export.h>
.globl csum_ipv6_magic
.align 4
.ent csum_ipv6_magic
ret # .. e1 :
.end csum_ipv6_magic
- EXPORT_SYMBOL(csum_ipv6_magic)
}
return (__force __wsum)checksum;
}
-EXPORT_SYMBOL(csum_partial_copy_from_user);
__wsum
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
set_fs(oldfs);
return checksum;
}
-EXPORT_SYMBOL(csum_partial_copy_nocheck);
#include <linux/spinlock.h>
#include <linux/atomic.h>
-#include <linux/export.h>
asm (".text \n\
.global _atomic_dec_and_lock \n\
spin_unlock(lock);
return 0;
}
-EXPORT_SYMBOL(_atomic_dec_and_lock);
* $28 - compare status
*/
-#include <asm/export.h>
#define halt .long 0
/*
addq $30,STACK,$30
ret $31,($23),1
.end ufunction
-EXPORT_SYMBOL(ufunction)
/*
* Uhh.. Ugly signed division. I'd rather not have it at all, but
addq $30,STACK,$30
ret $31,($23),1
.end sfunction
-EXPORT_SYMBOL(sfunction)
*
* Zero an entire page.
*/
-#include <asm/export.h>
+
.text
.align 4
.global clear_page
nop
.end clear_page
- EXPORT_SYMBOL(clear_page)
* want to leave a hole (and we also want to avoid repeating lots of work)
*/
-#include <asm/export.h>
/* Allow an exception for an insn; exit if we get one. */
#define EX(x,y...) \
99: x,##y; \
nop # .. E .. .. :
ret $31, ($28), 1 # L0 .. .. .. : L U L U
.end __do_clear_user
- EXPORT_SYMBOL(__do_clear_user)
+
destination pages are in the dcache, but it is my guess that this is
less important than the dcache miss case. */
-#include <asm/export.h>
+
.text
.align 4
.global copy_page
nop
.end copy_page
- EXPORT_SYMBOL(copy_page)
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
*/
-#include <asm/export.h>
/* Allow an exception for an insn; exit if we get one. */
#define EXI(x,y...) \
99: x,##y; \
ret $31,($28),1 # L0 .. .. .. : L U L U
.end __copy_user
- EXPORT_SYMBOL(__copy_user)
+
* may cause additional delay in rare cases (load-load replay traps).
*/
-#include <asm/export.h>
.globl csum_ipv6_magic
.align 4
.ent csum_ipv6_magic
ret # L0 : L U L U
.end csum_ipv6_magic
- EXPORT_SYMBOL(csum_ipv6_magic)
* Try not to change the actual algorithm if possible for consistency.
*/
-#include <asm/export.h>
#define halt .long 0
/*
addq $30,STACK,$30 # E :
ret $31,($23),1 # L0 : L U U L
.end ufunction
-EXPORT_SYMBOL(ufunction)
/*
* Uhh.. Ugly signed division. I'd rather not have it at all, but
addq $30,STACK,$30 # E :
ret $31,($23),1 # L0 : L U U L
.end sfunction
-EXPORT_SYMBOL(sfunction)
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
* Try not to change the actual algorithm if possible for consistency.
*/
-#include <asm/export.h>
+
.set noreorder
.set noat
ret # L0 :
.end memchr
- EXPORT_SYMBOL(memchr)
* Temp usage notes:
* $1,$2, - scratch
*/
-#include <asm/export.h>
+
.set noreorder
.set noat
nop # E :
.end memcpy
- EXPORT_SYMBOL(memcpy)
/* For backwards module compatibility. */
__memcpy = memcpy
* as fixes will need to be made in multiple places. The performance gain
* is worth it.
*/
-#include <asm/export.h>
+
.set noat
.set noreorder
.text
nop
ret $31,($26),1 # L0 :
.end ___memset
- EXPORT_SYMBOL(___memset)
/*
* This is the original body of code, prior to replication and
nop
ret $31,($26),1 # L0 :
.end __constant_c_memset
- EXPORT_SYMBOL(__constant_c_memset)
/*
* This is a replicant of the __constant_c_memset code, rescheduled
ret $31,($26),1 # L0 :
.end __memsetw
- EXPORT_SYMBOL(__memsetw)
memset = ___memset
__memset = ___memset
- EXPORT_SYMBOL(memset)
- EXPORT_SYMBOL(__memset)
* string once.
*/
-#include <asm/export.h>
+
.text
.align 4
br __stxcpy # L0 :
.end strcat
- EXPORT_SYMBOL(strcat)
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
* Try not to change the actual algorithm if possible for consistency.
*/
-#include <asm/export.h>
+
#include <asm/regdef.h>
.set noreorder
ret # L0 :
.end strchr
- EXPORT_SYMBOL(strchr)
* U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
*/
-#include <asm/export.h>
+
.set noreorder
.set noat
ret $31, ($26) # L0 :
.end strlen
- EXPORT_SYMBOL(strlen)
* Try not to change the actual algorithm if possible for consistency.
*/
-#include <asm/export.h>
+
.text
.align 4
ret # L0 :
.end strncat
- EXPORT_SYMBOL(strncat)
* L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
*/
-#include <asm/export.h>
+
#include <asm/regdef.h>
.set noreorder
nop
.end strrchr
- EXPORT_SYMBOL(strrchr)
* (C) Copyright 1998 Linus Torvalds
*/
-#include <linux/compiler.h>
-#include <linux/export.h>
-
#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
#define STT(reg,val) asm volatile ("ftoit $f"#reg",%0" : "=r"(val));
#else
}
return val;
}
-EXPORT_SYMBOL(alpha_read_fp_reg);
#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
#define LDT(reg,val) asm volatile ("itoft %0,$f"#reg : : "r"(val));
case 31: LDT(31, val); break;
}
}
-EXPORT_SYMBOL(alpha_write_fp_reg);
#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
#define STS(reg,val) asm volatile ("ftois $f"#reg",%0" : "=r"(val));
}
return val;
}
-EXPORT_SYMBOL(alpha_read_fp_reg_s);
#if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
#define LDS(reg,val) asm volatile ("itofs %0,$f"#reg : : "r"(val));
case 31: LDS(31, val); break;
}
}
-EXPORT_SYMBOL(alpha_write_fp_reg_s);
- only minimum number of quadwords may be accessed
- the third argument is an unsigned long
*/
-#include <asm/export.h>
+
.set noreorder
.set noat
ret # .. e1 :
.end memchr
- EXPORT_SYMBOL(memchr)
*/
#include <linux/types.h>
-#include <linux/export.h>
/*
* This should be done in one go with ldq_u*2/mask/stq_u. Do it
__memcpy_unaligned_up ((unsigned long) dest, (unsigned long) src, n);
return dest;
}
-EXPORT_SYMBOL(memcpy);
+
+/* For backward modules compatibility, define __memcpy. */
+asm("__memcpy = memcpy; .globl __memcpy");
* This is hand-massaged output from the original memcpy.c. We defer to
* memcpy whenever possible; the backwards copy loops are not unrolled.
*/
-#include <asm/export.h>
+
.set noat
.set noreorder
.text
nop
.end memmove
- EXPORT_SYMBOL(memmove)
* The scheduling comments are according to the EV5 documentation (and done by
* hand, so they might well be incorrect, please do tell me about it..)
*/
-#include <asm/export.h>
+
.set noat
.set noreorder
.text
end:
ret $31,($26),1 /* E1 */
.end ___memset
-EXPORT_SYMBOL(___memset)
-EXPORT_SYMBOL(__constant_c_memset)
.align 5
.ent __memsetw
br __constant_c_memset /* .. E1 */
.end __memsetw
-EXPORT_SYMBOL(__memsetw)
memset = ___memset
__memset = ___memset
- EXPORT_SYMBOL(memset)
- EXPORT_SYMBOL(__memset)
*
* Append a null-terminated string from SRC to DST.
*/
-#include <asm/export.h>
.text
br __stxcpy
.end strcat
-EXPORT_SYMBOL(strcat);
* Return the address of a given character within a null-terminated
* string, or null if it is not found.
*/
-#include <asm/export.h>
+
#include <asm/regdef.h>
.set noreorder
ret # .. e1 :
.end strchr
- EXPORT_SYMBOL(strchr)
* Copy a null-terminated string from SRC to DST. Return a pointer
* to the null-terminator in the source.
*/
-#include <asm/export.h>
+
.text
.align 3
br __stxcpy # do the copy
.end strcpy
- EXPORT_SYMBOL(strcpy)
* do this instead of the 9 instructions that
* binary search needs).
*/
-#include <asm/export.h>
+
.set noreorder
.set noat
ret $31, ($26)
.end strlen
- EXPORT_SYMBOL(strlen)
* past count, whereas libc may write to count+1. This follows the generic
* implementation in lib/string.c and is, IMHO, more sensible.
*/
-#include <asm/export.h>
+
.text
.align 3
ret
.end strncat
- EXPORT_SYMBOL(strncat)
* version has cropped that bit o' nastiness as well as assuming that
* __stxncpy is in range of a branch.
*/
-#include <asm/export.h>
+
.set noat
.set noreorder
ret
.end strncpy
- EXPORT_SYMBOL(strncpy)
* Return the address of the last occurrence of a given character
* within a null-terminated string, or null if it is not found.
*/
-#include <asm/export.h>
+
#include <asm/regdef.h>
.set noreorder
ret # .. e1 :
.end strrchr
- EXPORT_SYMBOL(strrchr)