PERFORCE change 28160 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 4 20:23:45 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=28160
Change 28160 by peter at peter_overcee on 2003/04/04 20:22:57
argh. get exception.s to compile. Lotsa broken stuff here still,
its doing stack param passing instead of registers.
Affected files ...
.. //depot/projects/hammer/sys/x86_64/isa/icu_ipl.s#2 edit
.. //depot/projects/hammer/sys/x86_64/isa/icu_vector.s#4 edit
.. //depot/projects/hammer/sys/x86_64/isa/vector.s#5 edit
.. //depot/projects/hammer/sys/x86_64/x86_64/exception.s#11 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/isa/icu_ipl.s#2 (text+ko) ====
@@ -48,7 +48,7 @@
SUPERALIGN_TEXT
ENTRY(INTREN)
- movl 4(%esp), %eax
+ movq 8(%rsp), %rax # XXX wrong, use regparm
movl %eax, %ecx
notl %eax
andl %eax, imen
@@ -65,7 +65,7 @@
ret
ENTRY(INTRDIS)
- movl 4(%esp), %eax
+ movq 8(%rsp), %rax # XXX wrong, use regparm
movl %eax, %ecx
orl %eax, imen
movl imen, %eax
==== //depot/projects/hammer/sys/x86_64/isa/icu_vector.s#4 (text+ko) ====
@@ -20,33 +20,48 @@
* Macros for interrupt interrupt entry, call to handler, and exit.
*/
-#define FAST_INTR(irq_num, vec_name, icu, enable_icus) \
+#define FAST_INTR(irq_num, vec_name, enable_icus) \
.text ; \
SUPERALIGN_TEXT ; \
IDTVEC(vec_name) ; \
- pushl $0 ; /* dummy error code */ \
- pushl $0 ; /* dummy trap type */ \
- pushal ; \
- pushl %ds ; /* save our data and extra segments */ \
- pushl %es ; \
- pushl %fs ; \
+ pushq $0 ; /* dummy error code */ \
+ pushq $0 ; /* dummy trap type */ \
+ pushq %rax ; \
+ pushq %rcx ; \
+ pushq %rdx ; \
+ pushq %rbx ; \
+ pushq %rbp ; \
+ pushq %rsi ; \
+ pushq %rdi ; \
+ pushq %r8 ; \
+ pushq %r9 ; \
+ pushq %r10 ; \
+ pushq %r11 ; \
+ pushq %r12 ; \
+ pushq %r13 ; \
+ pushq %r14 ; \
+ pushq %r15 ; \
+ pushq %ds ; /* save our data and extra segments */ \
+ pushq %es ; \
+ pushq %fs ; \
+ pushq %gs ; \
mov $KDSEL,%ax ; \
mov %ax,%ds ; \
mov %ax,%es ; \
mov $KPSEL,%ax ; \
mov %ax,%fs ; \
- FAKE_MCOUNT((12+ACTUALLY_PUSHED)*4(%esp)) ; \
+ FAKE_MCOUNT((12+ACTUALLY_PUSHED)*4(%rsp)) ; \
call critical_enter ; \
- movl PCPU(CURTHREAD),%ebx ; \
- incl TD_INTR_NESTING_LEVEL(%ebx) ; \
- pushl intr_unit + (irq_num) * 4 ; \
+ movq PCPU(CURTHREAD),%rbx ; \
+ incl TD_INTR_NESTING_LEVEL(%rbx) ; \
+ pushq intr_unit + (irq_num) * 4 ; \
call *intr_handler + (irq_num) * 4 ; /* do the work ASAP */ \
enable_icus ; /* (re)enable ASAP (helps edge trigger?) */ \
- addl $4,%esp ; \
+ addq $8,%rsp ; \
incl cnt+V_INTR ; /* book-keeping can wait */ \
- movl intr_countp + (irq_num) * 4,%eax ; \
- incl (%eax) ; \
- decl TD_INTR_NESTING_LEVEL(%ebx) ; \
+ movq intr_countp + (irq_num) * 4,%rax ; \
+ incq (%rax) ; \
+ decl TD_INTR_NESTING_LEVEL(%rbx) ; \
call critical_exit ; \
MEXITCOUNT ; \
jmp doreti
@@ -60,16 +75,31 @@
* interrupt handler and don't run anything. We could just do an
* iret. FIXME.
*/
-#define INTR(irq_num, vec_name, icu, enable_icus, maybe_extra_ipending) \
+#define INTR(irq_num, vec_name, enable_icus, maybe_extra_ipending) \
.text ; \
SUPERALIGN_TEXT ; \
IDTVEC(vec_name) ; \
- pushl $0 ; /* dummy error code */ \
- pushl $0 ; /* dummy trap type */ \
- pushal ; \
- pushl %ds ; /* save our data and extra segments */ \
- pushl %es ; \
- pushl %fs ; \
+ pushq $0 ; /* dummy error code */ \
+ pushq $0 ; /* dummy trap type */ \
+ pushq %rax ; \
+ pushq %rcx ; \
+ pushq %rdx ; \
+ pushq %rbx ; \
+ pushq %rbp ; \
+ pushq %rsi ; \
+ pushq %rdi ; \
+ pushq %r8 ; \
+ pushq %r9 ; \
+ pushq %r10 ; \
+ pushq %r11 ; \
+ pushq %r12 ; \
+ pushq %r13 ; \
+ pushq %r14 ; \
+ pushq %r15 ; \
+ pushq %ds ; /* save our data and extra segments */ \
+ pushq %es ; \
+ pushq %fs ; \
+ pushq %gs ; \
mov $KDSEL,%ax ; /* load kernel ds, es and fs */ \
mov %ax,%ds ; \
mov %ax,%es ; \
@@ -79,15 +109,15 @@
movb imen + IRQ_BYTE(irq_num),%al ; \
orb $IRQ_BIT(irq_num),%al ; \
movb %al,imen + IRQ_BYTE(irq_num) ; \
- outb %al,$icu+ICU_IMR_OFFSET ; \
+ #XXXoutb %al,$icu+ICU_IMR_OFFSET ; \
enable_icus ; \
- movl PCPU(CURTHREAD),%ebx ; \
+ movq PCPU(CURTHREAD),%rbx ; \
incl TD_INTR_NESTING_LEVEL(%ebx) ; \
- FAKE_MCOUNT(13*4(%esp)) ; /* XXX late to avoid double count */ \
- pushl $irq_num; /* pass the IRQ */ \
+ FAKE_MCOUNT(13*4(%rsp)) ; /* XXX late to avoid double count */ \
+ pushq $irq_num; /* pass the IRQ */ \
call sched_ithd ; \
- addl $4, %esp ; /* discard the parameter */ \
- decl TD_INTR_NESTING_LEVEL(%ebx) ; \
+ addq $8, %rsp ; /* discard the parameter */ \
+ decl TD_INTR_NESTING_LEVEL(%rbx) ; \
MEXITCOUNT ; \
/* We could usually avoid the following jmp by inlining some of */ \
/* doreti, but it's probably better to use less cache. */ \
==== //depot/projects/hammer/sys/x86_64/isa/vector.s#5 (text+ko) ====
@@ -91,4 +91,4 @@
* loading segregs.
*/
-#include "i386/isa/icu_vector.s"
+#include "x86_64/isa/icu_vector.s"
==== //depot/projects/hammer/sys/x86_64/x86_64/exception.s#11 (text+ko) ====
@@ -74,29 +74,29 @@
*/
#define IDTVEC(name) ALIGN_TEXT; .globl __CONCAT(X,name); \
.type __CONCAT(X,name), at function; __CONCAT(X,name):
-#define TRAP(a) pushl $(a) ; jmp alltraps
+#define TRAP(a) pushq $(a) ; jmp alltraps
MCOUNT_LABEL(user)
MCOUNT_LABEL(btrap)
IDTVEC(div)
- pushl $0; TRAP(T_DIVIDE)
+ pushq $0; TRAP(T_DIVIDE)
IDTVEC(dbg)
- pushl $0; TRAP(T_TRCTRAP)
+ pushq $0; TRAP(T_TRCTRAP)
IDTVEC(nmi)
- pushl $0; TRAP(T_NMI)
+ pushq $0; TRAP(T_NMI)
IDTVEC(bpt)
- pushl $0; TRAP(T_BPTFLT)
+ pushq $0; TRAP(T_BPTFLT)
IDTVEC(ofl)
- pushl $0; TRAP(T_OFLOW)
+ pushq $0; TRAP(T_OFLOW)
IDTVEC(bnd)
- pushl $0; TRAP(T_BOUND)
+ pushq $0; TRAP(T_BOUND)
IDTVEC(ill)
- pushl $0; TRAP(T_PRIVINFLT)
+ pushq $0; TRAP(T_PRIVINFLT)
IDTVEC(dna)
- pushl $0; TRAP(T_DNA)
+ pushq $0; TRAP(T_DNA)
IDTVEC(fpusegm)
- pushl $0; TRAP(T_FPOPFLT)
+ pushq $0; TRAP(T_FPOPFLT)
IDTVEC(tss)
TRAP(T_TSSFLT)
IDTVEC(missing)
@@ -108,16 +108,16 @@
IDTVEC(page)
TRAP(T_PAGEFLT)
IDTVEC(mchk)
- pushl $0; TRAP(T_MCHK)
+ pushq $0; TRAP(T_MCHK)
IDTVEC(rsvd)
- pushl $0; TRAP(T_RESERVED)
+ pushq $0; TRAP(T_RESERVED)
IDTVEC(fpu)
- pushl $0; TRAP(T_ARITHTRAP)
+ pushq $0; TRAP(T_ARITHTRAP)
IDTVEC(align)
TRAP(T_ALIGNFLT)
IDTVEC(xmm)
- pushl $0; TRAP(T_XMMFLT)
+ pushq $0; TRAP(T_XMMFLT)
/*
* alltraps entry point. Interrupts are enabled if this was a trap
@@ -130,17 +130,31 @@
.globl alltraps
.type alltraps, at function
alltraps:
- pushal
- pushl %ds
- pushl %es
- pushl %fs
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq %ds
+ pushq %es
+ pushq %fs
alltraps_with_regs_pushed:
mov $KDSEL,%ax
mov %ax,%ds
mov %ax,%es
mov $KPSEL,%ax
mov %ax,%fs
- FAKE_MCOUNT(13*4(%esp))
+ FAKE_MCOUNT(13*4(%rsp))
calltrap:
FAKE_MCOUNT(btrap) /* init "from" btrap -> calltrap */
call trap
@@ -165,20 +179,35 @@
*/
SUPERALIGN_TEXT
IDTVEC(lcall_syscall)
- pushfl /* save eflags */
- popl 8(%esp) /* shuffle into tf_eflags */
- pushl $7 /* sizeof "lcall 7,0" */
- subl $4,%esp /* skip over tf_trapno */
- pushal
- pushl %ds
- pushl %es
- pushl %fs
+ pushfq /* save eflags */
+ popq 16(%rsp) /* shuffle into tf_eflags */
+ pushq $7 /* sizeof "lcall 7,0" */
+ subq $8,%rsp /* skip over tf_trapno */
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq %ds
+ pushq %ds
+ pushq %es
+ pushq %fs
mov $KDSEL,%ax /* switch to kernel segments */
mov %ax,%ds
mov %ax,%es
mov $KPSEL,%ax
mov %ax,%fs
- FAKE_MCOUNT(13*4(%esp))
+ FAKE_MCOUNT(13*4(%rsp))
call syscall
MEXITCOUNT
jmp doreti
@@ -192,31 +221,45 @@
*/
SUPERALIGN_TEXT
IDTVEC(int0x80_syscall)
- pushl $2 /* sizeof "int 0x80" */
- subl $4,%esp /* skip over tf_trapno */
- pushal
- pushl %ds
- pushl %es
- pushl %fs
+ pushq $2 /* sizeof "int 0x80" */
+ subq $8,%rsp /* skip over tf_trapno */
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq %ds
+ pushq %es
+ pushq %fs
mov $KDSEL,%ax /* switch to kernel segments */
mov %ax,%ds
mov %ax,%es
mov $KPSEL,%ax
mov %ax,%fs
- FAKE_MCOUNT(13*4(%esp))
+ FAKE_MCOUNT(13*4(%rsp))
call syscall
MEXITCOUNT
jmp doreti
ENTRY(fork_trampoline)
- pushl %esp /* trapframe pointer */
- pushl %ebx /* arg1 */
- pushl %esi /* function */
- movl PCPU(CURTHREAD),%ebx /* setup critnest */
- movl $1,TD_CRITNEST(%ebx)
+ pushq %rsp /* trapframe pointer */
+ pushq %rbx /* arg1 */
+ pushq %rsi /* function */
+ movq PCPU(CURTHREAD),%rbx /* setup critnest */
+ movl $1,TD_CRITNEST(%rbx)
sti /* enable interrupts */
call fork_exit
- addl $12,%esp
+ addq $24,%rsp
/* cut from syscall */
/*
@@ -250,7 +293,7 @@
/*
* Check if ASTs can be handled now.
*/
- testb $SEL_RPL_MASK,TF_CS(%esp) /* are we returning to user mode? */
+ testb $SEL_RPL_MASK,TF_CS(%rsp) /* are we returning to user mode? */
jz doreti_exit /* can't handle ASTs now if not */
doreti_ast:
@@ -260,13 +303,13 @@
* since we will be informed of any new ASTs by an IPI.
*/
cli
- movl PCPU(CURTHREAD),%eax
- testl $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%eax)
+ movq PCPU(CURTHREAD),%rax
+ testl $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax)
je doreti_exit
sti
- pushl %esp /* pass a pointer to the trapframe */
+ pushq %rsp /* pass a pointer to the trapframe */
call ast
- add $4,%esp
+ addq $8,%rsp
jmp doreti_ast
/*
@@ -281,15 +324,29 @@
.globl doreti_popl_fs
doreti_popl_fs:
- popl %fs
+ popq %fs
.globl doreti_popl_es
doreti_popl_es:
- popl %es
+ popq %es
.globl doreti_popl_ds
doreti_popl_ds:
- popl %ds
- popal
- addl $8,%esp
+ popq %ds
+ popq %r15
+ popq %r14
+ popq %r13
+ popq %r12
+ popq %r11
+ popq %r10
+ popq %r9
+ popq %r8
+ popq %rdi
+ popq %rsi
+ popq %rbp
+ popq %rbx
+ popq %rdx
+ popq %rcx
+ popq %rax
+ addq $16,%rsp
.globl doreti_iret
doreti_iret:
iret
@@ -304,19 +361,33 @@
ALIGN_TEXT
.globl doreti_iret_fault
doreti_iret_fault:
- subl $8,%esp
- pushal
- pushl %ds
+ subq $16,%rsp
+ pushq %rax
+ pushq %rcx
+ pushq %rdx
+ pushq %rbx
+ pushq %rbp
+ pushq %rsi
+ pushq %rdi
+ pushq %r8
+ pushq %r9
+ pushq %r10
+ pushq %r11
+ pushq %r12
+ pushq %r13
+ pushq %r14
+ pushq %r15
+ pushq %ds
.globl doreti_popl_ds_fault
doreti_popl_ds_fault:
- pushl %es
+ pushq %es
.globl doreti_popl_es_fault
doreti_popl_es_fault:
- pushl %fs
+ pushq %fs
.globl doreti_popl_fs_fault
doreti_popl_fs_fault:
- movl $0,TF_ERR(%esp) /* XXX should be the error code */
- movl $T_PROTFLT,TF_TRAPNO(%esp)
+ movq $0,TF_ERR(%rsp) /* XXX should be the error code */
+ movq $T_PROTFLT,TF_TRAPNO(%rsp)
jmp alltraps_with_regs_pushed
#include "x86_64/isa/icu_ipl.s"
More information about the p4-projects
mailing list