Merge remote-tracking branch 'origin/x86/boot' into x86/mm2
Coming patches to x86/mm2 require the changes and advanced baseline in x86/boot. Resolved Conflicts: arch/x86/kernel/setup.c mm/nobootmem.c Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
@@ -81,18 +81,18 @@ static void usage(void)
|
||||
|
||||
static int start_line(const char *line)
|
||||
{
|
||||
if (strcmp(line + 8, " T _start\n") == 0)
|
||||
if (strcmp(line + 10, " _start\n") == 0)
|
||||
return 1;
|
||||
else if (strcmp(line + 16, " T _start\n") == 0)
|
||||
else if (strcmp(line + 18, " _start\n") == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int end_line(const char *line)
|
||||
{
|
||||
if (strcmp(line + 8, " A _end\n") == 0)
|
||||
if (strcmp(line + 10, " _end\n") == 0)
|
||||
return 1;
|
||||
else if (strcmp (line + 16, " A _end\n") == 0)
|
||||
else if (strcmp (line + 18, " _end\n") == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -100,8 +100,8 @@ static int end_line(const char *line)
|
||||
/*
|
||||
* Find address for start and end in System.map.
|
||||
* The file looks like this:
|
||||
* f0004000 T _start
|
||||
* f0379f79 A _end
|
||||
* f0004000 ... _start
|
||||
* f0379f79 ... _end
|
||||
* 1234567890123456
|
||||
* ^coloumn 1
|
||||
* There is support for 64 bit addresses too.
|
||||
|
@@ -1024,7 +1024,11 @@ ENTRY(aes_sparc64_ecb_encrypt_256)
|
||||
add %o2, 0x20, %o2
|
||||
brlz,pt %o3, 11f
|
||||
nop
|
||||
10: ldx [%o1 + 0x00], %g3
|
||||
10: ldd [%o0 + 0xd0], %f56
|
||||
ldd [%o0 + 0xd8], %f58
|
||||
ldd [%o0 + 0xe0], %f60
|
||||
ldd [%o0 + 0xe8], %f62
|
||||
ldx [%o1 + 0x00], %g3
|
||||
ldx [%o1 + 0x08], %g7
|
||||
xor %g1, %g3, %g3
|
||||
xor %g2, %g7, %g7
|
||||
@@ -1128,9 +1132,9 @@ ENTRY(aes_sparc64_ecb_decrypt_256)
|
||||
/* %o0=&key[key_len], %o1=input, %o2=output, %o3=len */
|
||||
ldx [%o0 - 0x10], %g1
|
||||
subcc %o3, 0x10, %o3
|
||||
ldx [%o0 - 0x08], %g2
|
||||
be 10f
|
||||
ldx [%o0 - 0x08], %g2
|
||||
sub %o0, 0xf0, %o0
|
||||
sub %o0, 0xf0, %o0
|
||||
1: ldx [%o1 + 0x00], %g3
|
||||
ldx [%o1 + 0x08], %g7
|
||||
ldx [%o1 + 0x10], %o4
|
||||
@@ -1154,7 +1158,11 @@ ENTRY(aes_sparc64_ecb_decrypt_256)
|
||||
add %o2, 0x20, %o2
|
||||
brlz,pt %o3, 11f
|
||||
nop
|
||||
10: ldx [%o1 + 0x00], %g3
|
||||
10: ldd [%o0 + 0x18], %f56
|
||||
ldd [%o0 + 0x10], %f58
|
||||
ldd [%o0 + 0x08], %f60
|
||||
ldd [%o0 + 0x00], %f62
|
||||
ldx [%o1 + 0x00], %g3
|
||||
ldx [%o1 + 0x08], %g7
|
||||
xor %g1, %g3, %g3
|
||||
xor %g2, %g7, %g7
|
||||
@@ -1511,11 +1519,11 @@ ENTRY(aes_sparc64_ctr_crypt_256)
|
||||
add %o2, 0x20, %o2
|
||||
brlz,pt %o3, 11f
|
||||
nop
|
||||
ldd [%o0 + 0xd0], %f56
|
||||
10: ldd [%o0 + 0xd0], %f56
|
||||
ldd [%o0 + 0xd8], %f58
|
||||
ldd [%o0 + 0xe0], %f60
|
||||
ldd [%o0 + 0xe8], %f62
|
||||
10: xor %g1, %g3, %o5
|
||||
xor %g1, %g3, %o5
|
||||
MOVXTOD_O5_F0
|
||||
xor %g2, %g7, %o5
|
||||
MOVXTOD_O5_F2
|
||||
|
@@ -222,6 +222,7 @@ static int ecb_encrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
ctx->ops->load_encrypt_keys(&ctx->key[0]);
|
||||
while ((nbytes = walk.nbytes)) {
|
||||
@@ -251,6 +252,7 @@ static int ecb_decrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
ctx->ops->load_decrypt_keys(&ctx->key[0]);
|
||||
key_end = &ctx->key[ctx->expanded_key_length / sizeof(u64)];
|
||||
@@ -280,6 +282,7 @@ static int cbc_encrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
ctx->ops->load_encrypt_keys(&ctx->key[0]);
|
||||
while ((nbytes = walk.nbytes)) {
|
||||
@@ -309,6 +312,7 @@ static int cbc_decrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
ctx->ops->load_decrypt_keys(&ctx->key[0]);
|
||||
key_end = &ctx->key[ctx->expanded_key_length / sizeof(u64)];
|
||||
@@ -329,6 +333,22 @@ static int cbc_decrypt(struct blkcipher_desc *desc,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ctr_crypt_final(struct crypto_sparc64_aes_ctx *ctx,
|
||||
struct blkcipher_walk *walk)
|
||||
{
|
||||
u8 *ctrblk = walk->iv;
|
||||
u64 keystream[AES_BLOCK_SIZE / sizeof(u64)];
|
||||
u8 *src = walk->src.virt.addr;
|
||||
u8 *dst = walk->dst.virt.addr;
|
||||
unsigned int nbytes = walk->nbytes;
|
||||
|
||||
ctx->ops->ecb_encrypt(&ctx->key[0], (const u64 *)ctrblk,
|
||||
keystream, AES_BLOCK_SIZE);
|
||||
crypto_xor((u8 *) keystream, src, nbytes);
|
||||
memcpy(dst, keystream, nbytes);
|
||||
crypto_inc(ctrblk, AES_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
static int ctr_crypt(struct blkcipher_desc *desc,
|
||||
struct scatterlist *dst, struct scatterlist *src,
|
||||
unsigned int nbytes)
|
||||
@@ -338,10 +358,11 @@ static int ctr_crypt(struct blkcipher_desc *desc,
|
||||
int err;
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
err = blkcipher_walk_virt_block(desc, &walk, AES_BLOCK_SIZE);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
ctx->ops->load_encrypt_keys(&ctx->key[0]);
|
||||
while ((nbytes = walk.nbytes)) {
|
||||
while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) {
|
||||
unsigned int block_len = nbytes & AES_BLOCK_MASK;
|
||||
|
||||
if (likely(block_len)) {
|
||||
@@ -353,6 +374,10 @@ static int ctr_crypt(struct blkcipher_desc *desc,
|
||||
nbytes &= AES_BLOCK_SIZE - 1;
|
||||
err = blkcipher_walk_done(desc, &walk, nbytes);
|
||||
}
|
||||
if (walk.nbytes) {
|
||||
ctr_crypt_final(ctx, &walk);
|
||||
err = blkcipher_walk_done(desc, &walk, 0);
|
||||
}
|
||||
fprs_write(0);
|
||||
return err;
|
||||
}
|
||||
@@ -418,7 +443,7 @@ static struct crypto_alg algs[] = { {
|
||||
.cra_driver_name = "ctr-aes-sparc64",
|
||||
.cra_priority = SPARC_CR_OPCODE_PRIORITY,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
|
||||
.cra_blocksize = AES_BLOCK_SIZE,
|
||||
.cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct crypto_sparc64_aes_ctx),
|
||||
.cra_alignmask = 7,
|
||||
.cra_type = &crypto_blkcipher_type,
|
||||
|
@@ -98,6 +98,7 @@ static int __ecb_crypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
if (encrypt)
|
||||
key = &ctx->encrypt_key[0];
|
||||
@@ -160,6 +161,7 @@ static int cbc_encrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
key = &ctx->encrypt_key[0];
|
||||
camellia_sparc64_load_keys(key, ctx->key_len);
|
||||
@@ -198,6 +200,7 @@ static int cbc_decrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
key = &ctx->decrypt_key[0];
|
||||
camellia_sparc64_load_keys(key, ctx->key_len);
|
||||
|
@@ -376,6 +376,7 @@ ENTRY(des3_ede_sparc64_ecb_crypt)
|
||||
1: ldd [%o1 + 0x00], %f60
|
||||
DES3_LOOP_BODY(60)
|
||||
std %f60, [%o2 + 0x00]
|
||||
add %o1, 0x08, %o1
|
||||
subcc %o3, 0x08, %o3
|
||||
bne,pt %icc, 1b
|
||||
add %o2, 0x08, %o2
|
||||
|
@@ -100,6 +100,7 @@ static int __ecb_crypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
if (encrypt)
|
||||
des_sparc64_load_keys(&ctx->encrypt_expkey[0]);
|
||||
@@ -147,6 +148,7 @@ static int cbc_encrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
des_sparc64_load_keys(&ctx->encrypt_expkey[0]);
|
||||
while ((nbytes = walk.nbytes)) {
|
||||
@@ -177,6 +179,7 @@ static int cbc_decrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
des_sparc64_load_keys(&ctx->decrypt_expkey[0]);
|
||||
while ((nbytes = walk.nbytes)) {
|
||||
@@ -266,6 +269,7 @@ static int __ecb3_crypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
if (encrypt)
|
||||
K = &ctx->encrypt_expkey[0];
|
||||
@@ -317,6 +321,7 @@ static int cbc3_encrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
K = &ctx->encrypt_expkey[0];
|
||||
des3_ede_sparc64_load_keys(K);
|
||||
@@ -352,6 +357,7 @@ static int cbc3_decrypt(struct blkcipher_desc *desc,
|
||||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
err = blkcipher_walk_virt(desc, &walk);
|
||||
desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
K = &ctx->decrypt_expkey[0];
|
||||
des3_ede_sparc64_load_keys(K);
|
||||
|
@@ -8,4 +8,5 @@ generic-y += local64.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += local.h
|
||||
generic-y += module.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += word-at-a-time.h
|
||||
|
@@ -59,6 +59,7 @@ static inline void dma_free_attrs(struct device *dev, size_t size,
|
||||
|
||||
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
{
|
||||
debug_dma_mapping_error(dev, dma_addr);
|
||||
return (dma_addr == DMA_ERROR_CODE);
|
||||
}
|
||||
|
||||
|
@@ -61,14 +61,20 @@ static inline pte_t huge_pte_wrprotect(pte_t pte)
|
||||
static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
ptep_set_wrprotect(mm, addr, ptep);
|
||||
pte_t old_pte = *ptep;
|
||||
set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
|
||||
}
|
||||
|
||||
static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep,
|
||||
pte_t pte, int dirty)
|
||||
{
|
||||
return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
|
||||
int changed = !pte_same(*ptep, pte);
|
||||
if (changed) {
|
||||
set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
|
||||
flush_tlb_page(vma, addr);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
static inline pte_t huge_ptep_get(pte_t *ptep)
|
||||
|
@@ -103,7 +103,7 @@ static inline unsigned int get_dma_residue(unsigned int dmanr)
|
||||
return ebus_dma_residue(&sparc_ebus_dmas[dmanr].info);
|
||||
}
|
||||
|
||||
static int __devinit ecpp_probe(struct platform_device *op)
|
||||
static int ecpp_probe(struct platform_device *op)
|
||||
{
|
||||
unsigned long base = op->resource[0].start;
|
||||
unsigned long config = op->resource[1].start;
|
||||
@@ -192,7 +192,7 @@ out_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit ecpp_remove(struct platform_device *op)
|
||||
static int ecpp_remove(struct platform_device *op)
|
||||
{
|
||||
struct parport *p = dev_get_drvdata(&op->dev);
|
||||
int slot = p->dma;
|
||||
@@ -242,7 +242,7 @@ static struct platform_driver ecpp_driver = {
|
||||
.of_match_table = ecpp_match,
|
||||
},
|
||||
.probe = ecpp_probe,
|
||||
.remove = __devexit_p(ecpp_remove),
|
||||
.remove = ecpp_remove,
|
||||
};
|
||||
|
||||
static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
|
||||
|
@@ -617,6 +617,12 @@ static inline unsigned long pte_present(pte_t pte)
|
||||
return val;
|
||||
}
|
||||
|
||||
#define pte_accessible pte_accessible
|
||||
static inline unsigned long pte_accessible(pte_t a)
|
||||
{
|
||||
return pte_val(a) & _PAGE_VALID;
|
||||
}
|
||||
|
||||
static inline unsigned long pte_special(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_SPECIAL;
|
||||
@@ -802,7 +808,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
* SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U
|
||||
* and SUN4V pte layout, so this inline test is fine.
|
||||
*/
|
||||
if (likely(mm != &init_mm) && (pte_val(orig) & _PAGE_VALID))
|
||||
if (likely(mm != &init_mm) && pte_accessible(orig))
|
||||
tlb_batch_add(mm, addr, ptep, orig, fullmm);
|
||||
}
|
||||
|
||||
|
@@ -106,7 +106,6 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
|
||||
|
||||
/* Free all resources held by a thread. */
|
||||
#define release_thread(tsk) do { } while(0)
|
||||
extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
||||
|
||||
extern unsigned long get_wchan(struct task_struct *);
|
||||
|
||||
|
@@ -94,6 +94,7 @@ struct thread_struct {
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/fpumacro.h>
|
||||
|
||||
/* Return saved PC of a blocked thread. */
|
||||
struct task_struct;
|
||||
@@ -143,6 +144,10 @@ do { \
|
||||
: \
|
||||
: "r" (regs), "r" (sp - sizeof(struct reg_window) - STACK_BIAS), \
|
||||
"i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \
|
||||
fprs_write(0); \
|
||||
current_thread_info()->xfsr[0] = 0; \
|
||||
current_thread_info()->fpsaved[0] = 0; \
|
||||
regs->tstate &= ~TSTATE_PEF; \
|
||||
} while (0)
|
||||
|
||||
#define start_thread32(regs, pc, sp) \
|
||||
@@ -183,13 +188,15 @@ do { \
|
||||
: \
|
||||
: "r" (regs), "r" (sp - sizeof(struct reg_window32)), \
|
||||
"i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); \
|
||||
fprs_write(0); \
|
||||
current_thread_info()->xfsr[0] = 0; \
|
||||
current_thread_info()->fpsaved[0] = 0; \
|
||||
regs->tstate &= ~TSTATE_PEF; \
|
||||
} while (0)
|
||||
|
||||
/* Free all resources held by a thread. */
|
||||
#define release_thread(tsk) do { } while (0)
|
||||
|
||||
extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
||||
|
||||
extern unsigned long get_wchan(struct task_struct *task);
|
||||
|
||||
#define task_pt_regs(tsk) (task_thread_info(tsk)->kregs)
|
||||
|
@@ -63,10 +63,13 @@ extern char *of_console_options;
|
||||
extern void irq_trans_init(struct device_node *dp);
|
||||
extern char *build_path_component(struct device_node *dp);
|
||||
|
||||
/* SPARC has a local implementation */
|
||||
/* SPARC has local implementations */
|
||||
extern int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r);
|
||||
#define of_address_to_resource of_address_to_resource
|
||||
|
||||
void __iomem *of_iomap(struct device_node *node, int index);
|
||||
#define of_iomap of_iomap
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _SPARC_PROM_H */
|
||||
|
@@ -32,6 +32,9 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
||||
#define arch_ptrace_stop(exit_code, info) \
|
||||
synchronize_user_stack()
|
||||
|
||||
#define current_pt_regs() \
|
||||
((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
|
||||
|
||||
struct global_reg_snapshot {
|
||||
unsigned long tstate;
|
||||
unsigned long tpc;
|
||||
@@ -55,9 +58,7 @@ union global_cpu_snapshot {
|
||||
|
||||
extern union global_cpu_snapshot global_cpu_snapshot[NR_CPUS];
|
||||
|
||||
#define force_successful_syscall_return() \
|
||||
do { current_thread_info()->syscall_noerror = 1; \
|
||||
} while (0)
|
||||
#define force_successful_syscall_return() set_thread_noerror(1)
|
||||
#define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
|
||||
#define instruction_pointer(regs) ((regs)->tpc)
|
||||
#define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
|
||||
@@ -100,6 +101,9 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
|
||||
#define arch_ptrace_stop(exit_code, info) \
|
||||
synchronize_user_stack()
|
||||
|
||||
#define current_pt_regs() \
|
||||
((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
|
||||
|
||||
#define user_mode(regs) (!((regs)->psr & PSR_PS))
|
||||
#define instruction_pointer(regs) ((regs)->pc)
|
||||
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
|
||||
|
@@ -26,7 +26,5 @@ struct k_sigaction {
|
||||
void __user *ka_restorer;
|
||||
};
|
||||
|
||||
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
||||
|
||||
#endif /* !(__ASSEMBLY__) */
|
||||
#endif /* !(__SPARC_SIGNAL_H) */
|
||||
|
@@ -23,7 +23,7 @@ do { flush_tlb_pending(); \
|
||||
/* If you are tempted to conditionalize the following */ \
|
||||
/* so that ASI is only written if it changes, think again. */ \
|
||||
__asm__ __volatile__("wr %%g0, %0, %%asi" \
|
||||
: : "r" (__thread_flag_byte_ptr(task_thread_info(next))[TI_FLAG_BYTE_CURRENT_DS]));\
|
||||
: : "r" (task_thread_info(next)->current_ds));\
|
||||
trap_block[current_thread_info()->cpu].thread = \
|
||||
task_thread_info(next); \
|
||||
__asm__ __volatile__( \
|
||||
|
@@ -8,6 +8,4 @@ extern asmlinkage long sparc_do_fork(unsigned long clone_flags,
|
||||
struct pt_regs *regs,
|
||||
unsigned long stack_size);
|
||||
|
||||
extern asmlinkage int sparc_execve(struct pt_regs *regs);
|
||||
|
||||
#endif /* _SPARC64_SYSCALLS_H */
|
||||
|
@@ -14,12 +14,12 @@
|
||||
#define TI_FLAG_FAULT_CODE_SHIFT 56
|
||||
#define TI_FLAG_BYTE_WSTATE 1
|
||||
#define TI_FLAG_WSTATE_SHIFT 48
|
||||
#define TI_FLAG_BYTE_CWP 2
|
||||
#define TI_FLAG_CWP_SHIFT 40
|
||||
#define TI_FLAG_BYTE_CURRENT_DS 3
|
||||
#define TI_FLAG_CURRENT_DS_SHIFT 32
|
||||
#define TI_FLAG_BYTE_FPDEPTH 4
|
||||
#define TI_FLAG_FPDEPTH_SHIFT 24
|
||||
#define TI_FLAG_BYTE_NOERROR 2
|
||||
#define TI_FLAG_BYTE_NOERROR_SHIFT 40
|
||||
#define TI_FLAG_BYTE_FPDEPTH 3
|
||||
#define TI_FLAG_FPDEPTH_SHIFT 32
|
||||
#define TI_FLAG_BYTE_CWP 4
|
||||
#define TI_FLAG_CWP_SHIFT 24
|
||||
#define TI_FLAG_BYTE_WSAVED 5
|
||||
#define TI_FLAG_WSAVED_SHIFT 16
|
||||
|
||||
@@ -47,7 +47,7 @@ struct thread_info {
|
||||
struct exec_domain *exec_domain;
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
__u8 new_child;
|
||||
__u8 syscall_noerror;
|
||||
__u8 current_ds;
|
||||
__u16 cpu;
|
||||
|
||||
unsigned long *utraps;
|
||||
@@ -74,9 +74,9 @@ struct thread_info {
|
||||
#define TI_FAULT_CODE (TI_FLAGS + TI_FLAG_BYTE_FAULT_CODE)
|
||||
#define TI_WSTATE (TI_FLAGS + TI_FLAG_BYTE_WSTATE)
|
||||
#define TI_CWP (TI_FLAGS + TI_FLAG_BYTE_CWP)
|
||||
#define TI_CURRENT_DS (TI_FLAGS + TI_FLAG_BYTE_CURRENT_DS)
|
||||
#define TI_FPDEPTH (TI_FLAGS + TI_FLAG_BYTE_FPDEPTH)
|
||||
#define TI_WSAVED (TI_FLAGS + TI_FLAG_BYTE_WSAVED)
|
||||
#define TI_SYS_NOERROR (TI_FLAGS + TI_FLAG_BYTE_NOERROR)
|
||||
#define TI_FPSAVED 0x00000010
|
||||
#define TI_KSP 0x00000018
|
||||
#define TI_FAULT_ADDR 0x00000020
|
||||
@@ -84,7 +84,7 @@ struct thread_info {
|
||||
#define TI_EXEC_DOMAIN 0x00000030
|
||||
#define TI_PRE_COUNT 0x00000038
|
||||
#define TI_NEW_CHILD 0x0000003c
|
||||
#define TI_SYS_NOERROR 0x0000003d
|
||||
#define TI_CURRENT_DS 0x0000003d
|
||||
#define TI_CPU 0x0000003e
|
||||
#define TI_UTRAPS 0x00000040
|
||||
#define TI_REG_WINDOW 0x00000048
|
||||
@@ -121,7 +121,7 @@ struct thread_info {
|
||||
#define INIT_THREAD_INFO(tsk) \
|
||||
{ \
|
||||
.task = &tsk, \
|
||||
.flags = ((unsigned long)ASI_P) << TI_FLAG_CURRENT_DS_SHIFT, \
|
||||
.current_ds = ASI_P, \
|
||||
.exec_domain = &default_exec_domain, \
|
||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||
.restart_block = { \
|
||||
@@ -153,13 +153,12 @@ register struct thread_info *current_thread_info_reg asm("g6");
|
||||
#define set_thread_wstate(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE] = (val))
|
||||
#define get_thread_cwp() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP])
|
||||
#define set_thread_cwp(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP] = (val))
|
||||
#define get_thread_current_ds() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS])
|
||||
#define set_thread_current_ds(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS] = (val))
|
||||
#define get_thread_noerror() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR])
|
||||
#define set_thread_noerror(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_NOERROR] = (val))
|
||||
#define get_thread_fpdepth() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH])
|
||||
#define set_thread_fpdepth(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH] = (val))
|
||||
#define get_thread_wsaved() (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED])
|
||||
#define set_thread_wsaved(val) (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED] = (val))
|
||||
|
||||
#endif /* !(__ASSEMBLY__) */
|
||||
|
||||
/*
|
||||
|
@@ -24,7 +24,7 @@ struct sparc64_tick_ops {
|
||||
extern struct sparc64_tick_ops *tick_ops;
|
||||
|
||||
extern unsigned long sparc64_get_clock_tick(unsigned int cpu);
|
||||
extern void __devinit setup_sparc64_timer(void);
|
||||
extern void setup_sparc64_timer(void);
|
||||
extern void __init time_init(void);
|
||||
|
||||
#endif /* _SPARC64_TIMER_H */
|
||||
|
@@ -38,14 +38,14 @@
|
||||
#define VERIFY_READ 0
|
||||
#define VERIFY_WRITE 1
|
||||
|
||||
#define get_fs() ((mm_segment_t) { get_thread_current_ds() })
|
||||
#define get_fs() ((mm_segment_t){(current_thread_info()->current_ds)})
|
||||
#define get_ds() (KERNEL_DS)
|
||||
|
||||
#define segment_eq(a,b) ((a).seg == (b).seg)
|
||||
|
||||
#define set_fs(val) \
|
||||
do { \
|
||||
set_thread_current_ds((val).seg); \
|
||||
current_thread_info()->current_ds =(val).seg; \
|
||||
__asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg)); \
|
||||
} while(0)
|
||||
|
||||
|
@@ -45,6 +45,7 @@
|
||||
#define __ARCH_WANT_COMPAT_SYS_TIME
|
||||
#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
|
||||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||
#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@@ -21,6 +21,9 @@
|
||||
#define TCSETSF2 _IOW('T', 15, struct termios2)
|
||||
#define TIOCGDEV _IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */
|
||||
#define TIOCVHANGUP _IO('T', 0x37)
|
||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||
|
||||
/* Note that all the ioctls that are not available in Linux have a
|
||||
* double underscore on the front to: a) avoid some programs to
|
||||
|
@@ -147,12 +147,6 @@ struct sigstack {
|
||||
#define SIG_UNBLOCK 0x02 /* for unblocking signals */
|
||||
#define SIG_SETMASK 0x04 /* for setting the signal mask */
|
||||
|
||||
/*
|
||||
* sigaltstack controls
|
||||
*/
|
||||
#define SS_ONSTACK 1
|
||||
#define SS_DISABLE 2
|
||||
|
||||
#define MINSIGSTKSZ 4096
|
||||
#define SIGSTKSZ 16384
|
||||
|
||||
|
@@ -41,6 +41,7 @@
|
||||
|
||||
#define SO_ATTACH_FILTER 0x001a
|
||||
#define SO_DETACH_FILTER 0x001b
|
||||
#define SO_GET_FILTER SO_ATTACH_FILTER
|
||||
|
||||
#define SO_PEERNAME 0x001c
|
||||
#define SO_TIMESTAMP 0x001d
|
||||
|
@@ -407,8 +407,9 @@
|
||||
#define __NR_process_vm_writev 339
|
||||
#define __NR_kern_features 340
|
||||
#define __NR_kcmp 341
|
||||
#define __NR_finit_module 342
|
||||
|
||||
#define NR_syscalls 342
|
||||
#define NR_syscalls 343
|
||||
|
||||
/* Bitmask values returned from kern_features system call. */
|
||||
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#define APC_DEVNAME "apc"
|
||||
|
||||
static u8 __iomem *regs;
|
||||
static int apc_no_idle __devinitdata = 0;
|
||||
static int apc_no_idle = 0;
|
||||
|
||||
#define apc_readb(offs) (sbus_readb(regs+offs))
|
||||
#define apc_writeb(val, offs) (sbus_writeb(val, regs+offs))
|
||||
@@ -138,7 +138,7 @@ static const struct file_operations apc_fops = {
|
||||
|
||||
static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops };
|
||||
|
||||
static int __devinit apc_probe(struct platform_device *op)
|
||||
static int apc_probe(struct platform_device *op)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
@@ -102,7 +102,7 @@ static const struct of_device_id auxio_match[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(of, auxio_match);
|
||||
|
||||
static int __devinit auxio_probe(struct platform_device *dev)
|
||||
static int auxio_probe(struct platform_device *dev)
|
||||
{
|
||||
struct device_node *dp = dev->dev.of_node;
|
||||
unsigned long size;
|
||||
|
@@ -33,7 +33,7 @@ struct fhc {
|
||||
struct platform_device leds_pdev;
|
||||
};
|
||||
|
||||
static int __devinit clock_board_calc_nslots(struct clock_board *p)
|
||||
static int clock_board_calc_nslots(struct clock_board *p)
|
||||
{
|
||||
u8 reg = upa_readb(p->clock_regs + CLOCK_STAT1) & 0xc0;
|
||||
|
||||
@@ -60,7 +60,7 @@ static int __devinit clock_board_calc_nslots(struct clock_board *p)
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit clock_board_probe(struct platform_device *op)
|
||||
static int clock_board_probe(struct platform_device *op)
|
||||
{
|
||||
struct clock_board *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
int err = -ENOMEM;
|
||||
@@ -157,7 +157,7 @@ static struct platform_driver clock_board_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __devinit fhc_probe(struct platform_device *op)
|
||||
static int fhc_probe(struct platform_device *op)
|
||||
{
|
||||
struct fhc *p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
int err = -ENOMEM;
|
||||
|
@@ -336,9 +336,9 @@ static int jbusmc_print_dimm(int syndrome_code,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64 __devinit jbusmc_dimm_group_size(u64 base,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
static u64 jbusmc_dimm_group_size(u64 base,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
{
|
||||
u64 max = base + (8UL * 1024 * 1024 * 1024);
|
||||
u64 max_seen = base;
|
||||
@@ -363,10 +363,10 @@ static u64 __devinit jbusmc_dimm_group_size(u64 base,
|
||||
return max_seen - base;
|
||||
}
|
||||
|
||||
static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,
|
||||
unsigned long index,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
static void jbusmc_construct_one_dimm_group(struct jbusmc *p,
|
||||
unsigned long index,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
{
|
||||
struct jbusmc_dimm_group *dp = &p->dimm_groups[index];
|
||||
|
||||
@@ -378,9 +378,9 @@ static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,
|
||||
dp->size = jbusmc_dimm_group_size(dp->base_addr, mem_regs, num_mem_regs);
|
||||
}
|
||||
|
||||
static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
static void jbusmc_construct_dimm_groups(struct jbusmc *p,
|
||||
const struct linux_prom64_registers *mem_regs,
|
||||
int num_mem_regs)
|
||||
{
|
||||
if (p->mc_reg_1 & JB_MC_REG1_DIMM1_BANK0) {
|
||||
jbusmc_construct_one_dimm_group(p, 0, mem_regs, num_mem_regs);
|
||||
@@ -392,7 +392,7 @@ static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit jbusmc_probe(struct platform_device *op)
|
||||
static int jbusmc_probe(struct platform_device *op)
|
||||
{
|
||||
const struct linux_prom64_registers *mem_regs;
|
||||
struct device_node *mem_node;
|
||||
@@ -689,7 +689,7 @@ static void chmc_fetch_decode_regs(struct chmc *p)
|
||||
chmc_read_mcreg(p, CHMCTRL_DECODE4));
|
||||
}
|
||||
|
||||
static int __devinit chmc_probe(struct platform_device *op)
|
||||
static int chmc_probe(struct platform_device *op)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
unsigned long ver;
|
||||
@@ -763,7 +763,7 @@ out_free:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static int __devinit us3mc_probe(struct platform_device *op)
|
||||
static int us3mc_probe(struct platform_device *op)
|
||||
{
|
||||
if (mc_type == MC_TYPE_SAFARI)
|
||||
return chmc_probe(op);
|
||||
@@ -772,21 +772,21 @@ static int __devinit us3mc_probe(struct platform_device *op)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void __devexit chmc_destroy(struct platform_device *op, struct chmc *p)
|
||||
static void chmc_destroy(struct platform_device *op, struct chmc *p)
|
||||
{
|
||||
list_del(&p->list);
|
||||
of_iounmap(&op->resource[0], p->regs, 0x48);
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
static void __devexit jbusmc_destroy(struct platform_device *op, struct jbusmc *p)
|
||||
static void jbusmc_destroy(struct platform_device *op, struct jbusmc *p)
|
||||
{
|
||||
mc_list_del(&p->list);
|
||||
of_iounmap(&op->resource[0], p->regs, JBUSMC_REGS_SIZE);
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
static int __devexit us3mc_remove(struct platform_device *op)
|
||||
static int us3mc_remove(struct platform_device *op)
|
||||
{
|
||||
void *p = dev_get_drvdata(&op->dev);
|
||||
|
||||
@@ -814,7 +814,7 @@ static struct platform_driver us3mc_driver = {
|
||||
.of_match_table = us3mc_match,
|
||||
},
|
||||
.probe = us3mc_probe,
|
||||
.remove = __devexit_p(us3mc_remove),
|
||||
.remove = us3mc_remove,
|
||||
};
|
||||
|
||||
static inline bool us3mc_platform(void)
|
||||
|
@@ -29,7 +29,7 @@
|
||||
#define DRV_MODULE_VERSION "1.0"
|
||||
#define DRV_MODULE_RELDATE "Jul 11, 2007"
|
||||
|
||||
static char version[] __devinitdata =
|
||||
static char version[] =
|
||||
DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
|
||||
MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
|
||||
MODULE_DESCRIPTION("Sun LDOM domain services driver");
|
||||
@@ -1146,8 +1146,7 @@ static void ds_event(void *arg, int event)
|
||||
spin_unlock_irqrestore(&ds_lock, flags);
|
||||
}
|
||||
|
||||
static int __devinit ds_probe(struct vio_dev *vdev,
|
||||
const struct vio_device_id *id)
|
||||
static int ds_probe(struct vio_dev *vdev, const struct vio_device_id *id)
|
||||
{
|
||||
static int ds_version_printed;
|
||||
struct ldc_channel_config ds_cfg = {
|
||||
|
@@ -806,23 +806,10 @@ sys_nis_syscall:
|
||||
call c_sys_nis_syscall
|
||||
mov %l5, %o7
|
||||
|
||||
.align 4
|
||||
.globl sys_execve
|
||||
sys_execve:
|
||||
mov %o7, %l5
|
||||
add %sp, STACKFRAME_SZ, %o0 ! pt_regs *regs arg
|
||||
call sparc_execve
|
||||
mov %l5, %o7
|
||||
|
||||
.globl sunos_execv
|
||||
sunos_execv:
|
||||
st %g0, [%sp + STACKFRAME_SZ + PT_I2]
|
||||
|
||||
call sparc_execve
|
||||
add %sp, STACKFRAME_SZ, %o0
|
||||
|
||||
b ret_sys_call
|
||||
ld [%sp + STACKFRAME_SZ + PT_I0], %o0
|
||||
.globl sunos_execv
|
||||
b sys_execve
|
||||
clr %i2
|
||||
|
||||
.align 4
|
||||
.globl sys_sparc_pipe
|
||||
@@ -959,17 +946,9 @@ flush_patch_four:
|
||||
.align 4
|
||||
linux_sparc_ni_syscall:
|
||||
sethi %hi(sys_ni_syscall), %l7
|
||||
b syscall_is_too_hard
|
||||
b do_syscall
|
||||
or %l7, %lo(sys_ni_syscall), %l7
|
||||
|
||||
linux_fast_syscall:
|
||||
andn %l7, 3, %l7
|
||||
mov %i0, %o0
|
||||
mov %i1, %o1
|
||||
mov %i2, %o2
|
||||
jmpl %l7 + %g0, %g0
|
||||
mov %i3, %o3
|
||||
|
||||
linux_syscall_trace:
|
||||
add %sp, STACKFRAME_SZ, %o0
|
||||
call syscall_trace
|
||||
@@ -991,6 +970,23 @@ ret_from_fork:
|
||||
b ret_sys_call
|
||||
ld [%sp + STACKFRAME_SZ + PT_I0], %o0
|
||||
|
||||
.globl ret_from_kernel_thread
|
||||
ret_from_kernel_thread:
|
||||
call schedule_tail
|
||||
ld [%g3 + TI_TASK], %o0
|
||||
ld [%sp + STACKFRAME_SZ + PT_G1], %l0
|
||||
call %l0
|
||||
ld [%sp + STACKFRAME_SZ + PT_G2], %o0
|
||||
rd %psr, %l1
|
||||
ld [%sp + STACKFRAME_SZ + PT_PSR], %l0
|
||||
andn %l0, PSR_CWP, %l0
|
||||
nop
|
||||
and %l1, PSR_CWP, %l1
|
||||
or %l0, %l1, %l0
|
||||
st %l0, [%sp + STACKFRAME_SZ + PT_PSR]
|
||||
b ret_sys_call
|
||||
mov 0, %o0
|
||||
|
||||
/* Linux native system calls enter here... */
|
||||
.align 4
|
||||
.globl linux_sparc_syscall
|
||||
@@ -1002,11 +998,8 @@ linux_sparc_syscall:
|
||||
bgeu linux_sparc_ni_syscall
|
||||
sll %g1, 2, %l4
|
||||
ld [%l7 + %l4], %l7
|
||||
andcc %l7, 1, %g0
|
||||
bne linux_fast_syscall
|
||||
/* Just do first insn from SAVE_ALL in the delay slot */
|
||||
|
||||
syscall_is_too_hard:
|
||||
do_syscall:
|
||||
SAVE_ALL_HEAD
|
||||
rd %wim, %l3
|
||||
|
||||
|
@@ -92,8 +92,10 @@ etrap_save: save %g2, -STACK_BIAS, %sp
|
||||
rdpr %wstate, %g2
|
||||
wrpr %g0, 0, %canrestore
|
||||
sll %g2, 3, %g2
|
||||
|
||||
/* Set TI_SYS_FPDEPTH to 1 and clear TI_SYS_NOERROR. */
|
||||
mov 1, %l5
|
||||
stb %l5, [%l6 + TI_FPDEPTH]
|
||||
sth %l5, [%l6 + TI_SYS_NOERROR]
|
||||
|
||||
wrpr %g3, 0, %otherwin
|
||||
wrpr %g2, 0, %wstate
|
||||
@@ -152,7 +154,9 @@ etrap_save: save %g2, -STACK_BIAS, %sp
|
||||
add %l6, TI_FPSAVED + 1, %l4
|
||||
srl %l5, 1, %l3
|
||||
add %l5, 2, %l5
|
||||
stb %l5, [%l6 + TI_FPDEPTH]
|
||||
|
||||
/* Set TI_SYS_FPDEPTH to %l5 and clear TI_SYS_NOERROR. */
|
||||
sth %l5, [%l6 + TI_SYS_NOERROR]
|
||||
ba,pt %xcc, 2b
|
||||
stb %g0, [%l4 + %l3]
|
||||
nop
|
||||
|
@@ -27,7 +27,7 @@
|
||||
#define DRV_MODULE_VERSION "1.1"
|
||||
#define DRV_MODULE_RELDATE "July 22, 2008"
|
||||
|
||||
static char version[] __devinitdata =
|
||||
static char version[] =
|
||||
DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
|
||||
#define LDC_PACKET_SIZE 64
|
||||
|
||||
|
@@ -43,7 +43,7 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
|
||||
void pcibios_fixup_bus(struct pci_bus *pbus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
int i, has_io, has_mem;
|
||||
|
@@ -668,7 +668,7 @@ static irqreturn_t grpci2_err_interrupt(int irq, void *arg)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit grpci2_of_probe(struct platform_device *ofdev)
|
||||
static int grpci2_of_probe(struct platform_device *ofdev)
|
||||
{
|
||||
struct grpci2_regs *regs;
|
||||
struct grpci2_priv *priv;
|
||||
|
@@ -43,10 +43,6 @@ void *module_alloc(unsigned long size)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
/* We handle the zero case fine, unlike vmalloc */
|
||||
if (size == 0)
|
||||
return NULL;
|
||||
|
||||
ret = module_map(size);
|
||||
if (ret)
|
||||
memset(ret, 0, size);
|
||||
|
@@ -356,7 +356,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
|
||||
return dev;
|
||||
}
|
||||
|
||||
static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
|
||||
static void apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
|
||||
{
|
||||
u32 idx, first, last;
|
||||
|
||||
@@ -378,9 +378,9 @@ static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)
|
||||
/* Cook up fake bus resources for SUNW,simba PCI bridges which lack
|
||||
* a proper 'ranges' property.
|
||||
*/
|
||||
static void __devinit apb_fake_ranges(struct pci_dev *dev,
|
||||
struct pci_bus *bus,
|
||||
struct pci_pbm_info *pbm)
|
||||
static void apb_fake_ranges(struct pci_dev *dev,
|
||||
struct pci_bus *bus,
|
||||
struct pci_pbm_info *pbm)
|
||||
{
|
||||
struct pci_bus_region region;
|
||||
struct resource *res;
|
||||
@@ -404,15 +404,15 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev,
|
||||
pcibios_bus_to_resource(dev, res, ®ion);
|
||||
}
|
||||
|
||||
static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_bus *bus);
|
||||
static void pci_of_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_bus *bus);
|
||||
|
||||
#define GET_64BIT(prop, i) ((((u64) (prop)[(i)]) << 32) | (prop)[(i)+1])
|
||||
|
||||
static void __devinit of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_dev *dev)
|
||||
static void of_scan_pci_bridge(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_dev *dev)
|
||||
{
|
||||
struct pci_bus *bus;
|
||||
const u32 *busrange, *ranges;
|
||||
@@ -503,9 +503,9 @@ after_ranges:
|
||||
pci_of_scan_bus(pbm, node, bus);
|
||||
}
|
||||
|
||||
static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_bus *bus)
|
||||
static void pci_of_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device_node *node,
|
||||
struct pci_bus *bus)
|
||||
{
|
||||
struct device_node *child;
|
||||
const u32 *reg;
|
||||
@@ -564,7 +564,7 @@ show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char *
|
||||
|
||||
static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL);
|
||||
|
||||
static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)
|
||||
static void pci_bus_register_of_sysfs(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
struct pci_bus *child_bus;
|
||||
@@ -585,8 +585,8 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)
|
||||
pci_bus_register_of_sysfs(child_bus);
|
||||
}
|
||||
|
||||
struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
{
|
||||
LIST_HEAD(resources);
|
||||
struct device_node *node = pbm->op->dev.of_node;
|
||||
@@ -618,7 +618,7 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,
|
||||
return bus;
|
||||
}
|
||||
|
||||
void __devinit pcibios_fixup_bus(struct pci_bus *pbus)
|
||||
void pcibios_fixup_bus(struct pci_bus *pbus)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -949,8 +949,7 @@ static int __init pcibios_init(void)
|
||||
subsys_initcall(pcibios_init);
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
static void __devinit pci_bus_slot_names(struct device_node *node,
|
||||
struct pci_bus *bus)
|
||||
static void pci_bus_slot_names(struct device_node *node, struct pci_bus *bus)
|
||||
{
|
||||
const struct pci_slot_names {
|
||||
u32 slot_mask;
|
||||
|
@@ -408,8 +408,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)
|
||||
upa_writeq(~(u64)0, pbm->pbm_regs + FIRE_PEC_IENAB);
|
||||
}
|
||||
|
||||
static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 portid)
|
||||
static int pci_fire_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 portid)
|
||||
{
|
||||
const struct linux_prom64_registers *regs;
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
@@ -454,7 +454,7 @@ static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit fire_probe(struct platform_device *op)
|
||||
static int fire_probe(struct platform_device *op)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
struct pci_pbm_info *pbm;
|
||||
|
@@ -88,7 +88,7 @@ struct pci_pbm_info {
|
||||
int chip_revision;
|
||||
|
||||
/* Name used for top-level resources. */
|
||||
char *name;
|
||||
const char *name;
|
||||
|
||||
/* OBP specific information. */
|
||||
struct platform_device *op;
|
||||
|
@@ -366,8 +366,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
pci_config_write8(addr, 64);
|
||||
}
|
||||
|
||||
static void __devinit psycho_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
static void psycho_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
{
|
||||
pbm_config_busmastering(pbm);
|
||||
pbm->is_66mhz_capable = 0;
|
||||
@@ -483,15 +483,15 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm,
|
||||
#define PSYCHO_MEMSPACE_B 0x180000000UL
|
||||
#define PSYCHO_MEMSPACE_SIZE 0x07fffffffUL
|
||||
|
||||
static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, int is_pbm_a)
|
||||
static void psycho_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, int is_pbm_a)
|
||||
{
|
||||
psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO);
|
||||
psycho_pbm_strbuf_init(pbm, is_pbm_a);
|
||||
psycho_scan_bus(pbm, &op->dev);
|
||||
}
|
||||
|
||||
static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
|
||||
static struct pci_pbm_info *psycho_find_sibling(u32 upa_portid)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
|
||||
@@ -504,7 +504,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
|
||||
|
||||
#define PSYCHO_CONFIGSPACE 0x001000000UL
|
||||
|
||||
static int __devinit psycho_probe(struct platform_device *op)
|
||||
static int psycho_probe(struct platform_device *op)
|
||||
{
|
||||
const struct linux_prom64_registers *pr_regs;
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
|
@@ -403,8 +403,7 @@ static void apb_init(struct pci_bus *sabre_bus)
|
||||
}
|
||||
}
|
||||
|
||||
static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
static void sabre_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
|
||||
{
|
||||
static int once;
|
||||
|
||||
@@ -443,8 +442,8 @@ static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,
|
||||
sabre_register_error_handlers(pbm);
|
||||
}
|
||||
|
||||
static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op)
|
||||
static void sabre_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op)
|
||||
{
|
||||
psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);
|
||||
pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR;
|
||||
@@ -454,7 +453,7 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
|
||||
}
|
||||
|
||||
static const struct of_device_id sabre_match[];
|
||||
static int __devinit sabre_probe(struct platform_device *op)
|
||||
static int sabre_probe(struct platform_device *op)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
const struct linux_prom64_registers *pr_regs;
|
||||
|
@@ -1064,8 +1064,7 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)
|
||||
pci_config_write8(addr, 64);
|
||||
}
|
||||
|
||||
static void __devinit schizo_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
static void schizo_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
|
||||
{
|
||||
pbm_config_busmastering(pbm);
|
||||
pbm->is_66mhz_capable =
|
||||
@@ -1307,9 +1306,9 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 portid,
|
||||
int chip_type)
|
||||
static int schizo_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 portid,
|
||||
int chip_type)
|
||||
{
|
||||
const struct linux_prom64_registers *regs;
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
@@ -1400,8 +1399,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)
|
||||
return (x == y);
|
||||
}
|
||||
|
||||
static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,
|
||||
int chip_type)
|
||||
static struct pci_pbm_info *schizo_find_sibling(u32 portid, int chip_type)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
|
||||
@@ -1412,7 +1410,7 @@ static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int __devinit __schizo_init(struct platform_device *op, unsigned long chip_type)
|
||||
static int __schizo_init(struct platform_device *op, unsigned long chip_type)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
struct pci_pbm_info *pbm;
|
||||
@@ -1460,7 +1458,7 @@ out_err:
|
||||
}
|
||||
|
||||
static const struct of_device_id schizo_match[];
|
||||
static int __devinit schizo_probe(struct platform_device *op)
|
||||
static int schizo_probe(struct platform_device *op)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
|
||||
|
@@ -536,8 +536,7 @@ static struct dma_map_ops sun4v_dma_ops = {
|
||||
.unmap_sg = dma_4v_unmap_sg,
|
||||
};
|
||||
|
||||
static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,
|
||||
struct device *parent)
|
||||
static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent)
|
||||
{
|
||||
struct property *prop;
|
||||
struct device_node *dp;
|
||||
@@ -550,8 +549,8 @@ static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,
|
||||
/* XXX register error interrupt handlers XXX */
|
||||
}
|
||||
|
||||
static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,
|
||||
struct iommu *iommu)
|
||||
static unsigned long probe_existing_entries(struct pci_pbm_info *pbm,
|
||||
struct iommu *iommu)
|
||||
{
|
||||
struct iommu_arena *arena = &iommu->arena;
|
||||
unsigned long i, cnt = 0;
|
||||
@@ -578,7 +577,7 @@ static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,
|
||||
return cnt;
|
||||
}
|
||||
|
||||
static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
|
||||
static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
|
||||
{
|
||||
static const u32 vdma_default[] = { 0x80000000, 0x80000000 };
|
||||
struct iommu *iommu = pbm->iommu;
|
||||
@@ -879,8 +878,8 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
|
||||
}
|
||||
#endif /* !(CONFIG_PCI_MSI) */
|
||||
|
||||
static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 devhandle)
|
||||
static int pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
|
||||
struct platform_device *op, u32 devhandle)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
int err;
|
||||
@@ -919,7 +918,7 @@ static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit pci_sun4v_probe(struct platform_device *op)
|
||||
static int pci_sun4v_probe(struct platform_device *op)
|
||||
{
|
||||
const struct linux_prom64_registers *regs;
|
||||
static int hvapi_negotiated = 0;
|
||||
|
@@ -439,8 +439,7 @@ int pcic_present(void)
|
||||
return pcic0_up;
|
||||
}
|
||||
|
||||
static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm,
|
||||
struct pci_dev *pdev)
|
||||
static int pdev_to_pnode(struct linux_pbm_info *pbm, struct pci_dev *pdev)
|
||||
{
|
||||
struct linux_prom_pci_registers regs[PROMREG_MAX];
|
||||
int err;
|
||||
@@ -595,7 +594,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)
|
||||
/*
|
||||
* Normally called from {do_}pci_scan_bus...
|
||||
*/
|
||||
void __devinit pcibios_fixup_bus(struct pci_bus *bus)
|
||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
int i, has_io, has_mem;
|
||||
|
@@ -52,7 +52,7 @@ static void pmc_swift_idle(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __devinit pmc_probe(struct platform_device *op)
|
||||
static int pmc_probe(struct platform_device *op)
|
||||
{
|
||||
regs = of_ioremap(&op->resource[0], 0,
|
||||
resource_size(&op->resource[0]), PMC_OBPNAME);
|
||||
|
@@ -23,7 +23,7 @@ static irqreturn_t power_handler(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __devinit has_button_interrupt(unsigned int irq, struct device_node *dp)
|
||||
static int has_button_interrupt(unsigned int irq, struct device_node *dp)
|
||||
{
|
||||
if (irq == 0xffffffff)
|
||||
return 0;
|
||||
@@ -33,7 +33,7 @@ static int __devinit has_button_interrupt(unsigned int irq, struct device_node *
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __devinit power_probe(struct platform_device *op)
|
||||
static int power_probe(struct platform_device *op)
|
||||
{
|
||||
struct resource *res = &op->resource[0];
|
||||
unsigned int irq = op->archdata.irqs[0];
|
||||
|
@@ -286,8 +286,7 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
|
||||
parent_tid_ptr = regs->u_regs[UREG_I2];
|
||||
child_tid_ptr = regs->u_regs[UREG_I4];
|
||||
|
||||
ret = do_fork(clone_flags, stack_start,
|
||||
regs, stack_size,
|
||||
ret = do_fork(clone_flags, stack_start, stack_size,
|
||||
(int __user *) parent_tid_ptr,
|
||||
(int __user *) child_tid_ptr);
|
||||
|
||||
@@ -316,13 +315,13 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
|
||||
* XXX See comment above sys_vfork in sparc64. todo.
|
||||
*/
|
||||
extern void ret_from_fork(void);
|
||||
extern void ret_from_kernel_thread(void);
|
||||
|
||||
int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
unsigned long unused,
|
||||
struct task_struct *p, struct pt_regs *regs)
|
||||
unsigned long arg, struct task_struct *p)
|
||||
{
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
struct pt_regs *childregs;
|
||||
struct pt_regs *childregs, *regs = current_pt_regs();
|
||||
char *new_stack;
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
@@ -336,16 +335,13 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
}
|
||||
|
||||
/*
|
||||
* p->thread_info new_stack childregs
|
||||
* ! ! ! {if(PSR_PS) }
|
||||
* V V (stk.fr.) V (pt_regs) { (stk.fr.) }
|
||||
* +----- - - - - - ------+===========+============={+==========}+
|
||||
* p->thread_info new_stack childregs stack bottom
|
||||
* ! ! ! !
|
||||
* V V (stk.fr.) V (pt_regs) V
|
||||
* +----- - - - - - ------+===========+=============+
|
||||
*/
|
||||
new_stack = task_stack_page(p) + THREAD_SIZE;
|
||||
if (regs->psr & PSR_PS)
|
||||
new_stack -= STACKFRAME_SZ;
|
||||
new_stack -= STACKFRAME_SZ + TRACEREG_SZ;
|
||||
memcpy(new_stack, (char *)regs - STACKFRAME_SZ, STACKFRAME_SZ + TRACEREG_SZ);
|
||||
childregs = (struct pt_regs *) (new_stack + STACKFRAME_SZ);
|
||||
|
||||
/*
|
||||
@@ -356,55 +352,58 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
* Thus, kpsr|=PSR_PIL.
|
||||
*/
|
||||
ti->ksp = (unsigned long) new_stack;
|
||||
p->thread.kregs = childregs;
|
||||
|
||||
if (unlikely(p->flags & PF_KTHREAD)) {
|
||||
extern int nwindows;
|
||||
unsigned long psr;
|
||||
memset(new_stack, 0, STACKFRAME_SZ + TRACEREG_SZ);
|
||||
p->thread.flags |= SPARC_FLAG_KTHREAD;
|
||||
p->thread.current_ds = KERNEL_DS;
|
||||
ti->kpc = (((unsigned long) ret_from_kernel_thread) - 0x8);
|
||||
childregs->u_regs[UREG_G1] = sp; /* function */
|
||||
childregs->u_regs[UREG_G2] = arg;
|
||||
psr = childregs->psr = get_psr();
|
||||
ti->kpsr = psr | PSR_PIL;
|
||||
ti->kwim = 1 << (((psr & PSR_CWP) + 1) % nwindows);
|
||||
return 0;
|
||||
}
|
||||
memcpy(new_stack, (char *)regs - STACKFRAME_SZ, STACKFRAME_SZ + TRACEREG_SZ);
|
||||
childregs->u_regs[UREG_FP] = sp;
|
||||
p->thread.flags &= ~SPARC_FLAG_KTHREAD;
|
||||
p->thread.current_ds = USER_DS;
|
||||
ti->kpc = (((unsigned long) ret_from_fork) - 0x8);
|
||||
ti->kpsr = current->thread.fork_kpsr | PSR_PIL;
|
||||
ti->kwim = current->thread.fork_kwim;
|
||||
|
||||
if(regs->psr & PSR_PS) {
|
||||
extern struct pt_regs fake_swapper_regs;
|
||||
if (sp != regs->u_regs[UREG_FP]) {
|
||||
struct sparc_stackf __user *childstack;
|
||||
struct sparc_stackf __user *parentstack;
|
||||
|
||||
p->thread.kregs = &fake_swapper_regs;
|
||||
new_stack += STACKFRAME_SZ + TRACEREG_SZ;
|
||||
childregs->u_regs[UREG_FP] = (unsigned long) new_stack;
|
||||
p->thread.flags |= SPARC_FLAG_KTHREAD;
|
||||
p->thread.current_ds = KERNEL_DS;
|
||||
memcpy(new_stack, (void *)regs->u_regs[UREG_FP], STACKFRAME_SZ);
|
||||
childregs->u_regs[UREG_G6] = (unsigned long) ti;
|
||||
} else {
|
||||
p->thread.kregs = childregs;
|
||||
childregs->u_regs[UREG_FP] = sp;
|
||||
p->thread.flags &= ~SPARC_FLAG_KTHREAD;
|
||||
p->thread.current_ds = USER_DS;
|
||||
|
||||
if (sp != regs->u_regs[UREG_FP]) {
|
||||
struct sparc_stackf __user *childstack;
|
||||
struct sparc_stackf __user *parentstack;
|
||||
|
||||
/*
|
||||
* This is a clone() call with supplied user stack.
|
||||
* Set some valid stack frames to give to the child.
|
||||
*/
|
||||
childstack = (struct sparc_stackf __user *)
|
||||
(sp & ~0xfUL);
|
||||
parentstack = (struct sparc_stackf __user *)
|
||||
regs->u_regs[UREG_FP];
|
||||
/*
|
||||
* This is a clone() call with supplied user stack.
|
||||
* Set some valid stack frames to give to the child.
|
||||
*/
|
||||
childstack = (struct sparc_stackf __user *)
|
||||
(sp & ~0xfUL);
|
||||
parentstack = (struct sparc_stackf __user *)
|
||||
regs->u_regs[UREG_FP];
|
||||
|
||||
#if 0
|
||||
printk("clone: parent stack:\n");
|
||||
show_stackframe(parentstack);
|
||||
printk("clone: parent stack:\n");
|
||||
show_stackframe(parentstack);
|
||||
#endif
|
||||
|
||||
childstack = clone_stackframe(childstack, parentstack);
|
||||
if (!childstack)
|
||||
return -EFAULT;
|
||||
childstack = clone_stackframe(childstack, parentstack);
|
||||
if (!childstack)
|
||||
return -EFAULT;
|
||||
|
||||
#if 0
|
||||
printk("clone: child stack:\n");
|
||||
show_stackframe(childstack);
|
||||
printk("clone: child stack:\n");
|
||||
show_stackframe(childstack);
|
||||
#endif
|
||||
|
||||
childregs->u_regs[UREG_FP] = (unsigned long)childstack;
|
||||
}
|
||||
childregs->u_regs[UREG_FP] = (unsigned long)childstack;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -475,69 +474,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* sparc_execve() executes a new program after the asm stub has set
|
||||
* things up for us. This should basically do what I want it to.
|
||||
*/
|
||||
asmlinkage int sparc_execve(struct pt_regs *regs)
|
||||
{
|
||||
int error, base = 0;
|
||||
struct filename *filename;
|
||||
|
||||
/* Check for indirect call. */
|
||||
if(regs->u_regs[UREG_G1] == 0)
|
||||
base = 1;
|
||||
|
||||
filename = getname((char __user *)regs->u_regs[base + UREG_I0]);
|
||||
error = PTR_ERR(filename);
|
||||
if(IS_ERR(filename))
|
||||
goto out;
|
||||
error = do_execve(filename->name,
|
||||
(const char __user *const __user *)
|
||||
regs->u_regs[base + UREG_I1],
|
||||
(const char __user *const __user *)
|
||||
regs->u_regs[base + UREG_I2],
|
||||
regs);
|
||||
putname(filename);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the mechanism for creating a new kernel thread.
|
||||
*
|
||||
* NOTE! Only a kernel-only process(ie the swapper or direct descendants
|
||||
* who haven't done an "execve()") should use this: it will work within
|
||||
* a system call from a "real" process, but the process memory space will
|
||||
* not be freed until both the parent and the child have exited.
|
||||
*/
|
||||
pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
||||
{
|
||||
long retval;
|
||||
|
||||
__asm__ __volatile__("mov %4, %%g2\n\t" /* Set aside fn ptr... */
|
||||
"mov %5, %%g3\n\t" /* and arg. */
|
||||
"mov %1, %%g1\n\t"
|
||||
"mov %2, %%o0\n\t" /* Clone flags. */
|
||||
"mov 0, %%o1\n\t" /* usp arg == 0 */
|
||||
"t 0x10\n\t" /* Linux/Sparc clone(). */
|
||||
"cmp %%o1, 0\n\t"
|
||||
"be 1f\n\t" /* The parent, just return. */
|
||||
" nop\n\t" /* Delay slot. */
|
||||
"jmpl %%g2, %%o7\n\t" /* Call the function. */
|
||||
" mov %%g3, %%o0\n\t" /* Get back the arg in delay. */
|
||||
"mov %3, %%g1\n\t"
|
||||
"t 0x10\n\t" /* Linux/Sparc exit(). */
|
||||
/* Notreached by child. */
|
||||
"1: mov %%o0, %0\n\t" :
|
||||
"=r" (retval) :
|
||||
"i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED),
|
||||
"i" (__NR_exit), "r" (fn), "r" (arg) :
|
||||
"g1", "g2", "g3", "o0", "o1", "memory", "cc");
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *task)
|
||||
{
|
||||
unsigned long pc, fp, bias = 0;
|
||||
|
@@ -601,8 +601,7 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,
|
||||
child_tid_ptr = (int __user *) regs->u_regs[UREG_I4];
|
||||
}
|
||||
|
||||
ret = do_fork(clone_flags, stack_start,
|
||||
regs, stack_size,
|
||||
ret = do_fork(clone_flags, stack_start, stack_size,
|
||||
parent_tid_ptr, child_tid_ptr);
|
||||
|
||||
/* If we get an error and potentially restart the system
|
||||
@@ -622,65 +621,56 @@ asmlinkage long sparc_do_fork(unsigned long clone_flags,
|
||||
* Child --> %o0 == parents pid, %o1 == 1
|
||||
*/
|
||||
int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
unsigned long unused,
|
||||
struct task_struct *p, struct pt_regs *regs)
|
||||
unsigned long arg, struct task_struct *p)
|
||||
{
|
||||
struct thread_info *t = task_thread_info(p);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
struct sparc_stackf *parent_sf;
|
||||
unsigned long child_stack_sz;
|
||||
char *child_trap_frame;
|
||||
int kernel_thread;
|
||||
|
||||
kernel_thread = (regs->tstate & TSTATE_PRIV) ? 1 : 0;
|
||||
parent_sf = ((struct sparc_stackf *) regs) - 1;
|
||||
|
||||
/* Calculate offset to stack_frame & pt_regs */
|
||||
child_stack_sz = ((STACKFRAME_SZ + TRACEREG_SZ) +
|
||||
(kernel_thread ? STACKFRAME_SZ : 0));
|
||||
child_stack_sz = (STACKFRAME_SZ + TRACEREG_SZ);
|
||||
child_trap_frame = (task_stack_page(p) +
|
||||
(THREAD_SIZE - child_stack_sz));
|
||||
memcpy(child_trap_frame, parent_sf, child_stack_sz);
|
||||
|
||||
t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) |
|
||||
(0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) |
|
||||
(((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT);
|
||||
t->new_child = 1;
|
||||
t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS;
|
||||
t->kregs = (struct pt_regs *) (child_trap_frame +
|
||||
sizeof(struct sparc_stackf));
|
||||
t->fpsaved[0] = 0;
|
||||
|
||||
if (kernel_thread) {
|
||||
struct sparc_stackf *child_sf = (struct sparc_stackf *)
|
||||
(child_trap_frame + (STACKFRAME_SZ + TRACEREG_SZ));
|
||||
|
||||
/* Zero terminate the stack backtrace. */
|
||||
child_sf->fp = NULL;
|
||||
t->kregs->u_regs[UREG_FP] =
|
||||
((unsigned long) child_sf) - STACK_BIAS;
|
||||
|
||||
t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT);
|
||||
t->kregs->u_regs[UREG_G6] = (unsigned long) t;
|
||||
t->kregs->u_regs[UREG_G4] = (unsigned long) t->task;
|
||||
} else {
|
||||
if (t->flags & _TIF_32BIT) {
|
||||
sp &= 0x00000000ffffffffUL;
|
||||
regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
|
||||
}
|
||||
t->kregs->u_regs[UREG_FP] = sp;
|
||||
t->flags |= ((long)ASI_AIUS << TI_FLAG_CURRENT_DS_SHIFT);
|
||||
if (sp != regs->u_regs[UREG_FP]) {
|
||||
unsigned long csp;
|
||||
|
||||
csp = clone_stackframe(sp, regs->u_regs[UREG_FP]);
|
||||
if (!csp)
|
||||
return -EFAULT;
|
||||
t->kregs->u_regs[UREG_FP] = csp;
|
||||
}
|
||||
if (t->utraps)
|
||||
t->utraps[0]++;
|
||||
if (unlikely(p->flags & PF_KTHREAD)) {
|
||||
memset(child_trap_frame, 0, child_stack_sz);
|
||||
__thread_flag_byte_ptr(t)[TI_FLAG_BYTE_CWP] =
|
||||
(current_pt_regs()->tstate + 1) & TSTATE_CWP;
|
||||
t->current_ds = ASI_P;
|
||||
t->kregs->u_regs[UREG_G1] = sp; /* function */
|
||||
t->kregs->u_regs[UREG_G2] = arg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
parent_sf = ((struct sparc_stackf *) regs) - 1;
|
||||
memcpy(child_trap_frame, parent_sf, child_stack_sz);
|
||||
if (t->flags & _TIF_32BIT) {
|
||||
sp &= 0x00000000ffffffffUL;
|
||||
regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
|
||||
}
|
||||
t->kregs->u_regs[UREG_FP] = sp;
|
||||
__thread_flag_byte_ptr(t)[TI_FLAG_BYTE_CWP] =
|
||||
(regs->tstate + 1) & TSTATE_CWP;
|
||||
t->current_ds = ASI_AIUS;
|
||||
if (sp != regs->u_regs[UREG_FP]) {
|
||||
unsigned long csp;
|
||||
|
||||
csp = clone_stackframe(sp, regs->u_regs[UREG_FP]);
|
||||
if (!csp)
|
||||
return -EFAULT;
|
||||
t->kregs->u_regs[UREG_FP] = csp;
|
||||
}
|
||||
if (t->utraps)
|
||||
t->utraps[0]++;
|
||||
|
||||
/* Set the return value for the child. */
|
||||
t->kregs->u_regs[UREG_I0] = current->pid;
|
||||
t->kregs->u_regs[UREG_I1] = 1;
|
||||
@@ -694,45 +684,6 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the mechanism for creating a new kernel thread.
|
||||
*
|
||||
* NOTE! Only a kernel-only process(ie the swapper or direct descendants
|
||||
* who haven't done an "execve()") should use this: it will work within
|
||||
* a system call from a "real" process, but the process memory space will
|
||||
* not be freed until both the parent and the child have exited.
|
||||
*/
|
||||
pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
||||
{
|
||||
long retval;
|
||||
|
||||
/* If the parent runs before fn(arg) is called by the child,
|
||||
* the input registers of this function can be clobbered.
|
||||
* So we stash 'fn' and 'arg' into global registers which
|
||||
* will not be modified by the parent.
|
||||
*/
|
||||
__asm__ __volatile__("mov %4, %%g2\n\t" /* Save FN into global */
|
||||
"mov %5, %%g3\n\t" /* Save ARG into global */
|
||||
"mov %1, %%g1\n\t" /* Clone syscall nr. */
|
||||
"mov %2, %%o0\n\t" /* Clone flags. */
|
||||
"mov 0, %%o1\n\t" /* usp arg == 0 */
|
||||
"t 0x6d\n\t" /* Linux/Sparc clone(). */
|
||||
"brz,a,pn %%o1, 1f\n\t" /* Parent, just return. */
|
||||
" mov %%o0, %0\n\t"
|
||||
"jmpl %%g2, %%o7\n\t" /* Call the function. */
|
||||
" mov %%g3, %%o0\n\t" /* Set arg in delay. */
|
||||
"mov %3, %%g1\n\t"
|
||||
"t 0x6d\n\t" /* Linux/Sparc exit(). */
|
||||
/* Notreached by child. */
|
||||
"1:" :
|
||||
"=r" (retval) :
|
||||
"i" (__NR_clone), "r" (flags | CLONE_VM | CLONE_UNTRACED),
|
||||
"i" (__NR_exit), "r" (fn), "r" (arg) :
|
||||
"g1", "g2", "g3", "o0", "o1", "memory", "cc");
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
unsigned int pr_regs[32];
|
||||
@@ -799,41 +750,6 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
|
||||
}
|
||||
EXPORT_SYMBOL(dump_fpu);
|
||||
|
||||
/*
|
||||
* sparc_execve() executes a new program after the asm stub has set
|
||||
* things up for us. This should basically do what I want it to.
|
||||
*/
|
||||
asmlinkage int sparc_execve(struct pt_regs *regs)
|
||||
{
|
||||
int error, base = 0;
|
||||
struct filename *filename;
|
||||
|
||||
/* User register window flush is done by entry.S */
|
||||
|
||||
/* Check for indirect call. */
|
||||
if (regs->u_regs[UREG_G1] == 0)
|
||||
base = 1;
|
||||
|
||||
filename = getname((char __user *)regs->u_regs[base + UREG_I0]);
|
||||
error = PTR_ERR(filename);
|
||||
if (IS_ERR(filename))
|
||||
goto out;
|
||||
error = do_execve(filename->name,
|
||||
(const char __user *const __user *)
|
||||
regs->u_regs[base + UREG_I1],
|
||||
(const char __user *const __user *)
|
||||
regs->u_regs[base + UREG_I2], regs);
|
||||
putname(filename);
|
||||
if (!error) {
|
||||
fprs_write(0);
|
||||
current_thread_info()->xfsr[0] = 0;
|
||||
current_thread_info()->fpsaved[0] = 0;
|
||||
regs->tstate &= ~TSTATE_PEF;
|
||||
}
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
unsigned long get_wchan(struct task_struct *task)
|
||||
{
|
||||
unsigned long pc, fp, bias = 0;
|
||||
|
@@ -295,9 +295,7 @@ void do_rt_sigreturn(struct pt_regs *regs)
|
||||
err |= restore_fpu_state(regs, fpu_save);
|
||||
|
||||
err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
|
||||
err |= do_sigaltstack(&sf->stack, NULL, (unsigned long)sf);
|
||||
|
||||
if (err)
|
||||
if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT)
|
||||
goto segv;
|
||||
|
||||
err |= __get_user(rwin_save, &sf->rwin_save);
|
||||
|
@@ -1180,7 +1180,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
}
|
||||
|
||||
void __devinit smp_prepare_boot_cpu(void)
|
||||
void smp_prepare_boot_cpu(void)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1194,7 +1194,7 @@ void __init smp_setup_processor_id(void)
|
||||
xcall_deliver_impl = hypervisor_xcall_deliver;
|
||||
}
|
||||
|
||||
void __devinit smp_fill_in_sib_core_maps(void)
|
||||
void smp_fill_in_sib_core_maps(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
|
@@ -47,7 +47,7 @@ STUB: sra REG1, 0, REG1; \
|
||||
sra REG4, 0, REG4
|
||||
|
||||
SIGN1(sys32_exit, sparc_exit, %o0)
|
||||
SIGN1(sys32_exit_group, sys_exit_group, %o0)
|
||||
SIGN1(sys32_exit_group, sparc_exit_group, %o0)
|
||||
SIGN1(sys32_wait4, compat_sys_wait4, %o2)
|
||||
SIGN1(sys32_creat, sys_creat, %o1)
|
||||
SIGN1(sys32_mknod, sys_mknod, %o1)
|
||||
|
@@ -211,20 +211,6 @@ asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)
|
||||
return sys_sysfs(option, arg1, arg2);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *interval)
|
||||
{
|
||||
struct timespec t;
|
||||
int ret;
|
||||
mm_segment_t old_fs = get_fs ();
|
||||
|
||||
set_fs (KERNEL_DS);
|
||||
ret = sys_sched_rr_get_interval(pid, (struct timespec __user *) &t);
|
||||
set_fs (old_fs);
|
||||
if (put_compat_timespec(&t, interval))
|
||||
return -EFAULT;
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_rt_sigprocmask(int how,
|
||||
compat_sigset_t __user *set,
|
||||
compat_sigset_t __user *oset,
|
||||
@@ -396,42 +382,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* sparc32_execve() executes a new program after the asm stub has set
|
||||
* things up for us. This should basically do what I want it to.
|
||||
*/
|
||||
asmlinkage long sparc32_execve(struct pt_regs *regs)
|
||||
{
|
||||
int error, base = 0;
|
||||
struct filename *filename;
|
||||
|
||||
/* User register window flush is done by entry.S */
|
||||
|
||||
/* Check for indirect call. */
|
||||
if ((u32)regs->u_regs[UREG_G1] == 0)
|
||||
base = 1;
|
||||
|
||||
filename = getname(compat_ptr(regs->u_regs[base + UREG_I0]));
|
||||
error = PTR_ERR(filename);
|
||||
if (IS_ERR(filename))
|
||||
goto out;
|
||||
|
||||
error = compat_do_execve(filename->name,
|
||||
compat_ptr(regs->u_regs[base + UREG_I1]),
|
||||
compat_ptr(regs->u_regs[base + UREG_I2]), regs);
|
||||
|
||||
putname(filename);
|
||||
|
||||
if (!error) {
|
||||
fprs_write(0);
|
||||
current_thread_info()->xfsr[0] = 0;
|
||||
current_thread_info()->fpsaved[0] = 0;
|
||||
regs->tstate &= ~TSTATE_PEF;
|
||||
}
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
|
||||
asmlinkage long sys32_init_module(void __user *umod, u32 len,
|
||||
|
@@ -34,11 +34,9 @@ asmlinkage unsigned long sys_getpagesize(void)
|
||||
return PAGE_SIZE; /* Possibly older binaries want 8192 on sun4's? */
|
||||
}
|
||||
|
||||
#define COLOUR_ALIGN(addr) (((addr)+SHMLBA-1)&~(SHMLBA-1))
|
||||
|
||||
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||
{
|
||||
struct vm_area_struct * vmm;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
if (flags & MAP_FIXED) {
|
||||
/* We do not accept a shared mapping if it would violate
|
||||
@@ -56,21 +54,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
||||
if (!addr)
|
||||
addr = TASK_UNMAPPED_BASE;
|
||||
|
||||
if (flags & MAP_SHARED)
|
||||
addr = COLOUR_ALIGN(addr);
|
||||
else
|
||||
addr = PAGE_ALIGN(addr);
|
||||
|
||||
for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
|
||||
/* At this point: (!vmm || addr < vmm->vm_end). */
|
||||
if (TASK_SIZE - PAGE_SIZE - len < addr)
|
||||
return -ENOMEM;
|
||||
if (!vmm || addr + len <= vmm->vm_start)
|
||||
return addr;
|
||||
addr = vmm->vm_end;
|
||||
if (flags & MAP_SHARED)
|
||||
addr = COLOUR_ALIGN(addr);
|
||||
}
|
||||
info.flags = 0;
|
||||
info.length = len;
|
||||
info.low_limit = addr;
|
||||
info.high_limit = TASK_SIZE;
|
||||
info.align_mask = (flags & MAP_SHARED) ?
|
||||
(PAGE_MASK & (SHMLBA - 1)) : 0;
|
||||
info.align_offset = pgoff << PAGE_SHIFT;
|
||||
return vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -258,27 +249,3 @@ out:
|
||||
up_read(&uts_sem);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do a system call from kernel instead of calling sys_execve so we
|
||||
* end up with proper pt_regs.
|
||||
*/
|
||||
int kernel_execve(const char *filename,
|
||||
const char *const argv[],
|
||||
const char *const envp[])
|
||||
{
|
||||
long __res;
|
||||
register long __g1 __asm__ ("g1") = __NR_execve;
|
||||
register long __o0 __asm__ ("o0") = (long)(filename);
|
||||
register long __o1 __asm__ ("o1") = (long)(argv);
|
||||
register long __o2 __asm__ ("o2") = (long)(envp);
|
||||
asm volatile ("t 0x10\n\t"
|
||||
"bcc 1f\n\t"
|
||||
"mov %%o0, %0\n\t"
|
||||
"sub %%g0, %%o0, %0\n\t"
|
||||
"1:\n\t"
|
||||
: "=r" (__res), "=&r" (__o0)
|
||||
: "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1)
|
||||
: "cc");
|
||||
return __res;
|
||||
}
|
||||
|
@@ -75,7 +75,7 @@ static inline int invalid_64bit_range(unsigned long addr, unsigned long len)
|
||||
* the spitfire/niagara VA-hole.
|
||||
*/
|
||||
|
||||
static inline unsigned long COLOUR_ALIGN(unsigned long addr,
|
||||
static inline unsigned long COLOR_ALIGN(unsigned long addr,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
unsigned long base = (addr+SHMLBA-1)&~(SHMLBA-1);
|
||||
@@ -84,24 +84,13 @@ static inline unsigned long COLOUR_ALIGN(unsigned long addr,
|
||||
return base + off;
|
||||
}
|
||||
|
||||
static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
unsigned long base = addr & ~(SHMLBA-1);
|
||||
unsigned long off = (pgoff<<PAGE_SHIFT) & (SHMLBA-1);
|
||||
|
||||
if (base + off <= addr)
|
||||
return base + off;
|
||||
return base - off;
|
||||
}
|
||||
|
||||
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct * vma;
|
||||
unsigned long task_size = TASK_SIZE;
|
||||
unsigned long start_addr;
|
||||
int do_color_align;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
if (flags & MAP_FIXED) {
|
||||
/* We do not accept a shared mapping if it would violate
|
||||
@@ -124,7 +113,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
||||
|
||||
if (addr) {
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN(addr, pgoff);
|
||||
addr = COLOR_ALIGN(addr, pgoff);
|
||||
else
|
||||
addr = PAGE_ALIGN(addr);
|
||||
|
||||
@@ -134,50 +123,22 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
||||
return addr;
|
||||
}
|
||||
|
||||
if (len > mm->cached_hole_size) {
|
||||
start_addr = addr = mm->free_area_cache;
|
||||
} else {
|
||||
start_addr = addr = TASK_UNMAPPED_BASE;
|
||||
mm->cached_hole_size = 0;
|
||||
info.flags = 0;
|
||||
info.length = len;
|
||||
info.low_limit = TASK_UNMAPPED_BASE;
|
||||
info.high_limit = min(task_size, VA_EXCLUDE_START);
|
||||
info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0;
|
||||
info.align_offset = pgoff << PAGE_SHIFT;
|
||||
addr = vm_unmapped_area(&info);
|
||||
|
||||
if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) {
|
||||
VM_BUG_ON(addr != -ENOMEM);
|
||||
info.low_limit = VA_EXCLUDE_END;
|
||||
info.high_limit = task_size;
|
||||
addr = vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
task_size -= len;
|
||||
|
||||
full_search:
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN(addr, pgoff);
|
||||
else
|
||||
addr = PAGE_ALIGN(addr);
|
||||
|
||||
for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
|
||||
/* At this point: (!vma || addr < vma->vm_end). */
|
||||
if (addr < VA_EXCLUDE_START &&
|
||||
(addr + len) >= VA_EXCLUDE_START) {
|
||||
addr = VA_EXCLUDE_END;
|
||||
vma = find_vma(mm, VA_EXCLUDE_END);
|
||||
}
|
||||
if (unlikely(task_size < addr)) {
|
||||
if (start_addr != TASK_UNMAPPED_BASE) {
|
||||
start_addr = addr = TASK_UNMAPPED_BASE;
|
||||
mm->cached_hole_size = 0;
|
||||
goto full_search;
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (likely(!vma || addr + len <= vma->vm_start)) {
|
||||
/*
|
||||
* Remember the place where we stopped the search:
|
||||
*/
|
||||
mm->free_area_cache = addr + len;
|
||||
return addr;
|
||||
}
|
||||
if (addr + mm->cached_hole_size < vma->vm_start)
|
||||
mm->cached_hole_size = vma->vm_start - addr;
|
||||
|
||||
addr = vma->vm_end;
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN(addr, pgoff);
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
@@ -190,6 +151,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
||||
unsigned long task_size = STACK_TOP32;
|
||||
unsigned long addr = addr0;
|
||||
int do_color_align;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
/* This should only ever run for 32-bit processes. */
|
||||
BUG_ON(!test_thread_flag(TIF_32BIT));
|
||||
@@ -214,7 +176,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
||||
/* requesting a specific address */
|
||||
if (addr) {
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN(addr, pgoff);
|
||||
addr = COLOR_ALIGN(addr, pgoff);
|
||||
else
|
||||
addr = PAGE_ALIGN(addr);
|
||||
|
||||
@@ -224,73 +186,27 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
||||
return addr;
|
||||
}
|
||||
|
||||
/* check if free_area_cache is useful for us */
|
||||
if (len <= mm->cached_hole_size) {
|
||||
mm->cached_hole_size = 0;
|
||||
mm->free_area_cache = mm->mmap_base;
|
||||
}
|
||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||
info.length = len;
|
||||
info.low_limit = PAGE_SIZE;
|
||||
info.high_limit = mm->mmap_base;
|
||||
info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0;
|
||||
info.align_offset = pgoff << PAGE_SHIFT;
|
||||
addr = vm_unmapped_area(&info);
|
||||
|
||||
/* either no address requested or can't fit in requested address hole */
|
||||
addr = mm->free_area_cache;
|
||||
if (do_color_align) {
|
||||
unsigned long base = COLOUR_ALIGN_DOWN(addr-len, pgoff);
|
||||
|
||||
addr = base + len;
|
||||
}
|
||||
|
||||
/* make sure it can fit in the remaining address space */
|
||||
if (likely(addr > len)) {
|
||||
vma = find_vma(mm, addr-len);
|
||||
if (!vma || addr <= vma->vm_start) {
|
||||
/* remember the address as a hint for next time */
|
||||
return (mm->free_area_cache = addr-len);
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(mm->mmap_base < len))
|
||||
goto bottomup;
|
||||
|
||||
addr = mm->mmap_base-len;
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN_DOWN(addr, pgoff);
|
||||
|
||||
do {
|
||||
/*
|
||||
* Lookup failure means no vma is above this address,
|
||||
* else if new region fits below vma->vm_start,
|
||||
* return with success:
|
||||
*/
|
||||
vma = find_vma(mm, addr);
|
||||
if (likely(!vma || addr+len <= vma->vm_start)) {
|
||||
/* remember the address as a hint for next time */
|
||||
return (mm->free_area_cache = addr);
|
||||
}
|
||||
|
||||
/* remember the largest hole we saw so far */
|
||||
if (addr + mm->cached_hole_size < vma->vm_start)
|
||||
mm->cached_hole_size = vma->vm_start - addr;
|
||||
|
||||
/* try just below the current vma->vm_start */
|
||||
addr = vma->vm_start-len;
|
||||
if (do_color_align)
|
||||
addr = COLOUR_ALIGN_DOWN(addr, pgoff);
|
||||
} while (likely(len < vma->vm_start));
|
||||
|
||||
bottomup:
|
||||
/*
|
||||
* A failed mmap() very likely causes application failure,
|
||||
* so fall back to the bottom-up function here. This scenario
|
||||
* can happen with large stack limits and large mmap()
|
||||
* allocations.
|
||||
*/
|
||||
mm->cached_hole_size = ~0UL;
|
||||
mm->free_area_cache = TASK_UNMAPPED_BASE;
|
||||
addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
|
||||
/*
|
||||
* Restore the topdown base:
|
||||
*/
|
||||
mm->free_area_cache = mm->mmap_base;
|
||||
mm->cached_hole_size = ~0UL;
|
||||
if (addr & ~PAGE_MASK) {
|
||||
VM_BUG_ON(addr != -ENOMEM);
|
||||
info.flags = 0;
|
||||
info.low_limit = TASK_UNMAPPED_BASE;
|
||||
info.high_limit = STACK_TOP32;
|
||||
addr = vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
@@ -730,28 +646,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do a system call from kernel instead of calling sys_execve so we
|
||||
* end up with proper pt_regs.
|
||||
*/
|
||||
int kernel_execve(const char *filename,
|
||||
const char *const argv[],
|
||||
const char *const envp[])
|
||||
{
|
||||
long __res;
|
||||
register long __g1 __asm__ ("g1") = __NR_execve;
|
||||
register long __o0 __asm__ ("o0") = (long)(filename);
|
||||
register long __o1 __asm__ ("o1") = (long)(argv);
|
||||
register long __o2 __asm__ ("o2") = (long)(envp);
|
||||
asm volatile ("t 0x6d\n\t"
|
||||
"sub %%g0, %%o0, %0\n\t"
|
||||
"movcc %%xcc, %%o0, %0\n\t"
|
||||
: "=r" (__res), "=&r" (__o0)
|
||||
: "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1)
|
||||
: "cc");
|
||||
return __res;
|
||||
}
|
||||
|
||||
asmlinkage long sys_kern_features(void)
|
||||
{
|
||||
return KERN_FEATURE_MIXED_MODE_STACK;
|
||||
|
@@ -1,23 +1,19 @@
|
||||
/* SunOS's execv() call only specifies the argv argument, the
|
||||
* environment settings are the same as the calling processes.
|
||||
*/
|
||||
sys_execve:
|
||||
sethi %hi(sparc_execve), %g1
|
||||
ba,pt %xcc, execve_merge
|
||||
or %g1, %lo(sparc_execve), %g1
|
||||
sys64_execve:
|
||||
set sys_execve, %g1
|
||||
jmpl %g1, %g0
|
||||
flushw
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
sunos_execv:
|
||||
stx %g0, [%sp + PTREGS_OFF + PT_V9_I2]
|
||||
mov %g0, %o2
|
||||
sys32_execve:
|
||||
sethi %hi(sparc32_execve), %g1
|
||||
or %g1, %lo(sparc32_execve), %g1
|
||||
#endif
|
||||
|
||||
execve_merge:
|
||||
flushw
|
||||
set compat_sys_execve, %g1
|
||||
jmpl %g1, %g0
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
flushw
|
||||
#endif
|
||||
|
||||
.align 32
|
||||
sys_sparc_pipe:
|
||||
@@ -112,16 +108,31 @@ sys_clone:
|
||||
ret_from_syscall:
|
||||
/* Clear current_thread_info()->new_child. */
|
||||
stb %g0, [%g6 + TI_NEW_CHILD]
|
||||
ldx [%g6 + TI_FLAGS], %l0
|
||||
call schedule_tail
|
||||
mov %g7, %o0
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0
|
||||
brnz,pt %o0, ret_sys_call
|
||||
ldx [%g6 + TI_FLAGS], %l0
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_G1], %l1
|
||||
call %l1
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_G2], %o0
|
||||
ba,pt %xcc, ret_sys_call
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0
|
||||
mov 0, %o0
|
||||
|
||||
.globl sparc_exit_group
|
||||
.type sparc_exit_group,#function
|
||||
sparc_exit_group:
|
||||
sethi %hi(sys_exit_group), %g7
|
||||
ba,pt %xcc, 1f
|
||||
or %g7, %lo(sys_exit_group), %g7
|
||||
.size sparc_exit_group,.-sparc_exit_group
|
||||
|
||||
.globl sparc_exit
|
||||
.type sparc_exit,#function
|
||||
sparc_exit:
|
||||
rdpr %pstate, %g2
|
||||
sethi %hi(sys_exit), %g7
|
||||
or %g7, %lo(sys_exit), %g7
|
||||
1: rdpr %pstate, %g2
|
||||
wrpr %g2, PSTATE_IE, %pstate
|
||||
rdpr %otherwin, %g1
|
||||
rdpr %cansave, %g3
|
||||
@@ -129,7 +140,7 @@ sparc_exit:
|
||||
wrpr %g3, 0x0, %cansave
|
||||
wrpr %g0, 0x0, %otherwin
|
||||
wrpr %g2, 0x0, %pstate
|
||||
ba,pt %xcc, sys_exit
|
||||
jmpl %g7, %g0
|
||||
stb %g0, [%g6 + TI_WSAVED]
|
||||
.size sparc_exit,.-sparc_exit
|
||||
|
||||
@@ -222,7 +233,6 @@ ret_sys_call:
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
|
||||
|
||||
2:
|
||||
stb %g0, [%g6 + TI_SYS_NOERROR]
|
||||
/* System call success, clear Carry condition code. */
|
||||
andn %g3, %g2, %g3
|
||||
3:
|
||||
|
@@ -85,4 +85,4 @@ sys_call_table:
|
||||
/*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
|
||||
/*330*/ .long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
||||
/*335*/ .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
||||
/*340*/ .long sys_ni_syscall, sys_kcmp
|
||||
/*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module
|
||||
|
@@ -86,7 +86,7 @@ sys_call_table32:
|
||||
.word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init
|
||||
/*330*/ .word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime
|
||||
.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev
|
||||
/*340*/ .word sys_kern_features, sys_kcmp
|
||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
@@ -107,7 +107,7 @@ sys_call_table:
|
||||
/*40*/ .word sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_nis_syscall
|
||||
.word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
|
||||
/*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl
|
||||
.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
|
||||
.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys64_execve
|
||||
/*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize
|
||||
.word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall
|
||||
/*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect
|
||||
@@ -133,7 +133,7 @@ sys_call_table:
|
||||
/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents
|
||||
.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
|
||||
/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall
|
||||
.word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
|
||||
.word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname
|
||||
/*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
|
||||
.word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask
|
||||
/*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall
|
||||
@@ -164,4 +164,4 @@ sys_call_table:
|
||||
.word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init
|
||||
/*330*/ .word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime
|
||||
.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
|
||||
/*340*/ .word sys_kern_features, sys_kcmp
|
||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module
|
||||
|
@@ -278,7 +278,7 @@ static struct platform_device m48t59_rtc = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __devinit clock_probe(struct platform_device *op)
|
||||
static int clock_probe(struct platform_device *op)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
const char *model = of_get_property(dp, "model", NULL);
|
||||
|
@@ -419,7 +419,7 @@ static struct platform_device rtc_cmos_device = {
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static int __devinit rtc_probe(struct platform_device *op)
|
||||
static int rtc_probe(struct platform_device *op)
|
||||
{
|
||||
struct resource *r;
|
||||
|
||||
@@ -477,7 +477,7 @@ static struct platform_device rtc_bq4802_device = {
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static int __devinit bq4802_probe(struct platform_device *op)
|
||||
static int bq4802_probe(struct platform_device *op)
|
||||
{
|
||||
|
||||
printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n",
|
||||
@@ -534,7 +534,7 @@ static struct platform_device m48t59_rtc = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __devinit mostek_probe(struct platform_device *op)
|
||||
static int mostek_probe(struct platform_device *op)
|
||||
{
|
||||
struct device_node *dp = op->dev.of_node;
|
||||
|
||||
@@ -746,7 +746,7 @@ void __irq_entry timer_interrupt(int irq, struct pt_regs *regs)
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
void __devinit setup_sparc64_timer(void)
|
||||
void setup_sparc64_timer(void)
|
||||
{
|
||||
struct clock_event_device *sevt;
|
||||
unsigned long pstate;
|
||||
@@ -844,7 +844,7 @@ unsigned long long sched_clock(void)
|
||||
>> SPARC64_NSEC_PER_CYC_SHIFT;
|
||||
}
|
||||
|
||||
int __devinit read_current_timer(unsigned long *timer_val)
|
||||
int read_current_timer(unsigned long *timer_val)
|
||||
{
|
||||
*timer_val = tick_ops->get_tick();
|
||||
return 0;
|
||||
|
@@ -2688,8 +2688,8 @@ void __init trap_init(void)
|
||||
TI_PRE_COUNT != offsetof(struct thread_info,
|
||||
preempt_count) ||
|
||||
TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
|
||||
TI_SYS_NOERROR != offsetof(struct thread_info,
|
||||
syscall_noerror) ||
|
||||
TI_CURRENT_DS != offsetof(struct thread_info,
|
||||
current_ds) ||
|
||||
TI_RESTART_BLOCK != offsetof(struct thread_info,
|
||||
restart_block) ||
|
||||
TI_KUNA_REGS != offsetof(struct thread_info,
|
||||
|
@@ -30,55 +30,28 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp,
|
||||
unsigned long pgoff,
|
||||
unsigned long flags)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct * vma;
|
||||
unsigned long task_size = TASK_SIZE;
|
||||
unsigned long start_addr;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
if (test_thread_flag(TIF_32BIT))
|
||||
task_size = STACK_TOP32;
|
||||
if (unlikely(len >= VA_EXCLUDE_START))
|
||||
return -ENOMEM;
|
||||
|
||||
if (len > mm->cached_hole_size) {
|
||||
start_addr = addr = mm->free_area_cache;
|
||||
} else {
|
||||
start_addr = addr = TASK_UNMAPPED_BASE;
|
||||
mm->cached_hole_size = 0;
|
||||
info.flags = 0;
|
||||
info.length = len;
|
||||
info.low_limit = TASK_UNMAPPED_BASE;
|
||||
info.high_limit = min(task_size, VA_EXCLUDE_START);
|
||||
info.align_mask = PAGE_MASK & ~HPAGE_MASK;
|
||||
info.align_offset = 0;
|
||||
addr = vm_unmapped_area(&info);
|
||||
|
||||
if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) {
|
||||
VM_BUG_ON(addr != -ENOMEM);
|
||||
info.low_limit = VA_EXCLUDE_END;
|
||||
info.high_limit = task_size;
|
||||
addr = vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
task_size -= len;
|
||||
|
||||
full_search:
|
||||
addr = ALIGN(addr, HPAGE_SIZE);
|
||||
|
||||
for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
|
||||
/* At this point: (!vma || addr < vma->vm_end). */
|
||||
if (addr < VA_EXCLUDE_START &&
|
||||
(addr + len) >= VA_EXCLUDE_START) {
|
||||
addr = VA_EXCLUDE_END;
|
||||
vma = find_vma(mm, VA_EXCLUDE_END);
|
||||
}
|
||||
if (unlikely(task_size < addr)) {
|
||||
if (start_addr != TASK_UNMAPPED_BASE) {
|
||||
start_addr = addr = TASK_UNMAPPED_BASE;
|
||||
mm->cached_hole_size = 0;
|
||||
goto full_search;
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (likely(!vma || addr + len <= vma->vm_start)) {
|
||||
/*
|
||||
* Remember the place where we stopped the search:
|
||||
*/
|
||||
mm->free_area_cache = addr + len;
|
||||
return addr;
|
||||
}
|
||||
if (addr + mm->cached_hole_size < vma->vm_start)
|
||||
mm->cached_hole_size = vma->vm_start - addr;
|
||||
|
||||
addr = ALIGN(vma->vm_end, HPAGE_SIZE);
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
@@ -87,71 +60,34 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
||||
const unsigned long pgoff,
|
||||
const unsigned long flags)
|
||||
{
|
||||
struct vm_area_struct *vma;
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long addr = addr0;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
/* This should only ever run for 32-bit processes. */
|
||||
BUG_ON(!test_thread_flag(TIF_32BIT));
|
||||
|
||||
/* check if free_area_cache is useful for us */
|
||||
if (len <= mm->cached_hole_size) {
|
||||
mm->cached_hole_size = 0;
|
||||
mm->free_area_cache = mm->mmap_base;
|
||||
}
|
||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||
info.length = len;
|
||||
info.low_limit = PAGE_SIZE;
|
||||
info.high_limit = mm->mmap_base;
|
||||
info.align_mask = PAGE_MASK & ~HPAGE_MASK;
|
||||
info.align_offset = 0;
|
||||
addr = vm_unmapped_area(&info);
|
||||
|
||||
/* either no address requested or can't fit in requested address hole */
|
||||
addr = mm->free_area_cache & HPAGE_MASK;
|
||||
|
||||
/* make sure it can fit in the remaining address space */
|
||||
if (likely(addr > len)) {
|
||||
vma = find_vma(mm, addr-len);
|
||||
if (!vma || addr <= vma->vm_start) {
|
||||
/* remember the address as a hint for next time */
|
||||
return (mm->free_area_cache = addr-len);
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(mm->mmap_base < len))
|
||||
goto bottomup;
|
||||
|
||||
addr = (mm->mmap_base-len) & HPAGE_MASK;
|
||||
|
||||
do {
|
||||
/*
|
||||
* Lookup failure means no vma is above this address,
|
||||
* else if new region fits below vma->vm_start,
|
||||
* return with success:
|
||||
*/
|
||||
vma = find_vma(mm, addr);
|
||||
if (likely(!vma || addr+len <= vma->vm_start)) {
|
||||
/* remember the address as a hint for next time */
|
||||
return (mm->free_area_cache = addr);
|
||||
}
|
||||
|
||||
/* remember the largest hole we saw so far */
|
||||
if (addr + mm->cached_hole_size < vma->vm_start)
|
||||
mm->cached_hole_size = vma->vm_start - addr;
|
||||
|
||||
/* try just below the current vma->vm_start */
|
||||
addr = (vma->vm_start-len) & HPAGE_MASK;
|
||||
} while (likely(len < vma->vm_start));
|
||||
|
||||
bottomup:
|
||||
/*
|
||||
* A failed mmap() very likely causes application failure,
|
||||
* so fall back to the bottom-up function here. This scenario
|
||||
* can happen with large stack limits and large mmap()
|
||||
* allocations.
|
||||
*/
|
||||
mm->cached_hole_size = ~0UL;
|
||||
mm->free_area_cache = TASK_UNMAPPED_BASE;
|
||||
addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags);
|
||||
/*
|
||||
* Restore the topdown base:
|
||||
*/
|
||||
mm->free_area_cache = mm->mmap_base;
|
||||
mm->cached_hole_size = ~0UL;
|
||||
if (addr & ~PAGE_MASK) {
|
||||
VM_BUG_ON(addr != -ENOMEM);
|
||||
info.flags = 0;
|
||||
info.low_limit = TASK_UNMAPPED_BASE;
|
||||
info.high_limit = STACK_TOP32;
|
||||
addr = vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
@@ -87,8 +87,8 @@ static unsigned long cpu_pgsz_mask;
|
||||
|
||||
#define MAX_BANKS 32
|
||||
|
||||
static struct linux_prom64_registers pavail[MAX_BANKS] __devinitdata;
|
||||
static int pavail_ents __devinitdata;
|
||||
static struct linux_prom64_registers pavail[MAX_BANKS];
|
||||
static int pavail_ents;
|
||||
|
||||
static int cmp_p64(const void *a, const void *b)
|
||||
{
|
||||
@@ -624,7 +624,7 @@ static void __init inherit_prom_mappings(void)
|
||||
void prom_world(int enter)
|
||||
{
|
||||
if (!enter)
|
||||
set_fs((mm_segment_t) { get_thread_current_ds() });
|
||||
set_fs(get_fs());
|
||||
|
||||
__asm__ __volatile__("flushw");
|
||||
}
|
||||
@@ -1931,7 +1931,7 @@ void __init paging_init(void)
|
||||
printk("Booting Linux...\n");
|
||||
}
|
||||
|
||||
int __devinit page_in_phys_avail(unsigned long paddr)
|
||||
int page_in_phys_avail(unsigned long paddr)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@@ -3,6 +3,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/ptrace.h>
|
||||
@@ -312,6 +313,12 @@ do { *prog++ = BR_OPC | WDISP22(OFF); \
|
||||
#define emit_addi(R1, IMM, R3) \
|
||||
*prog++ = (ADD | IMMED | RS1(R1) | S13(IMM) | RD(R3))
|
||||
|
||||
#define emit_and(R1, R2, R3) \
|
||||
*prog++ = (AND | RS1(R1) | RS2(R2) | RD(R3))
|
||||
|
||||
#define emit_andi(R1, IMM, R3) \
|
||||
*prog++ = (AND | IMMED | RS1(R1) | S13(IMM) | RD(R3))
|
||||
|
||||
#define emit_alloc_stack(SZ) \
|
||||
*prog++ = (SUB | IMMED | RS1(SP) | S13(SZ) | RD(SP))
|
||||
|
||||
@@ -415,6 +422,8 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
case BPF_S_ANC_IFINDEX:
|
||||
case BPF_S_ANC_MARK:
|
||||
case BPF_S_ANC_RXHASH:
|
||||
case BPF_S_ANC_VLAN_TAG:
|
||||
case BPF_S_ANC_VLAN_TAG_PRESENT:
|
||||
case BPF_S_ANC_CPU:
|
||||
case BPF_S_ANC_QUEUE:
|
||||
case BPF_S_LD_W_ABS:
|
||||
@@ -600,6 +609,16 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
case BPF_S_ANC_RXHASH:
|
||||
emit_skb_load32(rxhash, r_A);
|
||||
break;
|
||||
case BPF_S_ANC_VLAN_TAG:
|
||||
case BPF_S_ANC_VLAN_TAG_PRESENT:
|
||||
emit_skb_load16(vlan_tci, r_A);
|
||||
if (filter[i].code == BPF_S_ANC_VLAN_TAG) {
|
||||
emit_andi(r_A, VLAN_VID_MASK, r_A);
|
||||
} else {
|
||||
emit_loadimm(VLAN_TAG_PRESENT, r_TMP);
|
||||
emit_and(r_A, r_TMP, r_A);
|
||||
}
|
||||
break;
|
||||
|
||||
case BPF_S_LD_IMM:
|
||||
emit_loadimm(K, r_A);
|
||||
|
Reference in New Issue
Block a user