Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1077 → Rev 1078

/kernel/trunk/arch/ia64/include/faddr.h
31,8 → 31,6
 
#include <arch/types.h>
 
static __address FADDR(void (* fptr)(void));
 
/**
*
* Calculate absolute address of function
41,18 → 39,9
* @param fptr Function pointer.
*
*/
inline __address FADDR(void (* fptr)(void)) {
static inline __address FADDR(void (* fptr)()) {
__address faddr;
 
/*Deprecated assembler version*/
/*
__asm__(
"ld8 %0 = [%1]\n\t"
: "=r" (faddr)
: "r" (fptr)
);
*/
 
faddr = *((__address *)(fptr));;
return faddr;
}
/kernel/trunk/arch/ia64/include/asm.h
258,6 → 258,6
extern void cpu_sleep(void);
extern void asm_delay_loop(__u32 t);
 
extern void switch_to_userspace(__address entry, __address sp, __address bsp, __u64 ipsr, __u64 rsc);
extern void switch_to_userspace(__address entry, __address sp, __address bsp, __address uspace_uarg, __u64 ipsr, __u64 rsc);
 
#endif
/kernel/trunk/arch/ia64/src/asm.S
54,17 → 54,18
* @param in0 Userspace entry point address.
* @param in1 Userspace stack pointer address.
* @param in2 Userspace register stack pointer address.
* @param in3 Value to be stored in IPSR.
* @param in4 Value to be stored in RSC.
* @param in3 Userspace address of thread uspace_arg_t structure.
* @param in4 Value to be stored in IPSR.
* @param in5 Value to be stored in RSC.
*/
.global switch_to_userspace
switch_to_userspace:
alloc loc0 = ar.pfs, 5, 3, 0, 0
alloc loc0 = ar.pfs, 6, 3, 0, 0
rsm (PSR_IC_MASK | PSR_I_MASK) /* disable interruption collection and interrupts */
srlz.d ;;
srlz.i ;;
mov cr.ipsr = in3
mov cr.ipsr = in4
mov cr.iip = in0
mov r12 = in1
 
84,6 → 85,8
flushrs ;;
mov ar.bspstore = in2 ;;
mov ar.rsc = in4 ;;
mov ar.rsc = in5 ;;
mov r8 = in3
rfi ;;
/kernel/trunk/arch/ia64/src/ia64.c
41,7 → 41,7
#include <config.h>
#include <userspace.h>
#include <console/console.h>
#include <proc/thread.h>
#include <proc/uarg.h>
 
void arch_pre_mm_init(void)
{
73,7 → 73,7
}
 
/** Enter userspace and never return. */
void userspace(uspace_arg_t *uarg)
void userspace(uspace_arg_t *kernel_uarg)
{
psr_t psr;
rsc_t rsc;
91,7 → 91,11
rsc.pl = PL_USER;
rsc.mode = 3; /* eager mode */
 
switch_to_userspace(uarg->uspace_entry, uarg->uspace_stack+PAGE_SIZE-ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT), uarg->uspace_stack, psr.value, rsc.value);
switch_to_userspace((__address) kernel_uarg->uspace_entry,
((__address) kernel_uarg->uspace_stack)+PAGE_SIZE-ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT),
(__address) kernel_uarg->uspace_stack,
(__address) kernel_uarg->uspace_uarg,
psr.value, rsc.value);
 
while (1) {
;