Changeset 738ad2e in mainline
- Timestamp:
- 2006-05-02T18:19:43Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 281224a
- Parents:
- e34a141
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/asm_utils.S
re34a141 r738ad2e 245 245 movq %r9, %rcx # Exchange last parameter as a third 246 246 247 cmp $2, %r8 # Is this SYS_INT_CONTROL248 je sys_int_ctrl249 250 247 call syscall_handler 251 sys_end:252 248 cli # We will be touching stack pointer 253 249 … … 256 252 movq 0(%rsp), %rsp 257 253 sysretq 258 259 sys_int_ctrl: 260 mov %rsp, %rsi # Pointer to flags 261 call ddi_int_control 262 jmp sys_end 263 254 264 255 265 256 .data -
arch/amd64/src/ddi/ddi.c
re34a141 r738ad2e 101 101 } 102 102 103 /** Enable/disable interrupts form syscall104 *105 * @param enable If non-zero, interrupts are enabled, otherwise disabled106 * @param flags RFLAGS register107 */108 __native ddi_int_control_arch(__native enable, __native *flags)109 {110 if (enable)111 *flags |= RFLAGS_IF;112 else113 *flags &= ~RFLAGS_IF;114 return 0;115 }116 117 103 /** Install I/O Permission bitmap. 118 104 * -
arch/ia32/src/asm.S
re34a141 r738ad2e 87 87 # and call exc_dispatch(). 88 88 # 89 #define INTERRUPT_ALIGN 12889 #define INTERRUPT_ALIGN 64 90 90 .macro handler i n 91 91 … … 109 109 110 110 sti 111 cmp $2, %edi # Is this SYS_INT_CONTROL?112 je sys_int_ctrl113 111 114 112 call syscall_handler # syscall_handler(ax,cx,dx,si,di) 115 sysc_end:116 113 cli 117 114 addl $20, %esp # clean-up of parameters … … 124 121 CLEAR_NT_FLAG 125 122 iret 126 sys_int_ctrl: # Interrupt control127 mov %esp, %eax128 add $44, %eax129 mov %eax, 4(%esp) # Pointer to flags - 2nd argument130 call ddi_int_control131 jmp sysc_end132 123 .else 133 124 /* -
arch/ia32/src/ddi/ddi.c
re34a141 r738ad2e 102 102 } 103 103 104 /** Enable/disable interrupts for syscall105 *106 * @param enable If non-zero, interrupts are enabled, otherwise disabled107 * @param flags EFLAGS flags register108 */109 __native ddi_int_control_arch(__native enable, __native *flags)110 {111 if (enable)112 *flags |= EFLAGS_IF;113 else114 *flags &= ~EFLAGS_IF;115 return 0;116 }117 118 104 /** Install I/O Permission bitmap. 119 105 * -
arch/mips32/src/ddi/ddi.c
re34a141 r738ad2e 49 49 return 0; 50 50 } 51 52 /** Enable/disable interrupts for syscall53 *54 * @param enable If non-zero, interrupts are enabled, otherwise disabled55 * @param flags CP0 status register56 */57 __native ddi_int_control_arch(__native enable, __native *flags)58 {59 if (enable)60 *flags |= cp0_status_ie_enabled_bit;61 else62 *flags &= ~cp0_status_ie_enabled_bit;63 return 0;64 } -
arch/mips32/src/start.S
re34a141 r738ad2e 254 254 mtc0 $t0, $status 255 255 256 li $t4, 2 # SYS_INT_CONTROL257 beq $t4, $v0, sysc_int_control258 nop259 260 256 # CALL Syscall handler 261 257 jal syscall_handler 262 258 sw $v0, SS_ARG4($sp) # save v0 - arg4 to stack 263 259 264 sysc_exit:265 260 # restore status 266 261 mfc0 $t0, $status … … 282 277 283 278 eret 284 285 sysc_int_control: 286 jal ddi_int_control 287 addi $a1, $sp, SS_STATUS 288 289 j sysc_exit 290 nop 291 279 292 280 tlb_refill_handler: 293 281 KERNEL_STACK_TO_K0 -
generic/include/ddi/ddi.h
re34a141 r738ad2e 40 40 * Interface to be implemented by all architectures. 41 41 */ 42 extern __native ddi_int_control_arch(__native enable, __native *flags);43 extern __native ddi_int_control(__native enable, __native *flags);44 42 extern int ddi_iospace_enable_arch(task_t *task, __address ioaddr, size_t size); 45 43 -
generic/include/security/cap.h
re34a141 r738ad2e 64 64 65 65 /** 66 * CAP_ INT_CONTROL allows its holder to disable interrupts66 * CAP_PREEMPT_CONTROL allows its holder to disable interrupts 67 67 */ 68 #define CAP_ INT_CONTROL (1<<3)68 #define CAP_PREEMPT_CONTROL (1<<3) 69 69 70 70 typedef __u32 cap_t; -
generic/include/syscall/syscall.h
re34a141 r738ad2e 33 33 SYS_IO = 0, 34 34 SYS_TLS_SET = 1, /* Hardcoded in AMD64,IA32 uspace - psthread.S */ 35 SYS_ INT_CONTROL = 2, /* Hardcoded in all SYSCALL handlers */35 SYS_PREEMPT_CONTROL, 36 36 SYS_THREAD_CREATE, 37 37 SYS_THREAD_EXIT, -
generic/src/ddi/ddi.c
re34a141 r738ad2e 204 204 return (__native) ddi_iospace_enable((task_id_t) arg.task_id, (__address) arg.ioaddr, (size_t) arg.size); 205 205 } 206 207 __native ddi_int_control(__native enable, __native *flags)208 {209 if (! cap_get(TASK) & CAP_INT_CONTROL)210 return EPERM;211 return ddi_int_control_arch(enable, flags);212 } -
generic/src/syscall/syscall.c
re34a141 r738ad2e 57 57 } 58 58 59 static __native sys_ int_control(int enable)59 static __native sys_preempt_control(int enable) 60 60 { 61 panic("Not implemented."); 61 if (! cap_get(TASK) & CAP_PREEMPT_CONTROL) 62 return EPERM; 63 if (enable) 64 preemption_enable(); 65 else 66 preemption_disable(); 67 return 0; 62 68 } 63 69 … … 75 81 sys_io, 76 82 sys_tls_set, 77 sys_ int_control,83 sys_preempt_control, 78 84 79 85 /* Thread and task related syscalls. */
Note:
See TracChangeset
for help on using the changeset viewer.