Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/amd64/amd64 Clarify:
details: https://anonhg.NetBSD.org/src/rev/c067a56a49d5
branches: trunk
changeset: 341790:c067a56a49d5
user: maxv <maxv%NetBSD.org@localhost>
date: Sun Nov 22 10:18:59 2015 +0000
description:
Clarify:
- add some comments
- rename some jumps
- KNF
No functional change.
diffstat:
sys/arch/amd64/amd64/locore.S | 129 ++++++++++++++++++++++++-----------------
1 files changed, 76 insertions(+), 53 deletions(-)
diffs (268 lines):
diff -r 94632d63f58d -r c067a56a49d5 sys/arch/amd64/amd64/locore.S
--- a/sys/arch/amd64/amd64/locore.S Sun Nov 22 10:18:14 2015 +0000
+++ b/sys/arch/amd64/amd64/locore.S Sun Nov 22 10:18:59 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.80 2015/11/20 11:58:00 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.81 2015/11/22 10:18:59 maxv Exp $ */
/*
* Copyright-o-rama!
@@ -357,70 +357,94 @@
ENTRY(start)
#ifndef XEN
.code32
- movw $0x1234,0x472 # warm boot
+
+ /* Warm boot */
+ movw $0x1234,0x472
+
/*
- * Load parameters from stack
- * (howto, [bootdev], bootinfo, esym, basemem, extmem).
+ * Load parameters from the stack (32 bits):
+ * boothowto, [bootdev], bootinfo, esym, basemem, extmem
+ * We are not interested in 'bootdev'.
*/
+
+ /* Load 'boothowto' */
movl 4(%esp),%eax
movl %eax,RELOC(boothowto)
+
+ /* Load 'bootinfo' */
movl 12(%esp),%eax
- testl %eax, %eax
- jz 1f
- movl (%eax), %ebx /* number of entries */
+ testl %eax,%eax /* bootinfo = NULL? */
+ jz bootinfo_finished
+
+ movl (%eax),%ebx /* number of entries */
movl $RELOC(bootinfo),%ebp
- movl %ebp, %edx
+ movl %ebp,%edx
addl $BOOTINFO_MAXSIZE,%ebp
- movl %ebx, (%edx)
- addl $4, %edx
-2:
- testl %ebx, %ebx
- jz 1f
- addl $4, %eax
- movl (%eax), %ecx /* address of entry */
+ movl %ebx,(%edx)
+ addl $4,%edx
+
+bootinfo_entryloop:
+ testl %ebx,%ebx /* no remaining entries? */
+ jz bootinfo_finished
+
+ addl $4,%eax
+ movl (%eax),%ecx /* address of entry */
pushl %edi
pushl %esi
pushl %eax
- movl (%ecx),%eax /* len */
+ movl (%ecx),%eax /* size of entry */
movl %edx,%edi
- addl (%ecx), %edx /* update dest pointer */
- cmpl %ebp, %edx
- jg 2f
+ addl (%ecx),%edx /* update dest pointer */
+ cmpl %ebp,%edx /* beyond bootinfo+BOOTINFO_MAXSIZE? */
+ jg bootinfo_overflow
+
movl %ecx,%esi
movl %eax,%ecx
+
/*
- * If any modules were loaded, record where they
- * end. We'll need to skip over them.
+ * If any modules were loaded, record where they end. We'll need to
+ * skip over them.
*/
- cmpl $BTINFO_MODULELIST, 4(%esi)
+ cmpl $BTINFO_MODULELIST,4(%esi)
jne 0f
+
pushl 12(%esi) /* endpa */
popl RELOC(eblob)
- addl $KERNBASE_LO, RELOC(eblob)
- adcl $KERNBASE_HI, RELOC(eblob)+4
+ addl $KERNBASE_LO,RELOC(eblob)
+ adcl $KERNBASE_HI,RELOC(eblob)+4
+
0:
rep
- movsb
+ movsb /* copy esi -> edi */
popl %eax
popl %esi
popl %edi
- subl $1, %ebx
- jmp 2b
-2: /* cleanup for overflow case */
+ subl $1,%ebx /* decrement the # of entries */
+ jmp bootinfo_entryloop
+
+bootinfo_overflow:
+ /*
+ * Cleanup for overflow case. Pop the registers, and correct the number
+ * of entries.
+ */
popl %eax
popl %esi
popl %edi
movl $RELOC(bootinfo),%ebp
- movl %ebp, %edx
- subl %ebx, (%edx) /* correct number of entries */
-1:
+ movl %ebp,%edx
+ subl %ebx,(%edx) /* correct the number of entries */
+bootinfo_finished:
+ /* Load 'esym' */
movl 16(%esp),%eax
- testl %eax,%eax
+ testl %eax,%eax /* esym = NULL? */
jz 1f
+
addl $KERNBASE_LO,%eax
-1: movl $RELOC(esym),%ebp
+
+1:
+ movl $RELOC(esym),%ebp
movl %eax,(%ebp)
movl $KERNBASE_HI,4(%ebp)
@@ -428,8 +452,10 @@
movl (%ebp),%eax
testl %eax,%eax
jnz 1f
+
movl 20(%esp),%eax
movl %eax,(%ebp)
+
1:
movl $RELOC(biosbasemem),%ebp
movl (%ebp),%eax
@@ -470,7 +496,7 @@
* Virtual address space of kernel:
*
* text | data | bss | [syms] | page dir | proc0 kstack | L1 ptp | L2 ptp | L3
- * 0 1 2 3
+ * 0 1 2 3
*/
#if L2_SLOT_KERNBASE > 0
@@ -485,7 +511,6 @@
#define TABLE_L3_ENTRIES NKL3_KIMG_ENTRIES
#endif
-
#define PROC0_PML4_OFF 0
#define PROC0_STK_OFF (PROC0_PML4_OFF + PAGE_SIZE)
#define PROC0_PTP3_OFF (PROC0_STK_OFF + UPAGES * PAGE_SIZE)
@@ -507,7 +532,7 @@
#define fillkpt \
1: movl %eax,(%ebx) ; /* store phys addr */ \
movl $0,(PDE_SIZE-4)(%ebx) ; /* upper 32 bits 0 */ \
- addl $PDE_SIZE,%ebx ; /* next pte/pde */ \
+ addl $PDE_SIZE,%ebx ; /* next PTE/PDE */ \
addl $PAGE_SIZE,%eax ; /* next phys page */ \
loop 1b ;
@@ -529,12 +554,13 @@
subl $KERNBASE_LO,%eax /* XXX */
movl %eax,%edi
1:
+
/* Compute sizes */
movl %edi,%esi
- addl $PGOFSET,%esi # page align up
+ addl $PGOFSET,%esi /* page align up */
andl $~PGOFSET,%esi
+ movl %esi,%edi
- movl %esi,%edi
xorl %eax,%eax
cld
movl $TABLESIZE,%ecx
@@ -542,11 +568,17 @@
rep
stosl
- leal (PROC0_PTP1_OFF)(%esi), %ebx
-
/*
* Build initial page tables.
*/
+ leal (PROC0_PTP1_OFF)(%esi), %ebx
+
+ /* Skip the first MB */
+ movl $(KERNTEXTOFF_LO - KERNBASE_LO),%eax
+ movl %eax,%ecx
+ shrl $(PGSHIFT-3),%ecx /* ((n >> PGSHIFT) << 3) for # PDEs */
+ addl %ecx,%ebx
+
/*
* Compute &__data_start - KERNBASE. This can't be > 4G,
* or we can't deal with it anyway, since we can't load it in
@@ -555,14 +587,6 @@
movl $RELOC(__data_start),%edx
andl $~PGOFSET,%edx
- /*
- * Skip the first MB.
- */
- movl $(KERNTEXTOFF_LO - KERNBASE_LO),%eax
- movl %eax,%ecx
- shrl $(PGSHIFT-3),%ecx /* ((n >> PGSHIFT) << 3) for # PDEs */
- addl %ecx,%ebx
-
/* Map the kernel text read-only. */
movl %edx,%ecx
subl %eax,%ecx
@@ -589,7 +613,7 @@
/* Set up level 2 pages */
leal (PROC0_PTP2_OFF)(%esi),%ebx
leal (PROC0_PTP1_OFF)(%esi),%eax
- orl $(PG_V|PG_KW), %eax
+ orl $(PG_V|PG_KW),%eax
movl $(NKL2_KIMG_ENTRIES+1),%ecx
fillkpt
@@ -597,7 +621,7 @@
/* If needed, set up level 2 entries for actual kernel mapping */
leal (PROC0_PTP2_OFF+ L2_SLOT_KERNBASE*8)(%esi),%ebx
leal (PROC0_PTP1_OFF)(%esi),%eax
- orl $(PG_V|PG_KW), %eax
+ orl $(PG_V|PG_KW),%eax
movl $(NKL2_KIMG_ENTRIES+1),%ecx
fillkpt
#endif
@@ -605,7 +629,7 @@
/* Set up level 3 pages */
leal (PROC0_PTP3_OFF)(%esi),%ebx
leal (PROC0_PTP2_OFF)(%esi),%eax
- orl $(PG_V|PG_KW), %eax
+ orl $(PG_V|PG_KW),%eax
movl $NKL3_KIMG_ENTRIES,%ecx
fillkpt
@@ -621,7 +645,7 @@
/* Set up top level entries for identity mapping */
leal (PROC0_PML4_OFF)(%esi),%ebx
leal (PROC0_PTP3_OFF)(%esi),%eax
- orl $(PG_V|PG_KW), %eax
+ orl $(PG_V|PG_KW),%eax
movl $NKL4_KIMG_ENTRIES,%ecx
fillkpt
@@ -639,7 +663,6 @@
movl %eax,(%ebx)
movl $0, 4(%ebx)
-
/* Save phys. addr of PTD, for libkvm. */
movl $RELOC(PDPpaddr),%ebp
movl %esi,(%ebp)
Home |
Main Index |
Thread Index |
Old Index