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}
|
||||
SRCS+= arch_do_vmctl.c \
|
||||
arch_clock.c \
|
||||
do_int86.c \
|
||||
do_iopenable.c \
|
||||
do_readbios.c \
|
||||
do_sdevio.c \
|
||||
|
|
|
@ -57,11 +57,6 @@ static void ser_dump_proc_cpu(void);
|
|||
static void ser_init(void);
|
||||
#endif
|
||||
|
||||
__dead void arch_monitor(void)
|
||||
{
|
||||
monitor();
|
||||
}
|
||||
|
||||
#define KBCMDP 4 /* kbd controller port (O) */
|
||||
#define KBC_PULSE0 0xfe /* pulse output bit 0 */
|
||||
#define IO_KBD 0x060 /* 8042 Keyboard */
|
||||
|
@ -138,7 +133,6 @@ int cpu_has_tsc;
|
|||
|
||||
__dead void arch_shutdown(int how)
|
||||
{
|
||||
u16_t magic;
|
||||
vm_stop();
|
||||
|
||||
/* Mask all interrupts, including the clock. */
|
||||
|
@ -171,44 +165,10 @@ __dead void arch_shutdown(int how)
|
|||
|
||||
#if USE_BOOTPARAM
|
||||
if (how == RBT_DEFAULT) {
|
||||
how = mon_return ? RBT_HALT : 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) {
|
||||
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:
|
||||
/* Poweroff without boot monitor */
|
||||
|
@ -221,11 +181,13 @@ __dead void arch_shutdown(int how)
|
|||
NOT_REACHABLE;
|
||||
|
||||
default:
|
||||
/* Not possible! trigger panic */
|
||||
assert(how != RBT_MONITOR);
|
||||
assert(how != RBT_DEFAULT);
|
||||
assert(how < RBT_INVALID);
|
||||
panic("unexpected value for how: %d", 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.
|
||||
*/
|
||||
reset();
|
||||
NOT_REACHABLE;
|
||||
}
|
||||
#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 reset(void);
|
||||
__dead void x86_triplefault(void);
|
||||
void int86(void);
|
||||
reg_t read_cr0(void);
|
||||
reg_t read_cr2(void);
|
||||
void write_cr0(unsigned long value);
|
||||
|
|
|
@ -16,120 +16,6 @@
|
|||
* 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)
|
||||
ret
|
||||
|
||||
|
|
|
@ -95,12 +95,6 @@ kernel_init: /* after pre-init*/
|
|||
mov %esp, %ebp
|
||||
push %esi
|
||||
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 */
|
||||
/* 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 */
|
||||
|
||||
/* 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 serial_debug_baud;
|
||||
EXTERN time_t boottime;
|
||||
|
|
|
@ -186,7 +186,6 @@ void fpu_init(void);
|
|||
int is_fpu(void);
|
||||
void ser_putc(char);
|
||||
__dead void arch_shutdown(int);
|
||||
__dead void arch_monitor(void);
|
||||
void restore_user_context(struct proc * p);
|
||||
void read_tsc(u32_t *high, u32_t *low);
|
||||
int arch_init_profile_clock(u32_t freq);
|
||||
|
|
|
@ -253,7 +253,6 @@ void system_init(void)
|
|||
|
||||
/* i386-specific. */
|
||||
#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_IOPENABLE, do_iopenable); /* Enable I/O */
|
||||
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
|
||||
#endif
|
||||
|
||||
int do_int86(struct proc * caller, message *m_ptr);
|
||||
|
||||
int do_sdevio(struct proc * caller, message *m_ptr);
|
||||
#if ! USE_SDEVIO
|
||||
#define do_sdevio NULL
|
||||
|
|
Loading…
Reference in a new issue