kernel: mon_return cleanup
cleanup of boot monitor related code.
This commit is contained in:
parent
c662389d25
commit
b41df2eb0d
10 changed files with 8 additions and 213 deletions
|
@ -6,7 +6,6 @@ HERE=${.CURDIR}/arch/${ARCH}
|
||||||
.PATH: ${HERE}
|
.PATH: ${HERE}
|
||||||
SRCS+= arch_do_vmctl.c \
|
SRCS+= arch_do_vmctl.c \
|
||||||
arch_clock.c \
|
arch_clock.c \
|
||||||
do_int86.c \
|
|
||||||
do_iopenable.c \
|
do_iopenable.c \
|
||||||
do_readbios.c \
|
do_readbios.c \
|
||||||
do_sdevio.c \
|
do_sdevio.c \
|
||||||
|
|
|
@ -57,11 +57,6 @@ static void ser_dump_proc_cpu(void);
|
||||||
static void ser_init(void);
|
static void ser_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__dead void arch_monitor(void)
|
|
||||||
{
|
|
||||||
monitor();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define KBCMDP 4 /* kbd controller port (O) */
|
#define KBCMDP 4 /* kbd controller port (O) */
|
||||||
#define KBC_PULSE0 0xfe /* pulse output bit 0 */
|
#define KBC_PULSE0 0xfe /* pulse output bit 0 */
|
||||||
#define IO_KBD 0x060 /* 8042 Keyboard */
|
#define IO_KBD 0x060 /* 8042 Keyboard */
|
||||||
|
@ -138,7 +133,6 @@ int cpu_has_tsc;
|
||||||
|
|
||||||
__dead void arch_shutdown(int how)
|
__dead void arch_shutdown(int how)
|
||||||
{
|
{
|
||||||
u16_t magic;
|
|
||||||
vm_stop();
|
vm_stop();
|
||||||
|
|
||||||
/* Mask all interrupts, including the clock. */
|
/* Mask all interrupts, including the clock. */
|
||||||
|
@ -171,44 +165,10 @@ __dead void arch_shutdown(int how)
|
||||||
|
|
||||||
#if USE_BOOTPARAM
|
#if USE_BOOTPARAM
|
||||||
if (how == RBT_DEFAULT) {
|
if (how == RBT_DEFAULT) {
|
||||||
how = mon_return ? RBT_HALT : RBT_RESET;
|
how = RBT_RESET;
|
||||||
}
|
|
||||||
|
|
||||||
if(how != RBT_RESET) {
|
|
||||||
/* return to boot monitor */
|
|
||||||
|
|
||||||
outb( INT_CTLMASK, 0);
|
|
||||||
outb( INT2_CTLMASK, 0);
|
|
||||||
|
|
||||||
/* Return to the boot monitor. Set
|
|
||||||
* the program if not already done.
|
|
||||||
*/
|
|
||||||
if (how != RBT_MONITOR)
|
|
||||||
arch_set_params("", 1);
|
|
||||||
|
|
||||||
if (mon_return)
|
|
||||||
arch_monitor();
|
|
||||||
|
|
||||||
/* monitor command with no monitor: reset or poweroff
|
|
||||||
* depending on the parameters
|
|
||||||
*/
|
|
||||||
if (how == RBT_MONITOR) {
|
|
||||||
how = RBT_RESET;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (how) {
|
switch (how) {
|
||||||
case RBT_REBOOT:
|
|
||||||
case RBT_RESET:
|
|
||||||
/* Reset the system by forcing a processor shutdown.
|
|
||||||
* First stop the BIOS memory test by setting a soft
|
|
||||||
* reset flag.
|
|
||||||
*/
|
|
||||||
magic = STOP_MEM_CHECK;
|
|
||||||
phys_copy(vir2phys(&magic), SOFT_RESET_FLAG_ADDR,
|
|
||||||
SOFT_RESET_FLAG_SIZE);
|
|
||||||
reset();
|
|
||||||
NOT_REACHABLE;
|
|
||||||
|
|
||||||
case RBT_HALT:
|
case RBT_HALT:
|
||||||
/* Poweroff without boot monitor */
|
/* Poweroff without boot monitor */
|
||||||
|
@ -221,11 +181,13 @@ __dead void arch_shutdown(int how)
|
||||||
NOT_REACHABLE;
|
NOT_REACHABLE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* Not possible! trigger panic */
|
case RBT_REBOOT:
|
||||||
assert(how != RBT_MONITOR);
|
case RBT_RESET:
|
||||||
assert(how != RBT_DEFAULT);
|
/* Reset the system by forcing a processor shutdown.
|
||||||
assert(how < RBT_INVALID);
|
* First stop the BIOS memory test by setting a soft
|
||||||
panic("unexpected value for how: %d", how);
|
* reset flag.
|
||||||
|
*/
|
||||||
|
reset();
|
||||||
NOT_REACHABLE;
|
NOT_REACHABLE;
|
||||||
}
|
}
|
||||||
#else /* !USE_BOOTPARAM */
|
#else /* !USE_BOOTPARAM */
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/* The kernel call implemented in this file:
|
|
||||||
* m_type: SYS_INT86
|
|
||||||
*
|
|
||||||
* The parameters for this kernel call are:
|
|
||||||
* m1_p1: INT86_REG86
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "kernel/system.h"
|
|
||||||
#include <minix/type.h>
|
|
||||||
#include <minix/endpoint.h>
|
|
||||||
#include <machine/int86.h>
|
|
||||||
|
|
||||||
#include "arch_proto.h"
|
|
||||||
|
|
||||||
struct reg86u reg86;
|
|
||||||
|
|
||||||
/*===========================================================================*
|
|
||||||
* do_int86 *
|
|
||||||
*===========================================================================*/
|
|
||||||
int do_int86(struct proc * caller, message * m_ptr)
|
|
||||||
{
|
|
||||||
data_copy(caller->p_endpoint, (vir_bytes) m_ptr->INT86_REG86,
|
|
||||||
KERNEL, (vir_bytes) ®86, sizeof(reg86));
|
|
||||||
|
|
||||||
int86();
|
|
||||||
|
|
||||||
/* Copy results back to the caller */
|
|
||||||
data_copy(KERNEL, (vir_bytes) ®86,
|
|
||||||
caller->p_endpoint, (vir_bytes) m_ptr->INT86_REG86, sizeof(reg86));
|
|
||||||
|
|
||||||
/* The BIOS call eats interrupts. Call get_randomness to generate some
|
|
||||||
* entropy. Normally, get_randomness is called from an interrupt handler.
|
|
||||||
* Figuring out the exact source is too complicated. CLOCK_IRQ is normally
|
|
||||||
* not very random.
|
|
||||||
*/
|
|
||||||
get_randomness(&krandom, CLOCK_IRQ);
|
|
||||||
|
|
||||||
return(OK);
|
|
||||||
}
|
|
|
@ -76,7 +76,6 @@ void exception(struct exception_frame * frame);
|
||||||
__dead void monitor(void);
|
__dead void monitor(void);
|
||||||
__dead void reset(void);
|
__dead void reset(void);
|
||||||
__dead void x86_triplefault(void);
|
__dead void x86_triplefault(void);
|
||||||
void int86(void);
|
|
||||||
reg_t read_cr0(void);
|
reg_t read_cr0(void);
|
||||||
reg_t read_cr2(void);
|
reg_t read_cr2(void);
|
||||||
void write_cr0(unsigned long value);
|
void write_cr0(unsigned long value);
|
||||||
|
|
|
@ -16,120 +16,6 @@
|
||||||
* kernel.
|
* kernel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* The routines only guarantee to preserve the registers the C compiler
|
|
||||||
* expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and
|
|
||||||
* direction bit in the flags).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* monitor */
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* PUBLIC void monitor(); */
|
|
||||||
/* exit Minix and return to the monitor */
|
|
||||||
ENTRY(monitor)
|
|
||||||
movl _C_LABEL(mon_sp), %esp /* restore monitor stack pointer */
|
|
||||||
movw $SS_SELECTOR, %dx /* monitor data segment */
|
|
||||||
mov %dx, %ds
|
|
||||||
mov %dx, %es
|
|
||||||
mov %dx, %fs
|
|
||||||
mov %dx, %gs
|
|
||||||
mov %dx, %ss
|
|
||||||
pop %edi
|
|
||||||
pop %esi
|
|
||||||
pop %ebp
|
|
||||||
lretw /* return to the monitor */
|
|
||||||
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* int86 */
|
|
||||||
/*===========================================================================*/
|
|
||||||
/* PUBLIC void int86(); */
|
|
||||||
/* let the monitor make an 8086 interrupt call */
|
|
||||||
ENTRY(int86)
|
|
||||||
cmpb $0, _C_LABEL(mon_return) /* is the monitor there? */
|
|
||||||
jne 0f
|
|
||||||
movb $0x01, %ah /* an int 13 error seems appropriate */
|
|
||||||
movb %ah, _C_LABEL(reg86)+0 /* reg86.w.f = 1 (set carry flag) */
|
|
||||||
movb %ah, _C_LABEL(reg86)+13 /* reg86.b.ah = 0x01 = "invalid command" */
|
|
||||||
ret
|
|
||||||
0:
|
|
||||||
push %ebp /* save C registers */
|
|
||||||
push %esi
|
|
||||||
push %edi
|
|
||||||
push %ebx
|
|
||||||
pushf /* save flags */
|
|
||||||
cli /* no interruptions */
|
|
||||||
|
|
||||||
inb $INT2_CTLMASK
|
|
||||||
movb %al, %ah
|
|
||||||
inb $INT_CTLMASK
|
|
||||||
push %eax /* save interrupt masks */
|
|
||||||
movl _C_LABEL(irq_use), %eax /* map of in-use IRQ's */
|
|
||||||
and $~(1<<CLOCK_IRQ), %eax /* keep the clock ticking */
|
|
||||||
outb $INT_CTLMASK /* enable all unused IRQ's and vv. */
|
|
||||||
movb %ah, %al
|
|
||||||
outb $INT2_CTLMASK
|
|
||||||
|
|
||||||
mov $SS_SELECTOR, %eax /* monitor data segment */
|
|
||||||
mov %ax, %ss
|
|
||||||
xchgl _C_LABEL(mon_sp), %esp /* switch stacks */
|
|
||||||
push _C_LABEL(reg86)+36 /* parameters used in INT call */
|
|
||||||
push _C_LABEL(reg86)+32
|
|
||||||
push _C_LABEL(reg86)+28
|
|
||||||
push _C_LABEL(reg86)+24
|
|
||||||
push _C_LABEL(reg86)+20
|
|
||||||
push _C_LABEL(reg86)+16
|
|
||||||
push _C_LABEL(reg86)+12
|
|
||||||
push _C_LABEL(reg86)+8
|
|
||||||
push _C_LABEL(reg86)+4
|
|
||||||
push _C_LABEL(reg86)+0
|
|
||||||
mov %ax, %ds /* remaining data selectors */
|
|
||||||
mov %ax, %es
|
|
||||||
mov %ax, %fs
|
|
||||||
mov %ax, %gs
|
|
||||||
push %cs
|
|
||||||
push $return /* kernel return address and selector */
|
|
||||||
ljmpw *20+2*4+10*4+2*4(%esp)
|
|
||||||
return:
|
|
||||||
pop _C_LABEL(reg86)+0
|
|
||||||
pop _C_LABEL(reg86)+4
|
|
||||||
pop _C_LABEL(reg86)+8
|
|
||||||
pop _C_LABEL(reg86)+12
|
|
||||||
pop _C_LABEL(reg86)+16
|
|
||||||
pop _C_LABEL(reg86)+20
|
|
||||||
pop _C_LABEL(reg86)+24
|
|
||||||
pop _C_LABEL(reg86)+28
|
|
||||||
pop _C_LABEL(reg86)+32
|
|
||||||
pop _C_LABEL(reg86)+36
|
|
||||||
lgdt _C_LABEL(gdt)+GDT_SELECTOR /* reload global descriptor table */
|
|
||||||
ljmp $CS_SELECTOR, $csinit
|
|
||||||
csinit:
|
|
||||||
mov $DS_SELECTOR, %eax
|
|
||||||
mov %ax, %ds
|
|
||||||
mov %ax, %es
|
|
||||||
mov %ax, %fs
|
|
||||||
mov %ax, %gs
|
|
||||||
mov %ax, %ss
|
|
||||||
xchgl _C_LABEL(mon_sp), %esp /* unswitch stacks */
|
|
||||||
lidt _C_LABEL(gdt)+IDT_SELECTOR /* reload interrupt descriptor table */
|
|
||||||
|
|
||||||
pop %eax
|
|
||||||
outb $INT_CTLMASK /* restore interrupt masks */
|
|
||||||
movb %ah, %al
|
|
||||||
outb $INT2_CTLMASK
|
|
||||||
|
|
||||||
6:
|
|
||||||
addl %ecx, _C_LABEL(lost_ticks) /* record lost clock ticks */
|
|
||||||
|
|
||||||
popf /* restore flags */
|
|
||||||
pop %ebx /* restore C registers */
|
|
||||||
pop %edi
|
|
||||||
pop %esi
|
|
||||||
pop %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY(__main)
|
ENTRY(__main)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
|
@ -95,12 +95,6 @@ kernel_init: /* after pre-init*/
|
||||||
mov %esp, %ebp
|
mov %esp, %ebp
|
||||||
push %esi
|
push %esi
|
||||||
push %edi
|
push %edi
|
||||||
cmp $0, 4(%ebp) /* monitor return vector is */
|
|
||||||
je noret /* nonzero if return possible */
|
|
||||||
incl _C_LABEL(mon_return)
|
|
||||||
noret:
|
|
||||||
movl %esp, _C_LABEL(mon_sp) /* save stack pointer for later return */
|
|
||||||
|
|
||||||
/* Copy the monitor global descriptor table to the address space of kernel and */
|
/* Copy the monitor global descriptor table to the address space of kernel and */
|
||||||
/* switch over to it. Prot_init() can then update it with immediate effect. */
|
/* switch over to it. Prot_init() can then update it with immediate effect. */
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,6 @@ EXTERN int irq_use; /* map of all in-use irq's */
|
||||||
EXTERN u32_t system_hz; /* HZ value */
|
EXTERN u32_t system_hz; /* HZ value */
|
||||||
|
|
||||||
/* Miscellaneous. */
|
/* Miscellaneous. */
|
||||||
EXTERN reg_t mon_sp; /* boot monitor stack */
|
|
||||||
EXTERN int mon_return; /* true if we can return to monitor */
|
|
||||||
EXTERN int do_serial_debug;
|
EXTERN int do_serial_debug;
|
||||||
EXTERN int serial_debug_baud;
|
EXTERN int serial_debug_baud;
|
||||||
EXTERN time_t boottime;
|
EXTERN time_t boottime;
|
||||||
|
|
|
@ -186,7 +186,6 @@ void fpu_init(void);
|
||||||
int is_fpu(void);
|
int is_fpu(void);
|
||||||
void ser_putc(char);
|
void ser_putc(char);
|
||||||
__dead void arch_shutdown(int);
|
__dead void arch_shutdown(int);
|
||||||
__dead void arch_monitor(void);
|
|
||||||
void restore_user_context(struct proc * p);
|
void restore_user_context(struct proc * p);
|
||||||
void read_tsc(u32_t *high, u32_t *low);
|
void read_tsc(u32_t *high, u32_t *low);
|
||||||
int arch_init_profile_clock(u32_t freq);
|
int arch_init_profile_clock(u32_t freq);
|
||||||
|
|
|
@ -253,7 +253,6 @@ void system_init(void)
|
||||||
|
|
||||||
/* i386-specific. */
|
/* i386-specific. */
|
||||||
#if _MINIX_CHIP == _CHIP_INTEL
|
#if _MINIX_CHIP == _CHIP_INTEL
|
||||||
map(SYS_INT86, do_int86); /* real-mode BIOS calls */
|
|
||||||
map(SYS_READBIOS, do_readbios); /* read from BIOS locations */
|
map(SYS_READBIOS, do_readbios); /* read from BIOS locations */
|
||||||
map(SYS_IOPENABLE, do_iopenable); /* Enable I/O */
|
map(SYS_IOPENABLE, do_iopenable); /* Enable I/O */
|
||||||
map(SYS_SDEVIO, do_sdevio); /* phys_insb, _insw, _outsb, _outsw */
|
map(SYS_SDEVIO, do_sdevio); /* phys_insb, _insw, _outsb, _outsw */
|
||||||
|
|
|
@ -132,8 +132,6 @@ int do_vdevio(struct proc * caller, message *m_ptr);
|
||||||
#define do_vdevio NULL
|
#define do_vdevio NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int do_int86(struct proc * caller, message *m_ptr);
|
|
||||||
|
|
||||||
int do_sdevio(struct proc * caller, message *m_ptr);
|
int do_sdevio(struct proc * caller, message *m_ptr);
|
||||||
#if ! USE_SDEVIO
|
#if ! USE_SDEVIO
|
||||||
#define do_sdevio NULL
|
#define do_sdevio NULL
|
||||||
|
|
Loading…
Reference in a new issue