/*1* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829#include <types.h>30#include <lib.h>31#include <cpu.h>32#include <wchan.h>33#include <clock.h>34#include <thread.h>35#include <current.h>3637/*38* Time handling.39*40* This is pretty primitive. A real kernel will typically have some41* kind of support for scheduling callbacks to happen at specific42* points in the future, usually with more resolution that one second.43*44* A real kernel also has to maintain the time of day; in OS/161 we45* skimp on that because we have a known-good hardware clock.46*/4748/*49* Timing constants. These should be tuned along with any work done on50* the scheduler.51*/52#define SCHEDULE_HARDCLOCKS 4 /* Reschedule every 4 hardclocks. */53#define MIGRATE_HARDCLOCKS 16 /* Migrate every 16 hardclocks. */5455/*56* Once a second, everything waiting on lbolt is awakened by CPU 0.57*/58static struct wchan *lbolt;5960/*61* Setup.62*/63void64hardclock_bootstrap(void)65{66lbolt = wchan_create("lbolt");67if (lbolt == NULL) {68panic("Couldn't create lbolt\n");69}70}7172/*73* This is called once per second, on one processor, by the timer74* code.75*/76void77timerclock(void)78{79/* Just broadcast on lbolt */80wchan_wakeall(lbolt);81}8283/*84* This is called HZ times a second (on each processor) by the timer85* code.86*/87void88hardclock(void)89{90/*91* Collect statistics here as desired.92*/9394curcpu->c_hardclocks++;95if ((curcpu->c_hardclocks % SCHEDULE_HARDCLOCKS) == 0) {96schedule();97}98if ((curcpu->c_hardclocks % MIGRATE_HARDCLOCKS) == 0) {99thread_consider_migration();100}101thread_yield();102}103104/*105* Suspend execution for n seconds.106*/107void108clocksleep(int num_secs)109{110while (num_secs > 0) {111wchan_lock(lbolt);112wchan_sleep(lbolt);113num_secs--;114}115}116117118