Commit 18a65429 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://ppc.bkbits.net/for-linus-ppc

into home.osdl.org:/home/torvalds/v2.5/linux
parents 300e6521 7c35666d
...@@ -420,10 +420,9 @@ void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq) ...@@ -420,10 +420,9 @@ void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq)
{ {
int status; int status;
struct irqaction *action; struct irqaction *action;
int cpu = smp_processor_id();
irq_desc_t *desc = irq_desc + irq; irq_desc_t *desc = irq_desc + irq;
kstat_cpu(cpu).irqs[irq]++; kstat_this_cpu.irqs[irq]++;
spin_lock(&desc->lock); spin_lock(&desc->lock);
ack_irq(irq); ack_irq(irq);
/* /*
......
...@@ -1375,3 +1375,8 @@ _GLOBAL(sys_call_table) ...@@ -1375,3 +1375,8 @@ _GLOBAL(sys_call_table)
.long sys_clock_gettime .long sys_clock_gettime
.long sys_clock_getres .long sys_clock_getres
.long sys_clock_nanosleep .long sys_clock_nanosleep
.long sys_ni_syscall /* reserved for swapcontext */
.long sys_tgkill /* 250 */
.long sys_utimes
.long sys_statfs64
.long sys_fstatfs64
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
* *
*/ */
#include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -59,10 +58,15 @@ sys_ipc (uint call, int first, int second, int third, void __user *ptr, long fif ...@@ -59,10 +58,15 @@ sys_ipc (uint call, int first, int second, int third, void __user *ptr, long fif
version = call >> 16; /* hack for backward compatibility */ version = call >> 16; /* hack for backward compatibility */
call &= 0xffff; call &= 0xffff;
ret = -EINVAL; ret = -ENOSYS;
switch (call) { switch (call) {
case SEMOP: case SEMOP:
ret = sys_semop (first, (struct sembuf __user *)ptr, second); ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
second, NULL);
break;
case SEMTIMEDOP:
ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
second, (const struct timespec *) fifth);
break; break;
case SEMGET: case SEMGET:
ret = sys_semget (first, second, third); ret = sys_semget (first, second, third);
...@@ -258,6 +262,4 @@ int sys_olduname(struct oldold_utsname __user * name) ...@@ -258,6 +262,4 @@ int sys_olduname(struct oldold_utsname __user * name)
return error; return error;
} }
cond_syscall(sys_pciconfig_read);
cond_syscall(sys_pciconfig_write);
cond_syscall(sys_pciconfig_iobase); cond_syscall(sys_pciconfig_iobase);
...@@ -244,7 +244,7 @@ int do_settimeofday(struct timespec *tv) ...@@ -244,7 +244,7 @@ int do_settimeofday(struct timespec *tv)
time_t wtm_sec, new_sec = tv->tv_sec; time_t wtm_sec, new_sec = tv->tv_sec;
long wtm_nsec, new_nsec = tv->tv_nsec; long wtm_nsec, new_nsec = tv->tv_nsec;
unsigned long flags; unsigned long flags;
int tb_delta, new_nsec, new_sec; int tb_delta;
if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
return -EINVAL; return -EINVAL;
......
...@@ -176,7 +176,7 @@ do_set_cpu_speed(int speed_mode) ...@@ -176,7 +176,7 @@ do_set_cpu_speed(int speed_mode)
freqs.old = cur_freq; freqs.old = cur_freq;
freqs.new = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq; freqs.new = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq;
freqs.cpu = CPUFREQ_ALL_CPUS; freqs.cpu = smp_processor_id();
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
if (cpufreq_uses_pmu) if (cpufreq_uses_pmu)
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
*/ */
typedef struct { typedef struct {
unsigned long __softirq_pending; /* set_bit is used on this */ unsigned long __softirq_pending; /* set_bit is used on this */
unsigned int __syscall_count;
struct task_struct * __ksoftirqd_task;
unsigned int __last_jiffy_stamp; unsigned int __last_jiffy_stamp;
} ____cacheline_aligned irq_cpustat_t; } ____cacheline_aligned irq_cpustat_t;
......
...@@ -14,6 +14,7 @@ struct ipc_kludge { ...@@ -14,6 +14,7 @@ struct ipc_kludge {
#define SEMOP 1 #define SEMOP 1
#define SEMGET 2 #define SEMGET 2
#define SEMCTL 3 #define SEMCTL 3
#define SEMTIMEDOP 4
#define MSGSND 11 #define MSGSND 11
#define MSGRCV 12 #define MSGRCV 12
#define MSGGET 13 #define MSGGET 13
......
...@@ -53,18 +53,12 @@ extern unsigned long phys_to_bus(unsigned long pa); ...@@ -53,18 +53,12 @@ extern unsigned long phys_to_bus(unsigned long pa);
extern unsigned long pci_phys_to_bus(unsigned long pa, int busnr); extern unsigned long pci_phys_to_bus(unsigned long pa, int busnr);
extern unsigned long pci_bus_to_phys(unsigned int ba, int busnr); extern unsigned long pci_bus_to_phys(unsigned int ba, int busnr);
/* Dynamic DMA Mapping stuff, stolen from i386 /*
* ++ajoshi * Dynamic DMA Mapping stuff
* Originally stolen from i386 by ajoshi and updated by paulus
* Non-consistent cache support by Dan Malek
*/ */
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <asm/scatterlist.h>
#include <asm/io.h>
struct pci_dev;
/* The PCI address space does equal the physical memory /* The PCI address space does equal the physical memory
* address space. The networking and block device layers use * address space. The networking and block device layers use
* this boolean for bounce buffer decisions. * this boolean for bounce buffer decisions.
...@@ -101,8 +95,7 @@ extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, ...@@ -101,8 +95,7 @@ extern void pci_free_consistent(struct pci_dev *hwdev, size_t size,
static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
size_t size, int direction) size_t size, int direction)
{ {
if (direction == PCI_DMA_NONE) BUG_ON(direction == PCI_DMA_NONE);
BUG();
consistent_sync(ptr, size, direction); consistent_sync(ptr, size, direction);
...@@ -130,10 +123,11 @@ static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, ...@@ -130,10 +123,11 @@ static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
* to pci_map_single, but takes a struct page instead of a virtual address * to pci_map_single, but takes a struct page instead of a virtual address
*/ */
static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page, static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
unsigned long offset, size_t size, int direction) unsigned long offset, size_t size,
int direction)
{ {
if (direction == PCI_DMA_NONE) BUG_ON(direction == PCI_DMA_NONE);
BUG(); consistent_sync_page(page, offset, size, direction);
return (page - mem_map) * PAGE_SIZE + PCI_DRAM_OFFSET + offset; return (page - mem_map) * PAGE_SIZE + PCI_DRAM_OFFSET + offset;
} }
...@@ -171,10 +165,11 @@ static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, ...@@ -171,10 +165,11 @@ static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
/* /*
* temporary 2.4 hack * temporary 2.4 hack
*/ */
for (i = 0; i < nents; i++) { for (i = 0; i < nents; i++, sg++) {
if (!sg[i].page) BUG_ON(!sg->page);
BUG(); consistent_sync_page(sg->page, sg->offset,
sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset; sg->length, direction);
sg->dma_address = page_to_bus(sg->page) + sg->offset;
} }
return nents; return nents;
...@@ -187,8 +182,7 @@ static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, ...@@ -187,8 +182,7 @@ static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
int nents, int direction) int nents, int direction)
{ {
if (direction == PCI_DMA_NONE) BUG_ON(direction == PCI_DMA_NONE);
BUG();
/* nothing to do */ /* nothing to do */
} }
...@@ -205,8 +199,7 @@ static inline void pci_dma_sync_single(struct pci_dev *hwdev, ...@@ -205,8 +199,7 @@ static inline void pci_dma_sync_single(struct pci_dev *hwdev,
dma_addr_t dma_handle, dma_addr_t dma_handle,
size_t size, int direction) size_t size, int direction)
{ {
if (direction == PCI_DMA_NONE) BUG_ON(direction == PCI_DMA_NONE);
BUG();
consistent_sync(bus_to_virt(dma_handle), size, direction); consistent_sync(bus_to_virt(dma_handle), size, direction);
} }
...@@ -221,9 +214,13 @@ static inline void pci_dma_sync_sg(struct pci_dev *hwdev, ...@@ -221,9 +214,13 @@ static inline void pci_dma_sync_sg(struct pci_dev *hwdev,
struct scatterlist *sg, struct scatterlist *sg,
int nelems, int direction) int nelems, int direction)
{ {
if (direction == PCI_DMA_NONE) int i;
BUG();
/* nothing to do */ BUG_ON(direction == PCI_DMA_NONE);
for (i = 0; i < nelems; i++, sg++)
consistent_sync_page(sg->page, sg->offset,
sg->length, direction);
} }
/* Return whether the given PCI device DMA address mask can /* Return whether the given PCI device DMA address mask can
......
...@@ -705,6 +705,7 @@ struct thread_struct { ...@@ -705,6 +705,7 @@ struct thread_struct {
.ksp = INIT_SP, \ .ksp = INIT_SP, \
.fs = KERNEL_DS, \ .fs = KERNEL_DS, \
.pgdir = swapper_pg_dir, \ .pgdir = swapper_pg_dir, \
.fpexc_mode = MSR_FE0 | MSR_FE1, \
} }
/* /*
......
...@@ -16,10 +16,13 @@ ...@@ -16,10 +16,13 @@
* get_fs() == KERNEL_DS, checking is bypassed. * get_fs() == KERNEL_DS, checking is bypassed.
* *
* For historical reasons, these macros are grossly misnamed. * For historical reasons, these macros are grossly misnamed.
*
* The fs/ds values are now the highest legal address in the "segment".
* This simplifies the checking in the routines below.
*/ */
#define KERNEL_DS ((mm_segment_t) { 0 }) #define KERNEL_DS ((mm_segment_t) { ~0UL })
#define USER_DS ((mm_segment_t) { 1 }) #define USER_DS ((mm_segment_t) { TASK_SIZE - 1 })
#define get_ds() (KERNEL_DS) #define get_ds() (KERNEL_DS)
#define get_fs() (current->thread.fs) #define get_fs() (current->thread.fs)
...@@ -27,14 +30,15 @@ ...@@ -27,14 +30,15 @@
#define segment_eq(a,b) ((a).seg == (b).seg) #define segment_eq(a,b) ((a).seg == (b).seg)
#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) #define __access_ok(addr,size) \
#define __user_ok(addr,size) (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size))) ((addr) <= current->thread.fs.seg \
#define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size))) && ((size) == 0 || (size) - 1 <= current->thread.fs.seg - (addr)))
#define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size))
#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
extern inline int verify_area(int type, const void __user * addr, unsigned long size) extern inline int verify_area(int type, const void __user * addr, unsigned long size)
{ {
return access_ok(type,addr,size) ? 0 : -EFAULT; return access_ok(type, addr, size) ? 0 : -EFAULT;
} }
...@@ -303,7 +307,7 @@ extern int __strnlen_user(const char __user *str, long len, unsigned long top); ...@@ -303,7 +307,7 @@ extern int __strnlen_user(const char __user *str, long len, unsigned long top);
*/ */
extern __inline__ int strnlen_user(const char __user *str, long len) extern __inline__ int strnlen_user(const char __user *str, long len)
{ {
unsigned long top = __kernel_ok? ~0UL: TASK_SIZE - 1; unsigned long top = current->thread.fs.seg;
if ((unsigned long)str > top) if ((unsigned long)str > top)
return 0; return 0;
......
...@@ -253,177 +253,112 @@ ...@@ -253,177 +253,112 @@
#define __NR_clock_gettime 246 #define __NR_clock_gettime 246
#define __NR_clock_getres 247 #define __NR_clock_getres 247
#define __NR_clock_nanosleep 248 #define __NR_clock_nanosleep 248
#define __NR_swapcontext 249
#define __NR_tgkill 250
#define __NR_utimes 251
#define __NR_statfs64 252
#define __NR_fstatfs64 253
#define __NR_syscalls 249 #define __NR_syscalls 254
#define __NR(n) #n #define __NR(n) #n
#define __syscall_return(type) \ /* On powerpc a system call basically clobbers the same registers like a
return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \ * function call, with the exception of LR (which is needed for the
(type) __sc_ret * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
* an error return status).
#define __syscall_clobbers \ */
"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
#define _syscall0(type,name) \ #define __syscall_nr(nr, type, name, args...) \
type name(void) \
{ \
unsigned long __sc_ret, __sc_err; \ unsigned long __sc_ret, __sc_err; \
{ \ { \
register unsigned long __sc_0 __asm__ ("r0"); \ register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \ register unsigned long __sc_3 __asm__ ("r3"); \
register unsigned long __sc_4 __asm__ ("r4"); \
register unsigned long __sc_5 __asm__ ("r5"); \
register unsigned long __sc_6 __asm__ ("r6"); \
register unsigned long __sc_7 __asm__ ("r7"); \
\ \
__sc_0 = __NR_##name; \ __sc_loadargs_##nr(name, args); \
__asm__ __volatile__ \ __asm__ __volatile__ \
("sc \n\t" \ ("sc \n\t" \
"mfcr %1 " \ "mfcr %0 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \ : "=&r" (__sc_0), \
: "0" (__sc_3), "1" (__sc_0) \ "=&r" (__sc_3), "=&r" (__sc_4), \
: __syscall_clobbers); \ "=&r" (__sc_5), "=&r" (__sc_6), \
"=&r" (__sc_7) \
: __sc_asm_input_##nr \
: "cr0", "ctr", "memory", \
"r8", "r9", "r10","r11", "r12"); \
__sc_ret = __sc_3; \ __sc_ret = __sc_3; \
__sc_err = __sc_0; \ __sc_err = __sc_0; \
} \ } \
__syscall_return (type); \ if (__sc_err & 0x10000000) \
{ \
errno = __sc_ret; \
__sc_ret = -1; \
} \
return (type) __sc_ret
#define __sc_loadargs_0(name, dummy...) \
__sc_0 = __NR_##name
#define __sc_loadargs_1(name, arg1) \
__sc_loadargs_0(name); \
__sc_3 = (unsigned long) (arg1)
#define __sc_loadargs_2(name, arg1, arg2) \
__sc_loadargs_1(name, arg1); \
__sc_4 = (unsigned long) (arg2)
#define __sc_loadargs_3(name, arg1, arg2, arg3) \
__sc_loadargs_2(name, arg1, arg2); \
__sc_5 = (unsigned long) (arg3)
#define __sc_loadargs_4(name, arg1, arg2, arg3, arg4) \
__sc_loadargs_3(name, arg1, arg2, arg3); \
__sc_6 = (unsigned long) (arg4)
#define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5) \
__sc_loadargs_4(name, arg1, arg2, arg3, arg4); \
__sc_7 = (unsigned long) (arg5)
#define __sc_asm_input_0 "0" (__sc_0)
#define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
#define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
#define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
#define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
#define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
#define _syscall0(type,name) \
type name(void) \
{ \
__syscall_nr(0, type, name); \
} }
#define _syscall1(type,name,type1,arg1) \ #define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \ type name(type1 arg1) \
{ \ { \
unsigned long __sc_ret, __sc_err; \ __syscall_nr(1, type, name, arg1); \
{ \
register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \
\
__sc_3 = (unsigned long) (arg1); \
__sc_0 = __NR_##name; \
__asm__ __volatile__ \
("sc \n\t" \
"mfcr %1 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \
: "0" (__sc_3), "1" (__sc_0) \
: __syscall_clobbers); \
__sc_ret = __sc_3; \
__sc_err = __sc_0; \
} \
__syscall_return (type); \
} }
#define _syscall2(type,name,type1,arg1,type2,arg2) \ #define _syscall2(type,name,type1,arg1,type2,arg2) \
type name(type1 arg1, type2 arg2) \ type name(type1 arg1, type2 arg2) \
{ \ { \
unsigned long __sc_ret, __sc_err; \ __syscall_nr(2, type, name, arg1, arg2); \
{ \
register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \
register unsigned long __sc_4 __asm__ ("r4"); \
\
__sc_3 = (unsigned long) (arg1); \
__sc_4 = (unsigned long) (arg2); \
__sc_0 = __NR_##name; \
__asm__ __volatile__ \
("sc \n\t" \
"mfcr %1 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \
: "0" (__sc_3), "1" (__sc_0), \
"r" (__sc_4) \
: __syscall_clobbers); \
__sc_ret = __sc_3; \
__sc_err = __sc_0; \
} \
__syscall_return (type); \
} }
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1, type2 arg2, type3 arg3) \ type name(type1 arg1, type2 arg2, type3 arg3) \
{ \ { \
unsigned long __sc_ret, __sc_err; \ __syscall_nr(3, type, name, arg1, arg2, arg3); \
{ \
register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \
register unsigned long __sc_4 __asm__ ("r4"); \
register unsigned long __sc_5 __asm__ ("r5"); \
\
__sc_3 = (unsigned long) (arg1); \
__sc_4 = (unsigned long) (arg2); \
__sc_5 = (unsigned long) (arg3); \
__sc_0 = __NR_##name; \
__asm__ __volatile__ \
("sc \n\t" \
"mfcr %1 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \
: "0" (__sc_3), "1" (__sc_0), \
"r" (__sc_4), \
"r" (__sc_5) \
: __syscall_clobbers); \
__sc_ret = __sc_3; \
__sc_err = __sc_0; \
} \
__syscall_return (type); \
} }
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \ { \
unsigned long __sc_ret, __sc_err; \ __syscall_nr(4, type, name, arg1, arg2, arg3, arg4); \
{ \
register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \
register unsigned long __sc_4 __asm__ ("r4"); \
register unsigned long __sc_5 __asm__ ("r5"); \
register unsigned long __sc_6 __asm__ ("r6"); \
\
__sc_3 = (unsigned long) (arg1); \
__sc_4 = (unsigned long) (arg2); \
__sc_5 = (unsigned long) (arg3); \
__sc_6 = (unsigned long) (arg4); \
__sc_0 = __NR_##name; \
__asm__ __volatile__ \
("sc \n\t" \
"mfcr %1 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \
: "0" (__sc_3), "1" (__sc_0), \
"r" (__sc_4), \
"r" (__sc_5), \
"r" (__sc_6) \
: __syscall_clobbers); \
__sc_ret = __sc_3; \
__sc_err = __sc_0; \
} \
__syscall_return (type); \
} }
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
{ \ { \
unsigned long __sc_ret, __sc_err; \ __syscall_nr(5, type, name, arg1, arg2, arg3, arg4, arg5); \
{ \
register unsigned long __sc_0 __asm__ ("r0"); \
register unsigned long __sc_3 __asm__ ("r3"); \
register unsigned long __sc_4 __asm__ ("r4"); \
register unsigned long __sc_5 __asm__ ("r5"); \
register unsigned long __sc_6 __asm__ ("r6"); \
register unsigned long __sc_7 __asm__ ("r7"); \
\
__sc_3 = (unsigned long) (arg1); \
__sc_4 = (unsigned long) (arg2); \
__sc_5 = (unsigned long) (arg3); \
__sc_6 = (unsigned long) (arg4); \
__sc_7 = (unsigned long) (arg5); \
__sc_0 = __NR_##name; \
__asm__ __volatile__ \
("sc \n\t" \
"mfcr %1 " \
: "=&r" (__sc_3), "=&r" (__sc_0) \
: "0" (__sc_3), "1" (__sc_0), \
"r" (__sc_4), \
"r" (__sc_5), \
"r" (__sc_6), \
"r" (__sc_7) \
: __syscall_clobbers); \
__sc_ret = __sc_3; \
__sc_err = __sc_0; \
} \
__syscall_return (type); \
} }
#ifdef __KERNEL__ #ifdef __KERNEL__
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment