Subversion Repositories HelenOS-historic

Rev

Rev 1278 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1278 Rev 1288
Line 58... Line 58...
58
 
58
 
59
panic_printf:
59
panic_printf:
60
	movq $halt, (%rsp)
60
	movq $halt, (%rsp)
61
	jmp printf
61
	jmp printf
62
 
62
 
63
.global memcpy
-
 
64
memcpy:
-
 
65
	jmp _memcpy
-
 
66
	
-
 
67
.global cpuid
63
.global cpuid
68
.global has_cpuid
64
.global has_cpuid
69
.global rdtsc
65
.global rdtsc
70
.global read_efer_flag
66
.global read_efer_flag
71
.global set_efer_flag
67
.global set_efer_flag
-
 
68
.global memcpy
-
 
69
.global memcpy_from_uspace
-
 
70
.global memcpy_to_uspace
-
 
71
.global memcpy_from_uspace_failover_address
-
 
72
.global memcpy_to_uspace_failover_address
-
 
73
 
-
 
74
#define MEMCPY_DST	%rdi
-
 
75
#define MEMCPY_SRC	%rsi
-
 
76
#define MEMCPY_SIZE	%rdx
-
 
77
 
-
 
78
/**
-
 
79
 * Copy memory from/to userspace.
-
 
80
 *
-
 
81
 * This is almost conventional memcpy().
-
 
82
 * The difference is that there is a failover part
-
 
83
 * to where control is returned from a page fault if
-
 
84
 * the page fault occurs during copy_from_uspace()
-
 
85
 * or copy_to_uspace().
-
 
86
 *
-
 
87
 * @param MEMCPY_DST	Destination address.
-
 
88
 * @param MEMCPY_SRC	Source address.
-
 
89
 * @param MEMCPY_SIZE	Number of bytes to copy.
-
 
90
 *
-
 
91
 * @retrun MEMCPY_SRC on success, 0 on failure.
-
 
92
 */
-
 
93
memcpy:
-
 
94
memcpy_from_uspace:
-
 
95
memcpy_to_uspace:
-
 
96
	movq MEMCPY_SRC, %rax
-
 
97
 
-
 
98
	movq MEMCPY_SIZE, %rcx
-
 
99
	shrq $3, %rcx			/* size / 8 */
-
 
100
	
-
 
101
	rep movsq			/* copy as much as possible word by word */
-
 
102
 
-
 
103
	movq MEMCPY_SIZE, %rcx
-
 
104
	andq $7, %rcx			/* size % 8 */
-
 
105
	jz 0f
72
	
106
	
-
 
107
	rep movsb			/* copy the rest byte by byte */
-
 
108
	
-
 
109
0:
-
 
110
	ret				/* return MEMCPY_SRC, success */
-
 
111
 
-
 
112
memcpy_from_uspace_failover_address:
-
 
113
memcpy_to_uspace_failover_address:
-
 
114
	xorq %rax, %rax			/* return 0, failure */
-
 
115
	ret
-
 
116
 
73
## Determine CPUID support
117
## Determine CPUID support
74
#
118
#
75
# Return 0 in EAX if CPUID is not support, 1 if supported.
119
# Return 0 in EAX if CPUID is not support, 1 if supported.
76
#
120
#
77
has_cpuid:
121
has_cpuid: