Index: sys/arm/linux/linux.h =================================================================== --- sys/arm/linux/linux.h +++ sys/arm/linux/linux.h @@ -575,72 +575,6 @@ unsigned long a, b; }; - -#define LINUX_LOWERWORD 0x0000ffff - -/* - * Macros which does the same thing as those in Linux include/asm-um/ldt-i386.h. - * These convert Linux user space descriptor to machine one. - */ -#define LINUX_LDT_entry_a(info) \ - ((((info)->base_addr & LINUX_LOWERWORD) << 16) | \ - ((info)->limit & LINUX_LOWERWORD)) - -#define LINUX_ENTRY_B_READ_EXEC_ONLY 9 -#define LINUX_ENTRY_B_CONTENTS 10 -#define LINUX_ENTRY_B_SEG_NOT_PRESENT 15 -#define LINUX_ENTRY_B_BASE_ADDR 16 -#define LINUX_ENTRY_B_USEABLE 20 -#define LINUX_ENTRY_B_SEG32BIT 22 -#define LINUX_ENTRY_B_LIMIT 23 - -#define LINUX_LDT_entry_b(info) \ - (((info)->base_addr & 0xff000000) | \ - ((info)->limit & 0xf0000) | \ - ((info)->contents << LINUX_ENTRY_B_CONTENTS) | \ - (((info)->seg_not_present == 0) << LINUX_ENTRY_B_SEG_NOT_PRESENT) | \ - (((info)->base_addr & 0x00ff0000) >> LINUX_ENTRY_B_BASE_ADDR) | \ - (((info)->read_exec_only == 0) << LINUX_ENTRY_B_READ_EXEC_ONLY) | \ - ((info)->seg_32bit << LINUX_ENTRY_B_SEG32BIT) | \ - ((info)->useable << LINUX_ENTRY_B_USEABLE) | \ - ((info)->limit_in_pages << LINUX_ENTRY_B_LIMIT) | 0x7000) - -#define LINUX_LDT_empty(info) \ - ((info)->base_addr == 0 && \ - (info)->limit == 0 && \ - (info)->contents == 0 && \ - (info)->seg_not_present == 1 && \ - (info)->read_exec_only == 1 && \ - (info)->seg_32bit == 0 && \ - (info)->limit_in_pages == 0 && \ - (info)->useable == 0) - -/* - * Macros for converting segments. - * They do the same as those in arch/i386/kernel/process.c in Linux. - */ -#define LINUX_GET_BASE(desc) \ - ((((desc)->a >> 16) & LINUX_LOWERWORD) | \ - (((desc)->b << 16) & 0x00ff0000) | \ - ((desc)->b & 0xff000000)) - -#define LINUX_GET_LIMIT(desc) \ - (((desc)->a & LINUX_LOWERWORD) | \ - ((desc)->b & 0xf0000)) - -#define LINUX_GET_32BIT(desc) \ - (((desc)->b >> LINUX_ENTRY_B_SEG32BIT) & 1) -#define LINUX_GET_CONTENTS(desc) \ - (((desc)->b >> LINUX_ENTRY_B_CONTENTS) & 3) -#define LINUX_GET_WRITABLE(desc) \ - (((desc)->b >> LINUX_ENTRY_B_READ_EXEC_ONLY) & 1) -#define LINUX_GET_LIMIT_PAGES(desc) \ - (((desc)->b >> LINUX_ENTRY_B_LIMIT) & 1) -#define LINUX_GET_PRESENT(desc) \ - (((desc)->b >> LINUX_ENTRY_B_SEG_NOT_PRESENT) & 1) -#define LINUX_GET_USEABLE(desc) \ - (((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1) - #define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r)) /* robust futexes */ Index: sys/arm/linux/linux_machdep.c =================================================================== --- sys/arm/linux/linux_machdep.c +++ sys/arm/linux/linux_machdep.c @@ -51,10 +51,10 @@ #include #include #include +#include #include #include -#include #include #include @@ -75,18 +75,6 @@ extern struct sysentvec elf32_freebsd_sysvec; /* defined in i386/i386/elf_machdep.c */ -struct l_descriptor { - l_uint entry_number; - l_ulong base_addr; - l_uint limit; - l_uint seg_32bit:1; - l_uint contents:2; - l_uint read_exec_only:1; - l_uint limit_in_pages:1; - l_uint seg_not_present:1; - l_uint useable:1; -}; - struct l_old_select_argv { l_int nfds; l_fd_set *readfds; @@ -213,7 +201,6 @@ a.shmid = args->arg1; a.shmaddr = args->ptr; a.shmflg = args->arg2; - a.raddr = (l_ulong *)args->arg3; return (linux_shmat(td, &a)); } case LINUX_SHMDT: { @@ -272,10 +259,8 @@ int linux_set_cloned_tls(struct thread *td, void *desc) { - struct segment_descriptor sd; struct l_user_desc info; int idx, error; - int a[2]; error = copyin(desc, &info, sizeof(struct l_user_desc)); if (error) { @@ -301,25 +286,10 @@ printf(LMSG("copyout failed!")); } - a[0] = LINUX_LDT_entry_a(&info); - a[1] = LINUX_LDT_entry_b(&info); - - memcpy(&sd, &a, sizeof(a)); #ifdef DEBUG if (ldebug(clone)) - printf("Segment created in clone with " - "CLONE_SETTLS: lobase: %x, hibase: %x, " - "lolimit: %x, hilimit: %x, type: %i, " - "dpl: %i, p: %i, xx: %i, def32: %i, " - "gran: %i\n", sd.sd_lobase, sd.sd_hibase, - sd.sd_lolimit, sd.sd_hilimit, sd.sd_type, - sd.sd_dpl, sd.sd_p, sd.sd_xx, - sd.sd_def32, sd.sd_gran); + printf("Segment created in clone\n"); #endif - - /* set %gs */ - td->td_pcb->pcb_gsd = sd; - td->td_pcb->pcb_gs = GSEL(GUGS_SEL, SEL_UPL); } return (error); @@ -330,13 +300,13 @@ { if (stack) - td->td_frame->tf_esp = stack; + td->td_frame->tf_r13 = stack; /* * The newly created Linux thread returns * to the user space by the same path that a parent do. */ - td->td_frame->tf_eax = 0; + td->td_frame->tf_r0 = 0; return (0); } @@ -774,19 +744,18 @@ if (error) return (error); - ss.ss_sp = lss.ss_sp; - ss.ss_size = lss.ss_size; + ss.ss_sp = (char*)lss.ss_sp; + ss.ss_size = (__size_t)lss.ss_size; ss.ss_flags = linux_to_bsd_sigaltstack(lss.ss_flags); } error = kern_sigaltstack(td, (uap->uss != NULL) ? &ss : NULL, (uap->uoss != NULL) ? &oss : NULL); if (!error && uap->uoss != NULL) { lss.ss_sp = oss.ss_sp; - lss.ss_size = oss.ss_size; + lss.ss_size = (l_size_t )oss.ss_size; lss.ss_flags = bsd_to_linux_sigaltstack(oss.ss_flags); error = copyout(&lss, uap->uoss, sizeof(l_stack_t)); } - return (error); }