Mercurial > ecos
changeset 147:d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
line wrap: on
line diff
--- a/host/tools/configtool/standalone/common/ecosconfig.cxx +++ b/host/tools/configtool/standalone/common/ecosconfig.cxx @@ -50,7 +50,7 @@ #include "ecosconfig.hxx" #define TOOL_VERSION "1.3.net" -#define TOOL_COPYRIGHT "Copyright (c) 2000 Red Hat, Inc." +#define TOOL_COPYRIGHT "Copyright (c) 2001 Red Hat, Inc." #define DEFAULT_SAVE_FILE "ecos.ecc" static char* tool = "ecosconfig";
--- a/host/tools/configtool/standalone/win32/CTres.h +++ b/host/tools/configtool/standalone/win32/CTres.h @@ -26,6 +26,7 @@ #define IDC_RADIO_CUSTOM_BROWSER 22028 #define IDC_STATIC_ABOUT 22031 #define IDC_RADIO_INTERNAL_BROWSER 22032 +#define IDC_STATIC_ABOUT2 22032 #define IDC_HEADERSTATIC 22033 #define IDC_STATIC_DATETIME 22034 #define IDC_PANECOMBO 22035
--- a/host/tools/configtool/standalone/win32/Configtool.rc +++ b/host/tools/configtool/standalone/win32/Configtool.rc @@ -158,7 +158,7 @@ BEGIN POPUP "Red Hat on the &Web" BEGIN MENUITEM "&Red Hat Home Page", ID_HELP_RED_HATONTHEWEB - MENUITEM "&eCos Product Page", ID_HELP_ECOSHOME + MENUITEM "&eCos Product Page", ID_HELP_ECOSHOME MENUITEM "eCos &Net Release Page", ID_HELP_ECOS MENUITEM SEPARATOR MENUITEM "µ&ITRON Specification", ID_HELP_UITRON @@ -186,7 +186,7 @@ END // Dialog // -IDD_ABOUTBOX DIALOGEX 0, 0, 217, 190 +IDD_ABOUTBOX DIALOGEX 0, 0, 217, 198 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Configuration Tool" FONT 8, "MS Sans Serif" @@ -194,13 +194,17 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP LTEXT "eCos Configuration Tool 1.3.net",IDC_STATIC,40,10,119,8, SS_NOPREFIX - ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + ICON IDR_MAINFRAME,IDC_STATIC,11,17,21,20 LTEXT "Date/Time info",IDC_STATIC_DATETIME,40,23,119,8 - LTEXT "Copyright © 1998-2000 Red Hat, Inc.",IDC_STATIC,40,36, + LTEXT "Copyright © 1998-2001 Red Hat, Inc.",IDC_STATIC,40,36, 170,8 - LTEXT "The eCos engineering team is:",IDC_STATIC,7,50,109,8 - CTEXT "\r\nPaul Beskeen\r\nJohn Dallaway\r\nRobert Erskine\r\nNick Garnett\r\nEugene Kulesha\r\nJonathan Larmour\r\nAlex Schuilenburg\r\nJesper Skov\r\nJulian Smart\r\nGary Thomas\r\nHugo Tyson\r\nBart Veer", - IDC_STATIC_ABOUT,7,69,203,114,SS_SUNKEN,WS_EX_CLIENTEDGE + CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME,8,57,201,133, + WS_EX_DLGMODALFRAME | WS_EX_TRANSPARENT + CTEXT "Paul Beskeen\r\nJohn Dallaway\r\nRobert Erksine\r\nSimon FitzMaurice\r\nMark Galassi\r\nNick Garnett\r\nTim Goodwin\r\nStu Grossman\r\nEugene Kulesha\r\nJonathan Larmour\r\nDavid Moore\r\nDrew Moseley", + IDC_STATIC_ABOUT,17,82,84,102 + CTEXT "Daniel Neades\r\nGary Oliverio\r\nChris Provenzano\r\nMark Salter\r\nRob Savoye\r\nAlex Schuilenburg\r\nJesper Skov\r\nJulian Smart\r\nChris Tarpy\r\nGary Thomas\r\nHugo Tyson\r\nBart Veer", + IDC_STATIC_ABOUT2,115,82,84,101 + LTEXT "The eCos engineering team is:",IDC_STATIC,60,64,109,8 END IDD_VIEW_SETTINGS_DIALOG DIALOG DISCARDABLE 0, 0, 234, 302 @@ -377,6 +381,11 @@ END #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + BOTTOMMARGIN, 193 + END + IDD_VIEW_SETTINGS_DIALOG, DIALOG BEGIN LEFTMARGIN, 7
index 678443fdd50ee2cdaac5f32030bbfb8969b9028d..b19abe7a371af445f54e8fdf3df6d493136e8017 GIT binary patch literal 166438 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 F^Z&lFDv1C9
--- a/host/tools/pkgadmin/ChangeLog +++ b/host/tools/pkgadmin/ChangeLog @@ -1,3 +1,10 @@ +2000-12-15 Julian Smart <julians@redhat.com> + + * win32/PkgAdminDlg.cpp: + + Provide dummy error and warning handlers for + CdlPackagesDatabaseBody::make or it asserts in debug mode. + 2000-06-15 John Dallaway <jld@redhat.com> * win32/PkgAdmin.dsp:
--- a/host/tools/pkgadmin/win32/PkgAdminDlg.cpp +++ b/host/tools/pkgadmin/win32/PkgAdminDlg.cpp @@ -259,6 +259,16 @@ HCURSOR CPkgAdminDlg::OnQueryDragIcon() return (HCURSOR) m_hIcon; } +// Trivial handlers; otherwise CdlPackagesDatabaseBody::make asserts. +void CdlErrorHandler (std::string message) +{ +}; + +void CdlWarningHandler (std::string message) +{ +}; + + bool CPkgAdminDlg::PopulatePackageTree(LPCTSTR pszPackagesPath) { // delete any existing CDL database @@ -273,7 +283,12 @@ bool CPkgAdminDlg::PopulatePackageTree(L try { + // Cdl asserts unless the handlers are present. +#if 1 + m_CdlPkgData = CdlPackagesDatabaseBody::make (UnicodeToStdStr (pszPackagesPath), &CdlErrorHandler, &CdlWarningHandler); +#else m_CdlPkgData = CdlPackagesDatabaseBody::make (UnicodeToStdStr (pszPackagesPath)); +#endif } catch (CdlStringException exception) {
--- a/packages/compat/posix/current/ChangeLog +++ b/packages/compat/posix/current/ChangeLog @@ -1,3 +1,17 @@ +2000-12-22 Jonathan Larmour <jlarmour@redhat.com> + + * src/pthread.cxx (pthread_measure_stack_usage): New function + to measure stack usage. + + * include/pthread.h: Prototype it. + + * cdl/pthread.cdl: remove CYGNUM_POSIX_MAIN_DEFAULT_STACK_SIZE and + instead implement CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE + + * src/pthread.cxx: Use stack size for main from libc_startup package + to prevent confusion + (cyg_posix_pthread_start): Likewise + 2000-12-06 Jonathan Larmour <jlarmour@redhat.com> * src/signal.cxx: include unistd.h for _exit
--- a/packages/compat/posix/current/cdl/pthread.cdl +++ b/packages/compat/posix/current/cdl/pthread.cdl @@ -180,25 +180,10 @@ cdl_component CYGPKG_POSIX_MAIN_THREAD { calculated 1 requires { 0 != CYGPKG_LIBC_STARTUP } requires CYGSEM_LIBC_STARTUP_MAIN_OTHER + implements CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE description "These options control the thread used to run the main() application entry routine." - cdl_option CYGNUM_POSIX_MAIN_DEFAULT_STACK_SIZE { - display "main()'s default thread stack size" - flavor data - legal_values 16 to 0x7fffffff - default_value 8192 - description " - POSIX compatibility requires that the application's - main() function be invoked in a thread. - This option controls the size of that thread's - stack, which is allocated in the BSS. It - must be a multiple of 8. Note, a low number - here may be overriden by the HAL if there is - a minimum requirement to process interrupts - etc." - } - cdl_option CYGNUM_POSIX_MAIN_DEFAULT_PRIORITY { display "main()'s default thread priority" flavor data
--- a/packages/compat/posix/current/include/pthread.h +++ b/packages/compat/posix/current/include/pthread.h @@ -408,6 +408,13 @@ externC void pthread_cleanup_pop_inner ( int execute); +// ------------------------------------------------------------------------- +// eCos-specific function to measure stack usage of the supplied thread + +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT +externC size_t pthread_measure_stack_usage (pthread_t thread); +#endif + //----------------------------------------------------------------------------- #endif // ifndef CYGONCE_PTHREAD_H // End of pthread.h
--- a/packages/compat/posix/current/src/pthread.cxx +++ b/packages/compat/posix/current/src/pthread.cxx @@ -48,6 +48,7 @@ #include <pkgconf/kernel.h> #include <pkgconf/posix.h> #include <pkgconf/isoinfra.h> +#include <pkgconf/libc_startup.h> #include <cyg/kernel/ktypes.h> // base kernel types #include <cyg/infra/cyg_trac.h> // tracing macros @@ -155,7 +156,7 @@ static pthread_t thread_id_cookie = THRE //----------------------------------------------------------------------------- // Main thread. -static char main_stack[CYGNUM_POSIX_MAIN_DEFAULT_STACK_SIZE]; +static char main_stack[CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE]; // Thread ID of main thread. static pthread_t main_thread; @@ -390,8 +391,8 @@ externC void cyg_posix_pthread_start( vo pthread_attr_init( &attr ); pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); - pthread_attr_setstackaddr( &attr, &main_stack[CYGNUM_POSIX_MAIN_DEFAULT_STACK_SIZE] ); - pthread_attr_setstacksize( &attr, CYGNUM_POSIX_MAIN_DEFAULT_STACK_SIZE ); + pthread_attr_setstackaddr( &attr, &main_stack[CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE] ); + pthread_attr_setstacksize( &attr, CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); pthread_attr_setschedparam( &attr, &schedparam ); @@ -2019,4 +2020,19 @@ externC void pthread_cleanup_pop_inner ( // ------------------------------------------------------------------------- +// eCos-specific function to measure stack usage of the supplied thread + +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT +externC size_t pthread_measure_stack_usage (pthread_t thread) +{ + pthread_info *th = pthread_info_id(thread); + + if ( NULL == th ) + return (size_t)-1; + + return (size_t)th->thread->measure_stack_usage(); +} +#endif + +// ------------------------------------------------------------------------- // EOF pthread.cxx
--- a/packages/devs/eth/arm/ebsa285/current/ChangeLog +++ b/packages/devs/eth/arm/ebsa285/current/ChangeLog @@ -1,3 +1,16 @@ +2001-01-02 Hugo Tyson <hmt@redhat.com> + + * src/if_ebsa285.c (find_82559s_match_func): New func to match + complex PCI device requirements. + (pci_init_find_82559s): Use it, and the new PCI API to correctly + match a disparate bunch of devices on the one board. + +2000-12-21 Hugo Tyson <hmt@redhat.com> + + * src/if_ebsa285.c (pci_init_find_82559s): Also check for the PCI + device whose name is ... 0x1209; "82559ER". Thanks to Martin Buck + <martin.buck@ascom.ch> for the ID for that. + 2000-11-19 Gary Thomas <gthomas@redhat.com> * src/if_ebsa285.c (pci_init_find_82559s): Intel has at least
--- a/packages/devs/eth/arm/ebsa285/current/src/if_ebsa285.c +++ b/packages/devs/eth/arm/ebsa285/current/src/if_ebsa285.c @@ -1889,6 +1889,20 @@ i82559_int_op( struct eth_drv_sc *sc, in // o instantiate interrupts for them // o attach those interrupts appropriately // ------------------------------------------------------------------------ +static cyg_pci_match_func find_82559s_match_func; + +// Intel 82559 and 82557 are virtually identical, with different +// dev codes; also 82559ER (cutdown) = 0x1209. +static cyg_bool +find_82559s_match_func( cyg_uint16 v, cyg_uint16 d, cyg_uint32 c, void *p ) +{ + return + (0x8086 == v) && + ((0x1030 == d) || + (0x1229 == d) || + (0x1209 == d)); +} + static int pci_init_find_82559s( void ) { @@ -1951,9 +1965,10 @@ pci_init_find_82559s( void ) p_i82559->index = device_index; - // Intel 82559 and 82557 are virtually identical, with different dev codes - if (cyg_pci_find_device(0x8086, 0x1030, &devid) || - cyg_pci_find_device(0x8086, 0x1229, &devid) ) { + // See above for find_82559s_match_func - it selects any of several + // variants. This is necessary in case we have multiple mixed-type + // devices on one board in arbitrary orders. + if (cyg_pci_find_matching( &find_82559s_match_func, NULL, &devid )) { #ifdef DEBUG db_printf("eth%d = 82559\n", device_index); #endif
--- a/packages/devs/eth/arm/edb7xxx/current/ChangeLog +++ b/packages/devs/eth/arm/edb7xxx/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-01 David Geng <deli.geng@ncl.ac.uk> + + * src/if_edb7xxx.c (cs8900_start): Set 'txbusy' false after reset + to prevent erroneous 'missed interrupt' error. + 2000-09-17 Gary Thomas <gthomas@redhat.com> * src/if_edb7xxx.c (cs8900_can_send): Add simple timeout on Tx.
--- a/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c +++ b/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c @@ -251,6 +251,8 @@ static void cs8900_start(struct eth_drv_sc *sc, unsigned char *enaddr, int flags) { unsigned short stat; + struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; + put_reg(PP_BusCtl, PP_BusCtl_MemoryE); // Disable interrupts, memory mode put_reg(PP_IntReg, PP_IntReg_IRQ0); // Only possibility put_reg(PP_RxCFG, PP_RxCFG_RxOK | PP_RxCFG_CRC | @@ -266,6 +268,7 @@ cs8900_start(struct eth_drv_sc *sc, unsi put_reg(PP_LineCTL, PP_LineCTL_Rx | PP_LineCTL_Tx); // Clear Interrupt Status Queue before enabling interrupts while ((stat = CS8900_ISQ) != 0) ; + cpd->txbusy = 0; put_reg(PP_BusCtl, PP_BusCtl_EnableIRQ); } @@ -295,6 +298,7 @@ cs8900_can_send(struct eth_drv_sc *sc) { struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; unsigned short stat; + stat = get_reg(PP_LineStat); if ((stat & PP_LineStat_LinkOK) == 0) { return false; // Link not connected @@ -431,6 +435,7 @@ static void cs8900_TxEvent(struct eth_drv_sc *sc, int stat) { struct cs8900_priv_data *cpd = (struct cs8900_priv_data *)sc->driver_private; + stat = get_reg(PP_TER); if (net_debug) { diag_printf("Tx event: %x\n", stat); @@ -452,6 +457,7 @@ static void cs8900_int(struct eth_drv_sc *sc) { unsigned short event; + while ((event = CS8900_ISQ) != 0) { switch (event & ISQ_EventMask) { case ISQ_RxEvent: @@ -481,6 +487,7 @@ void cs8900_fake_int(cyg_addrword_t param) { int s; + while (true) { cyg_thread_delay(5); s = splnet();
--- a/packages/devs/eth/powerpc/quicc/current/ChangeLog +++ b/packages/devs/eth/powerpc/quicc/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * src/if_quicc.c: Add support in RedBoot to keep ESA (since + the I2C interface is really broken). + 2000-10-20 Gary Thomas <gthomas@redhat.com> * src/if_quicc.c: Changes to compile in stand-alone mode.
--- a/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c +++ b/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c @@ -81,6 +81,18 @@ static unsigned char quicc_eth_txbufs[CY static struct quicc_eth_info quicc_eth0_info; static unsigned char enaddr[] = { 0x08, 0x00, 0x3E, 0x28, 0x79, 0xB8}; +#ifdef CYGPKG_REDBOOT +#include <pkgconf/redboot.h> +#ifdef CYGSEM_REDBOOT_FLASH_CONFIG +#include <redboot.h> +#include <flash_config.h> +RedBoot_config_option("Network hardware address [MAC]", + quicc_esa, + ALWAYS_ENABLED, true, + CONFIG_ESA + ); +#endif +#endif ETH_DRV_SC(quicc_eth0_sc, &quicc_eth0_info, // Driver specific data @@ -136,7 +148,7 @@ quicc_eth_init(struct cyg_netdevtab_entr struct quicc_eth_info *qi = (struct quicc_eth_info *)sc->driver_private; volatile EPPC *eppc = (volatile EPPC *)eppc_base(); struct cp_bufdesc *rxbd, *txbd; - unsigned char *RxBUF, *TxBUF, *ep, *ap; + unsigned char *RxBUF, *TxBUF, *ep, *ap; volatile struct ethernet_pram *enet_pram; volatile struct scc_regs *scc; int TxBD, RxBD; @@ -145,7 +157,19 @@ quicc_eth_init(struct cyg_netdevtab_entr // Fetch the board address from the VPD #define VPD_ETHERNET_ADDRESS 0x08 - _mbx_fetch_VPD(VPD_ETHERNET_ADDRESS, enaddr, sizeof(enaddr)); + if (_mbx_fetch_VPD(VPD_ETHERNET_ADDRESS, enaddr, sizeof(enaddr)) == 0) { +#if defined(CYGPKG_REDBOOT) && \ + defined(CYGSEM_REDBOOT_FLASH_CONFIG) + flash_get_config("quicc_esa", enaddr, CONFIG_ESA); +#else + enet_pram = &eppc->pram[0].enet_scc; + ap = &enaddr[sizeof(enaddr)]; + ep = (unsigned char *)&enet_pram->paddr_h; + for (i = 0; i < sizeof(enaddr); i++) { + *ap++ = *--ep; + } +#endif + } // Ensure consistent state between cache and what the QUICC sees HAL_DCACHE_IS_ENABLED(cache_state);
--- a/packages/devs/serial/powerpc/quicc/current/ChangeLog +++ b/packages/devs/serial/powerpc/quicc/current/ChangeLog @@ -1,3 +1,10 @@ +2000-12-22 Björn Stenberg <bjorn@haxx.se> + + * src/quicc_smc_serial.c (quicc_smc_serial_init_info): + Set quicc going only after most of the other initialization is + complete - otherwise initializing too early causes some of the + parameters not to be initialized properly. + 2000-12-13 Daniel Lind <daniel.lind@sth.frontec.se> * src/quicc_smc_serial.c (quicc_smc_serial_flush):
--- a/packages/devs/serial/powerpc/quicc/current/src/quicc_smc_serial.c +++ b/packages/devs/serial/powerpc/quicc/current/src/quicc_smc_serial.c @@ -303,10 +303,6 @@ quicc_smc_serial_init_info(quicc_smc_ser eppc->pip_pbpar |= portBmask; eppc->pip_pbdir &= ~portBmask; /* - * Reset Rx & Tx params - */ - eppc->cp_cr = smc_chan->channel | QUICC_SMC_CMD_Go | QUICC_SMC_CMD_InitTxRx; - /* * SDMA & LCD bus request level 5 * (Section 16.10.2.1) */ @@ -361,6 +357,10 @@ quicc_smc_serial_init_info(quicc_smc_ser txbd++; } /* + * Reset Rx & Tx params + */ + eppc->cp_cr = smc_chan->channel | QUICC_SMC_CMD_Go | QUICC_SMC_CMD_InitTxRx; + /* * Clear any previous events. Enable interrupts. * (Section 16.15.7.14 and 16.15.7.15) */
--- a/packages/ecos.db +++ b/packages/ecos.db @@ -176,6 +176,7 @@ package CYGPKG_DEVS_FLASH_MBX { on the Motorola PowerPC/860 MBX platform." } + package CYGPKG_IO_SERIAL_ARM_EBSA285 { alias { "Intel EBSA285 serial driver" devs_serial_arm_ebsa285 ebsa285_serial_driver } @@ -448,6 +449,7 @@ package CYGPKG_DEVS_ETH_POWERPC_QUICC { } + # Not sure whether this should be "hardware"; if so, it should be mentioned # in all targets that can use it. package CYGPKG_DEVS_ETH_CF {
--- a/packages/hal/arm/ebsa285/current/ChangeLog +++ b/packages/hal/arm/ebsa285/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * src/ebsa285_misc.c (hal_delay_us): Slight rearrangement to + ensure this works properly on all speeds of platform. + 2000-12-11 Gary Thomas <gthomas@redhat.com> * cdl/hal_arm_ebsa285.cdl:
--- a/packages/hal/arm/ebsa285/current/src/ebsa285_misc.c +++ b/packages/hal/arm/ebsa285/current/src/ebsa285_misc.c @@ -377,10 +377,11 @@ void hal_delay_us(cyg_int32 usecs) { int diff, diff2; cyg_uint32 val1, val2; + while (usecs-- > 0) { diff = 0; + val1 = *SA110_TIMER3_VALUE; while (diff < 3) { - val1 = *SA110_TIMER3_VALUE; while ((val2 = *SA110_TIMER3_VALUE) == val1) ; if (*SA110_TIMER3_LOAD) { // A kernel is running, the counter may get reset as we watch
--- a/packages/hal/powerpc/arch/current/ChangeLog +++ b/packages/hal/powerpc/arch/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * src/hal_intr.c (hal_delay_us): Fix some problems - didn't + always work properly, especially on fast processors. + 2000-11-21 Gary Thomas <gthomas@redhat.com> * src/vectors.S (rom_vectors): Special handling when vectors
--- a/packages/hal/powerpc/arch/current/src/hal_intr.c +++ b/packages/hal/powerpc/arch/current/src/hal_intr.c @@ -61,21 +61,30 @@ hal_IRQ_init(void) externC void hal_delay_us(int us) { - cyg_uint32 old_dec, new_dec; + cyg_int32 old_dec, new_dec; long ticks; + int diff; + // Note: the system constant CYGNUM_HAL_RTC_PERIOD corresponds to 10,000us // Scale the desired number of microseconds to be a number of decrementer ticks + // Note: this test says "if there is more than one decrementer tick / us" if (CYGNUM_HAL_RTC_PERIOD > 10000) { - ticks = us * (CYGNUM_HAL_RTC_PERIOD * 100) / 1000000; + ticks = ((long long)us * (CYGNUM_HAL_RTC_PERIOD * 100)) / 1000000; } else { ticks = us / (CYGNUM_HAL_RTC_PERIOD * 100) / 1000000; } asm volatile("mfdec %0;" : "=r"(old_dec) : ); - while (ticks-- > 0) { + while (ticks > 0) { do { asm volatile("mfdec %0;" : "=r"(new_dec) : ); } while (old_dec == new_dec); + if (new_dec < 0) { + HAL_CLOCK_RESET(0, CYGNUM_HAL_RTC_PERIOD); + } + diff = (old_dec - new_dec); + if (diff < 1) diff = 1; old_dec = new_dec; + ticks -= diff; } }
--- a/packages/hal/powerpc/mbx/current/ChangeLog +++ b/packages/hal/powerpc/mbx/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * cdl/hal_powerpc_mbx.cdl: Let RTC [heartbeat] rate be user + specified. + 2000-10-20 Gary Thomas <gthomas@redhat.com> * include/pkgconf/mlt_powerpc_mbx_ram.mlt:
--- a/packages/hal/powerpc/mbx/current/cdl/hal_powerpc_mbx.cdl +++ b/packages/hal/powerpc/mbx/current/cdl/hal_powerpc_mbx.cdl @@ -154,6 +154,7 @@ cdl_package CYGPKG_HAL_POWERPC_MBX { description " Period is busclock/16/100." flavor none + no_define cdl_option CYGNUM_HAL_RTC_NUMERATOR { display "Real-time clock numerator" @@ -163,12 +164,15 @@ cdl_package CYGPKG_HAL_POWERPC_MBX { cdl_option CYGNUM_HAL_RTC_DENOMINATOR { display "Real-time clock denominator" flavor data - calculated 100 + default_value 100 + description " + This option selects the number of system clock 'ticks' + per second. This rate is sometimes known as the heartbeat rate." } cdl_option CYGNUM_HAL_RTC_PERIOD { display "Real-time clock period" flavor data - calculated { (((CYGHWR_HAL_POWERPC_BOARD_SPEED*1000000)/16)/100) } + calculated { (((CYGHWR_HAL_POWERPC_BOARD_SPEED*1000000)/16)/CYGNUM_HAL_RTC_DENOMINATOR) } } } @@ -346,6 +350,7 @@ cdl_package CYGPKG_HAL_POWERPC_MBX { <PREFIX>/bin/redboot.bin : <PREFIX>/bin/redboot.elf $(OBJCOPY) --strip-debug $< $(@:.bin=.img) $(OBJCOPY) -O srec $< $(@:.bin=.srec) + $(OBJCOPY) -O srec --change-address=0x02040000 $< $(@:.bin=.ppcbug) $(OBJCOPY) -O binary $< $@ } }
--- a/packages/hal/powerpc/quicc/current/ChangeLog +++ b/packages/hal/powerpc/quicc/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * include/ppc8xx.h: Layout of I2C and IDMA was [slightly] wrong. + 2000-08-30 Jesper Skov <jskov@redhat.com> * src/quicc_smc1.c (cyg_hal_plf_serial_init_channel): Move all
--- a/packages/hal/powerpc/quicc/current/include/ppc8xx.h +++ b/packages/hal/powerpc/quicc/current/include/ppc8xx.h @@ -880,7 +880,7 @@ typedef struct eppc { union { struct { struct i2c_pram i2c; - unsigned char RSRVD56[0x18]; + unsigned char RSRVD56[0x10]; struct idma_pram idma1; } i2c_idma; struct {
--- a/packages/hal/sh/arch/current/ChangeLog +++ b/packages/hal/sh/arch/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-04 Jesper Skov <jskov@redhat.com> + + * src/sh.ld: Make sure .data and .bss section sizes are aligned. + 2000-12-13 Jesper Skov <jskov@redhat.com> 2000-12-13 Jonathan Larmour <jlarmour@redhat.com>
--- a/packages/hal/sh/arch/current/src/sh.ld +++ b/packages/hal/sh/arch/current/src/sh.ld @@ -82,6 +82,7 @@ GROUP(libtarget.a libgcc.a) . = ALIGN(8); \ KEEP(*( SORT (.ecos.table.*))) ; \ *(.got*) *(.rela.got) \ + . = ALIGN(4); \ } > _region_ \ CYG_LABEL_DEFN(_rom_data_start) = LOADADDR(.data); \ CYG_LABEL_DEFN(_ram_data_end) = .; PROVIDE(_ram_data_end = .); \ @@ -119,6 +120,7 @@ GROUP(libtarget.a libgcc.a) .bss _vma_ : _lma_ \ { CYG_LABEL_DEFN(_bss_start) = ABSOLUTE (.); \ FORCE_OUTPUT; *(.dynbss) *(.bss) *(COMMON) \ + . = ALIGN(4); \ CYG_LABEL_DEFN(_bss_end) = ABSOLUTE (.); } \ > _region_
--- a/packages/io/eth/current/ChangeLog +++ b/packages/io/eth/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-04 Gary Thomas <gthomas@redhat.com> + + * src/net/eth_drv.c (eth_drv_tx_done): Update count of Tx packets. + 2000-12-11 Gary Thomas <gthomas@redhat.com> * src/net/eth_drv.c (eth_drv_run_deliveries): Support ^C when
--- a/packages/io/eth/current/src/net/eth_drv.c +++ b/packages/io/eth/current/src/net/eth_drv.c @@ -556,7 +556,9 @@ eth_drv_tx_done(struct eth_drv_sc *sc, C { struct ifnet *ifp = &sc->sc_arpcom.ac_if; struct mbuf *m0 = (struct mbuf *)key; + // Check for errors here (via 'status') + ifp->if_opackets++; // Done with packet mbuf_key = m0; m_freem(m0);
--- a/packages/io/pci/current/ChangeLog +++ b/packages/io/pci/current/ChangeLog @@ -1,3 +1,20 @@ +2001-01-02 Hugo Tyson <hmt@redhat.com> + + * include/pci.h: Define new API to perform more generalized matching + on device properties. + + * src/pci.c (cyg_pci_find_matching): New API implementation. + +2000-12-21 Mark Salter <msalter@redhat.com> + + * include/pci_hw.h: Add platform hook so certain devices + can be skipped by generic PCI io code. This is a workaround + for a hw problem where configuration space cycles on some + devices cause a bus lockup. + + * src/pci.c (cyg_pci_find_next): Use platform hook to ignore + certain devices during device search. + 2000-12-02 Gary Thomas <gthomas@redhat.com> * src/pci.c:
--- a/packages/io/pci/current/include/pci.h +++ b/packages/io/pci/current/include/pci.h @@ -205,6 +205,26 @@ externC cyg_bool cyg_pci_find_device( cy externC cyg_bool cyg_pci_find_class( cyg_uint32 dev_class, cyg_pci_device_id *devid ); + + +// Searches the PCI bus configuration space for a device whose properties +// match those required by the match_func, which the user supplies. The +// match_func's arguments are vendor, device, class exactly as they might +// be in the two APIs above. The additional parameter is for any state +// which a caller might wish available to its callback routine. +// The search starts at the device pointed to by +// devid, or at the first slot if it contains CYG_PCI_NULL_DEVID. *devid +// will be updated with the ID of the next device found. Returns true if +// one is found and false if not. +typedef cyg_bool (cyg_pci_match_func)( cyg_uint16,/* vendor */ + cyg_uint16,/* device */ + cyg_uint32,/* class */ + void * /* arbitrary user data */ ); +externC cyg_bool cyg_pci_find_matching( cyg_pci_match_func *matchp, + void * match_callback_data, + cyg_pci_device_id *devid ); + + // Searches the PCI configuration space for the next valid device // after cur_devid. If cur_devid is given the value // CYG_PCI_NULL_DEVID, then the search starts at the first slot. It
--- a/packages/io/pci/current/include/pci_hw.h +++ b/packages/io/pci/current/include/pci_hw.h @@ -69,6 +69,16 @@ #define CYG_PCI_DEV_GET_DEV(__devfn) ((__devfn>>3)&0x1f) #define CYG_PCI_DEV_GET_FN(__devfn) (__devfn&0x7) +// Some buggy PCI chips force us to ignore certain devices so that +// they may be handled specially. +#ifdef HAL_PCI_IGNORE_DEVICE +#define CYG_PCI_IGNORE_DEVICE(__bus, __dev, __fn) \ + HAL_PCI_IGNORE_DEVICE((__bus), (__dev), (__fn)) +#else +#define CYG_PCI_IGNORE_DEVICE(__bus, __dev, __fn) 0 +#endif + + // Init externC void cyg_pcihw_init(void); @@ -97,3 +107,4 @@ externC cyg_bool cyg_pcihw_translate_int //----------------------------------------------------------------------------- #endif // ifndef CYGONCE_PCI_HW_H // End of pci_hw.h +
--- a/packages/io/pci/current/src/pci.c +++ b/packages/io/pci/current/src/pci.c @@ -448,6 +448,10 @@ cyg_pci_find_next( cyg_pci_device_id cur for (;dev < CYG_PCI_MAX_DEV; dev++, fn=0) { for (;fn < CYG_PCI_MAX_FN; fn++) { cyg_uint16 vendor; + + if (CYG_PCI_IGNORE_DEVICE(bus, dev, fn)) + continue; + devfn = CYG_PCI_DEV_MAKE_DEVFN(dev, fn); cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_VENDOR, &vendor); @@ -528,6 +532,44 @@ cyg_pci_find_class( cyg_uint32 dev_class return false; } +cyg_bool +cyg_pci_find_matching( cyg_pci_match_func *matchp, + void * match_callback_data, + cyg_pci_device_id *devid ) +{ + cyg_pci_device_id new_devid = *devid; + +#ifdef CYGPKG_IO_PCI_DEBUG + printf("cyg_pci_find_matching - func is at %x\n", (unsigned int)matchp); +#endif + // Scan entire bus, check for matches on valid devices. + while (cyg_pci_find_next(new_devid, &new_devid)) { + cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(new_devid); + cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(new_devid); + cyg_uint16 v, d; + cyg_uint32 c; + + // Check that vendor, device and class match. + cyg_pcihw_read_config_uint16(bus, devfn, + CYG_PCI_CFG_VENDOR, &v); + cyg_pcihw_read_config_uint16(bus, devfn, + CYG_PCI_CFG_DEVICE, &d); + cyg_pcihw_read_config_uint32(bus, devfn, + CYG_PCI_CFG_CLASS_REV, &c); + c >>= 8; +#ifdef CYGPKG_IO_PCI_DEBUG + printf("... PCI vendor = %x, device = %x, class %x\n", v, d, c); +#endif + // Check that device matches as the caller desires: + if ( (*matchp)(v, d, c, match_callback_data) ) { + *devid = new_devid; + return true; + } + } + + return false; +} + //------------------------------------------------------------------------ // Resource Allocation
--- a/packages/kernel/current/ChangeLog +++ b/packages/kernel/current/ChangeLog @@ -1,3 +1,30 @@ +2000-12-22 Jonathan Larmour <jlarmour@redhat.com> + + * include/thread.inl (check_stack): check word alignment with CYG_WORD + not cyg_uint32 + Add extra stack checking for when stack limits are used. + (measure_stack_usage): New function to measure stack usage of the thread + (attach_stack): check word alignment with CYG_WORD not cyg_uint32 + Initialize stack to preset value when measuring stack usage + (increment_stack_limit): Conditionalize here wrt + CYGFUN_KERNEL_THREADS_STACK_CHECKING and use the version in thread.cxx + instead if CYGFUN_KERNEL_THREADS_STACK_CHECKING is defined. + + * src/common/thread.cxx (exit): If verbose stack measurement enabled, + output stack usage + (increment_stack_limit): Add version of this method when + CYGFUN_KERNEL_THREADS_STACK_CHECKING *is* defined. This will add + padding above the stack limit as necessary. + + * include/thread.hxx (class Cyg_HardwareThread): Add + measure_stack_usage() member + + * cdl/thread.cdl (CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT): + Add to implement stack usage measurement. + + * include/kapi.h (cyg_thread_measure_stack_usage): New function + * src/common/kapi.cxx (cyg_thread_measure_stack_usage): New function + 2000-12-08 Jonathan Larmour <jlarmour@redhat.com> * cdl/thread.cdl (CYGFUN_KERNEL_ALL_THREADS_STACK_CHECKING):
--- a/packages/kernel/current/cdl/thread.cdl +++ b/packages/kernel/current/cdl/thread.cdl @@ -120,6 +120,28 @@ cdl_component CYGFUN_KERNEL_THREADS_STAC } } +cdl_component CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT { + display "Measure stack usage" + default_value { 0 != CYGPKG_INFRA_DEBUG } + description " + This option allows measurement of each thread's stack by initializing + it to a predefined value at thread creation time. Later use of the + cyg_thread_measure_stack_usage() function allows the maximum stack + usage of the thread so far to be obtained. Note that this is not + necessarily the true maximum stack usage that the thread will ever + use since all that has been measured is the stack usage corresponding + to the code path followed this time, and not the code path that may + be followed in future." + + cdl_option CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT { + display "Output stack usage on thread exit" + default_value 0 + description " + This will output the measured stack usage on the diagnostic + output when a thread exits." + } +} + cdl_component CYGVAR_KERNEL_THREADS_DATA { display "Support for per-thread data" requires CYGFUN_KERNEL_THREADS_STACK_LIMIT
--- a/packages/kernel/current/include/kapi.h +++ b/packages/kernel/current/include/kapi.h @@ -186,6 +186,9 @@ cyg_addrword_t cyg_thread_get_stack_base cyg_uint32 cyg_thread_get_stack_size(cyg_handle_t thread); +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT +cyg_uint32 cyg_thread_measure_stack_usage(cyg_handle_t thread); +#endif /*---------------------------------------------------------------------------*/ /* Per-thread Data */
--- a/packages/kernel/current/include/thread.hxx +++ b/packages/kernel/current/include/thread.hxx @@ -162,6 +162,11 @@ public: inline void check_stack(void); #endif +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT + + inline cyg_uint32 measure_stack_usage(void); + +#endif }; // -------------------------------------------------------------------------
--- a/packages/kernel/current/include/thread.inl +++ b/packages/kernel/current/include/thread.inl @@ -86,10 +86,10 @@ inline void Cyg_HardwareThread::check_st cyg_uint32 sig = (cyg_uint32)this; cyg_uint32 *base = (cyg_uint32 *)get_stack_base(); cyg_uint32 *top = (cyg_uint32 *)(stack_base + stack_size); - unsigned int i; + cyg_ucount32 i; - CYG_ASSERT( 0 == (3 & (cyg_uint32)base), "stack base not word aligned" ); - CYG_ASSERT( 0 == (3 & (cyg_uint32)top), "stack top not word aligned" ); + CYG_ASSERT( 0 == ((sizeof(CYG_WORD)-1) & (cyg_uint32)base), "stack base not word aligned" ); + CYG_ASSERT( 0 == ((sizeof(CYG_WORD)-1) & (cyg_uint32)top), "stack top not word aligned" ); CYG_ASSERT( (cyg_uint32)stack_ptr > (cyg_uint32)stack_base, "Stack_ptr below base" ); @@ -102,6 +102,47 @@ inline void Cyg_HardwareThread::check_st CYG_ASSERT( (sig ^ (i * 0x01010101)) == base[i], "Stack base corrupt" ); CYG_ASSERT( (sig ^ (i * 0x10101010)) == top[i], "Stack top corrupt" ); } + +#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT + // we won't have added check data above the stack limit if it hasn't + // been incremented + if (stack_limit != stack_base) { + CYG_ADDRESS limit = stack_limit; + // the limit will be off by the check data size, so lets correct it + limit -= CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE; + + // determine base of check data by rounding up to nearest word aligned + // address if not already aligned + cyg_uint32 *p = (cyg_uint32 *)((limit + 3) & ~3); + // i.e. + sizeof(cyg_uint32)-1) & ~(sizeof(cyg_uint32)-1); + + for ( i = 0; + i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32); + i++ ) { + CYG_ASSERT( (sig ^ (i * 0x01010101)) == p[i], + "Gap between stack limit and base corrupt" ); + } + } +#endif +} +#endif + +// ------------------------------------------------------------------------- +// Measure the stack usage of the thread +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT +inline cyg_uint32 Cyg_HardwareThread::measure_stack_usage(void) +{ + CYG_WORD *base = (CYG_WORD *)stack_base; + cyg_uint32 size = stack_size/sizeof(CYG_WORD); + cyg_ucount32 i; + + // Work up the stack comparing with the preset value + // We assume the stack grows downwards, hmm... + for (i=0; i<size; i++) { + if (base[i] != 0xDEADBEEF) + break; + } + return (size - i)*sizeof(CYG_WORD); } #endif @@ -124,8 +165,8 @@ inline void Cyg_HardwareThread::attach_s unsigned int i; - CYG_ASSERT( 0 == (3 & (cyg_uint32)base), "stack base alignment" ); - CYG_ASSERT( 0 == (3 & (cyg_uint32)top), "stack top alignment" ); + CYG_ASSERT( 0 == ((sizeof(CYG_WORD)-1) & (cyg_uint32)base), "stack base alignment" ); + CYG_ASSERT( 0 == ((sizeof(CYG_WORD)-1) & (cyg_uint32)top), "stack top alignment" ); for ( i = 0; i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32); @@ -145,7 +186,24 @@ inline void Cyg_HardwareThread::attach_s "Stack size too small after allocating checking buffer"); } #endif +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT + { + CYG_WORD *base = (CYG_WORD *)s_base; + cyg_uint32 size = s_size/sizeof(CYG_WORD); + cyg_ucount32 i; + // initialize all of stack with known value - don't choose 0 + // could do with pseudo value as above, but this way, checking + // is faster + for (i=0; i<size; i++) { + base[i] = 0xDEADBEEF; + } + // Don't bother about the case when the stack isn't a multiple of + // CYG_WORD in size. Since it's at the top of the stack, it will + // almost certainly be overwritten the instant the thread starts + // anyway. + } +#endif stack_base = s_base; stack_size = s_size; #ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT @@ -269,12 +327,15 @@ inline CYG_ADDRWORD Cyg_HardwareThread:: #ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT -inline void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size) +#ifndef CYGFUN_KERNEL_THREADS_STACK_CHECKING +// if stack checking, implementation is in thread.cxx +inline void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size ) { + void *ret = (void *)stack_limit; stack_limit += size; - return (void *)(stack_limit - size); + return ret; } - +#endif inline CYG_ADDRESS Cyg_HardwareThread::get_stack_limit()
--- a/packages/kernel/current/src/common/kapi.cxx +++ b/packages/kernel/current/src/common/kapi.cxx @@ -277,6 +277,12 @@ externC cyg_uint32 cyg_thread_get_stack_ return ((Cyg_Thread *)thread)->get_stack_size(); } +#ifdef CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT +externC cyg_uint32 cyg_thread_measure_stack_usage(cyg_handle_t thread) +{ + return ((Cyg_Thread *)thread)->measure_stack_usage(); +} +#endif /*---------------------------------------------------------------------------*/ /* Per-thread data */
--- a/packages/kernel/current/src/common/thread.cxx +++ b/packages/kernel/current/src/common/thread.cxx @@ -60,6 +60,10 @@ #include <cyg/kernel/sched.inl> // scheduler inlines #include <cyg/kernel/clock.inl> // clock inlines +#ifdef CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT +#include <cyg/infra/diag.h> +#endif + // ========================================================================= // Cyg_HardwareThread members @@ -302,6 +306,9 @@ Cyg_Thread::check_this( cyg_assert_class // of the executing thread. if( (stack_ptr > (stack_base + stack_size)) || (stack_ptr < stack_base) ) return false; +#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT + if( stack_ptr < stack_limit ) return false; +#endif case cyg_trivial: case cyg_none: default: @@ -718,6 +725,11 @@ Cyg_Thread::exit() Cyg_Thread *self = Cyg_Thread::self(); +#ifdef CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT + diag_printf( "Stack usage for thread %08x: %d\n", self, + self->measure_stack_usage() ); +#endif + Cyg_Scheduler::lock(); // clear the timer; if there was none, no worries. @@ -1031,6 +1043,56 @@ void Cyg_Thread::free_data_index( cyg_uc #endif +// ------------------------------------------------------------------------- +// Allocate some memory at the lower end of the stack +// by moving the stack limit pointer. + +#if defined(CYGFUN_KERNEL_THREADS_STACK_LIMIT) && \ + defined(CYGFUN_KERNEL_THREADS_STACK_CHECKING) +// if not doing stack checking, implementation can be found in thread.inl +// This implementation puts the magic buffer area (to watch for overruns +// *above* the stack limit, i.e. there is no official demarcation between +// the stack and the buffer. But that's okay if you think about it... having +// a demarcation would not accomplish anything more. +void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size ) +{ + void *ret = (void *)stack_limit; + + // First lock the scheduler because we're going to be tinkering with + // the check data + Cyg_Scheduler::lock(); + + // if we've inc'd the limit before, it will be off by the check data + // size, so lets correct it + if (stack_limit != stack_base) + stack_limit -= CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE; + stack_limit += size; + + // determine base of check data by rounding up to nearest word aligned + // address if not already aligned + cyg_uint32 *p = (cyg_uint32 *)((stack_limit + 3) & ~3); + // i.e. + sizeof(cyg_uint32)-1) & ~(sizeof(cyg_uint32)-1); + cyg_ucount32 i; + cyg_uint32 sig = (cyg_uint32)this; + + for ( i = 0; + i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32); + i++ ) { + p[i] = (sig ^ (i * 0x01010101)); + } + + // increment limit by the check size. Note this will not necessarily + // reach the end of the check data. But that doesn't really matter. + // Doing this allows better checking of the saved stack pointer in + // Cyg_Thread::check_this() + stack_limit += CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE; + + Cyg_Scheduler::unlock(); + + return ret; +} +#endif + // ========================================================================= // Cyg_ThreadTimer member functions
--- a/packages/language/c/libc/startup/current/ChangeLog +++ b/packages/language/c/libc/startup/current/ChangeLog @@ -1,3 +1,15 @@ +2000-12-22 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/startup.cdl: Allow others to say whether main() can be invoked + elsewhere. + Use defaults for startup context implementor using above interface + rather than POSIX pthread package. + Allow main() stack to be visible for other implementors, except + when called from the init context since the stack size isn't used + there, or when the implementation says it doesn't use it. + Define an interface to express that the stack size option + isn't used in such cases. + 2000-10-12 Jonathan Larmour <jlarmour@redhat.com> * cdl/startup.cdl (CYGSEM_LIBC_INVOKE_DEFAULT_STATIC_CONSTRUCTORS):
--- a/packages/language/c/libc/startup/current/cdl/startup.cdl +++ b/packages/language/c/libc/startup/current/cdl/startup.cdl @@ -68,6 +68,13 @@ cdl_package CYGPKG_LIBC_STARTUP { # ==================================================================== + cdl_interface CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE { + display "main() can be invoked elsewhere" + description "Implementors of this interface show that they + allow main() to be invoked elsewhere." + flavor bool + no_define + } cdl_option CYGDAT_LIBC_ARGUMENTS { display "Arguments to main()" @@ -97,6 +104,7 @@ cdl_package CYGPKG_LIBC_STARTUP { cdl_interface CYGINT_LIBC_STARTUP_CONTEXT { display "Startup context implementors" + no_define } @@ -116,21 +124,24 @@ cdl_package CYGPKG_LIBC_STARTUP { re-entrant functions from within main() in this case." flavor bool - default_value { 0 == CYGPKG_KERNEL && 0 == CYGPKG_POSIX_PTHREAD } + default_value { 0 == CYGPKG_KERNEL && 0 == + CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE } implements CYGINT_LIBC_STARTUP_CONTEXT + implements CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE } cdl_component CYGSEM_LIBC_STARTUP_MAIN_THREAD { display "Invoked as eCos thread" requires CYGPKG_KERNEL flavor bool - default_value { 0 != CYGPKG_KERNEL && 0 == CYGPKG_POSIX_PTHREAD } + default_value { 0 != CYGPKG_KERNEL && 0 == \ + CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE } implements CYGINT_LIBC_STARTUP_CONTEXT description " With this option selected, main() is invoked from an eCos thread." - cdl_component CYGSEM_LIBC_MAIN_STACK_FROM_SYSTEM { + cdl_option CYGSEM_LIBC_MAIN_STACK_FROM_SYSTEM { display "System provides stack for main()'s thread" description " This option controls whether the stack of @@ -145,24 +156,6 @@ cdl_package CYGPKG_LIBC_STARTUP { This must be a multiple of 8." flavor bool default_value 1 - - cdl_option CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE { - display "main()'s default thread stack size" - flavor data - legal_values 16 to 0x7fffffff - default_value 8192 - description " - With an eCos kernel, when the cyg_iso_c_start() - function is used to invoke the user-supplied - main() function in an ISO C compatible fashion, - a separate thread is created to call main(). - This option controls the size of that thread's - stack, which is allocated in the BSS. It - must be a multiple of 8. Note, a low number - here may be overriden by the HAL if there is - a minimum requirement to process interrupts - etc." - } } cdl_option CYGNUM_LIBC_MAIN_THREAD_PRIORITY { @@ -185,11 +178,45 @@ cdl_package CYGPKG_LIBC_STARTUP { description "With this option selected, main() must be invoked by a separate package, or by the user." flavor bool - default_value { 0 != CYGPKG_POSIX_PTHREAD } + default_value { 0 != \ + CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE } + requires CYGINT_LIBC_STARTUP_EXTERNAL_INVOKE_MAIN_POSSIBLE implements CYGINT_LIBC_STARTUP_CONTEXT } } + cdl_interface CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE { + display "Don't allow main()'s stack size to be set" + description "This interface describes whether the stack size + value set in this package is supported by the + implementation that invokes main. If not, that + option is disabled." + flavor bool + no_define + } + + cdl_option CYGNUM_LIBC_MAIN_DEFAULT_STACK_SIZE { + display "main()'s default thread stack size" + flavor data + legal_values 16 to 0x7fffffff + default_value 8192 + active_if !CYGINT_LIBC_STARTUP_MAIN_NO_STACK_SIZE + description " + This option sets the size of the stack used + in the context that invokes main(). For example, + with an eCos kernel, when the cyg_iso_c_start() + function is used to invoke the user-supplied + main() function in an ISO C compatible fashion, + a separate thread is created to call main(). + This option controls the size of that thread's + stack, which is allocated in the BSS. It + must be a multiple of 8. Note, a low number + here may be overriden by the HAL if there is + a minimum requirement to process interrupts + etc. This option cannot be set if the implementation + that invokes main() does not use it." + } + cdl_component CYGFUN_LIBC_ATEXIT { display "Include atexit() function" flavor bool
--- a/packages/net/tcpip/current/ChangeLog +++ b/packages/net/tcpip/current/ChangeLog @@ -1,3 +1,24 @@ +2001-01-03 Hugo Tyson <hmt@redhat.com> + + * tests/linux_echo.c: New file to test for network bandwidth + limitations in host side. Builds to a linux version of the + tcp_echo middleman. + + * tests/make.linux (all): Build linux_echo. + +2001-01-03 Hugo Tyson <hmt@redhat.com> + + * include/dhcp.h (struct dhcp_lease): Define the semaphore pointer + field in each lease structure. + + * src/lib/dhcp_support.c: Initialize the dhcp_lease structs to + point to the semaphore "dhcp_needs_attention". + + * src/lib/dhcp_prot.c (alarm_function): Post to the semaphore + pointed to in the lease structure, rather than one hard-coded. + This is much cleaner, in that dhcp_prot.c now uses no external + variables, all state goes through the API. + 2000-11-15 Hugo Tyson <hmt@redhat.com> * src/lib/bootp_support.c (init_net): Do a SIOCSIFADDR a 2nd time @@ -1163,7 +1184,7 @@ 2000-02-08 John Dallaway <jld@cygnus.c // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- //
--- a/packages/net/tcpip/current/include/dhcp.h +++ b/packages/net/tcpip/current/include/dhcp.h @@ -113,9 +113,11 @@ extern cyg_uint8 eth0_dhcpstate; extern cyg_uint8 eth1_dhcpstate; #endif -// This is public so the app wait on it or poll it when managing DHCP +// This is public so the app can wait on it or poll it when managing DHCP // itself. It will be zero while the app should wait, and posted when a -// call to do_dhcp() is needed. +// call to do_dhcp() is needed. If, instead, the app wishes to manage DHCP +// with a thread per interface somehow, then separate semaphores may be used. +// See the dhcp_lease structure definition below. extern cyg_sem_t dhcp_needs_attention; // This routine is used at startup time, and after relinquishing leases or @@ -220,13 +222,20 @@ extern void dhcp_mgt_entry( cyg_addrword #define DHCP_LEASE_EX 4 struct dhcp_lease { + // Client settable: Semaphore to signal when attention is needed: + cyg_sem_t *needs_attention; + // Initialize all the rest to zero: cyg_tick_count_t t1, t2, expiry; volatile cyg_uint8 next; volatile cyg_uint8 which; cyg_handle_t alarm; + // except this one, which is just some space: cyg_alarm alarm_obj; }; +// These dhcp_lease objects are initialized to use +// extern cyg_sem_t dhcp_needs_attention; +// for the semaphore. #ifdef CYGHWR_NET_DRIVER_ETH0 extern struct dhcp_lease eth0_lease; #endif
--- a/packages/net/tcpip/current/src/lib/dhcp_prot.c +++ b/packages/net/tcpip/current/src/lib/dhcp_prot.c @@ -271,7 +271,8 @@ static void alarm_function(cyg_handle_t { struct dhcp_lease *lease = (struct dhcp_lease *)data; lease->which |= lease->next; - cyg_semaphore_post( &dhcp_needs_attention ); + if ( lease->needs_attention ) + cyg_semaphore_post( lease->needs_attention ); // Step the lease on into its next state of being alarmed ;-) if ( lease->next & DHCP_LEASE_EX ) {
--- a/packages/net/tcpip/current/src/lib/dhcp_support.c +++ b/packages/net/tcpip/current/src/lib/dhcp_support.c @@ -60,10 +60,10 @@ cyg_uint8 eth1_dhcpstate = 0; cyg_sem_t dhcp_needs_attention; #ifdef CYGHWR_NET_DRIVER_ETH0 -struct dhcp_lease eth0_lease = { 0,0,0,0 }; +struct dhcp_lease eth0_lease = { &dhcp_needs_attention, 0,0,0,0,0,0 }; #endif #ifdef CYGHWR_NET_DRIVER_ETH1 -struct dhcp_lease eth1_lease = { 0,0,0,0 }; +struct dhcp_lease eth1_lease = { &dhcp_needs_attention, 0,0,0,0,0,0 }; #endif // ---------------------------------------------------------------------------
new file mode 100644 --- /dev/null +++ b/packages/net/tcpip/current/tests/linux_echo.c @@ -0,0 +1,304 @@ +//========================================================================== +// +// tests/linux_echo.c +// +// Simple TCP throughput test - echo component FOR LINUX HOST +// * CAUTION: host, i.e. non eCos, only * +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources, +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2000-01-10 +// Purpose: +// Description: This is the middle part of a three part test. The idea is +// to test the throughput of box in a configuration like this: +// +// +------+ port +----+ port +----+ +// |SOURCE|=========>|ECHO|============>|SINK| +// +------+ 9990 +----+ 9991 +----+ +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#undef _KERNEL +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> + +#include <sys/param.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/time.h> + +#include <net/if.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip_icmp.h> +#include <net/route.h> + +#include <netdb.h> + +#define true 1 +#define false 1 + +#define TNR_ON() +#define TNR_OFF() + +#define diag_printf printf + +void +pexit(char *s) +{ + perror(s); + exit(1); +} + + +#define SOURCE_PORT 9990 +#define SINK_PORT 9991 + +#define MAX_BUF 8192 +static unsigned char data_buf[MAX_BUF]; + +struct test_params { + long nbufs; + long bufsize; + long load; +}; + +struct test_status { + long ok; +}; + +int max( int a, int b ) { return (a>b)?a:b; } +int min( int a, int b ) { return (a<b)?a:b; } + + +int +do_read(int s, void *_buf, int len) +{ + int total, slen, rlen; + unsigned char *buf = (unsigned char *)_buf; + total = 0; + rlen = len; + while (total < len) { + slen = read(s, buf, rlen); + if (slen != rlen) { + if (slen < 0) { + diag_printf("Error after reading %d bytes\n", total); + return -1; + } + rlen -= slen; + buf += slen; + } + total += slen; + } + return total; +} + +int +do_write(int s, void *_buf, int len) +{ + int total, slen, rlen; + unsigned char *buf = (unsigned char *)_buf; + total = 0; + rlen = len; + while (total < len) { + slen = write(s, buf, rlen); + if (slen != rlen) { + if (slen < 0) { + diag_printf("Error after writing %d bytes\n", total); + return -1; + } + rlen -= slen; + buf += slen; + } + total += slen; + } + return total; +} + +static void +echo_test(void * p) +{ + int s_source, s_sink, e_source, e_sink; + struct sockaddr_in e_source_addr, e_sink_addr, local; + int one = 1; + fd_set in_fds; + int i, num, len; + struct test_params params,nparams; + struct test_status status,nstatus; + + s_source = socket(AF_INET, SOCK_STREAM, 0); + if (s_source < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; +// local.sin_len = sizeof(local); + local.sin_port = ntohs(SOURCE_PORT); + local.sin_addr.s_addr = INADDR_ANY; + if(bind(s_source, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /source/ error"); + } + if (setsockopt(s_source, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) { + pexit("setsockopt /source/ SO_REUSEADDR"); + } + listen(s_source, SOMAXCONN); + + s_sink = socket(AF_INET, SOCK_STREAM, 0); + if (s_sink < 0) { + pexit("stream socket"); + } + memset(&local, 0, sizeof(local)); + local.sin_family = AF_INET; +// local.sin_len = sizeof(local); + local.sin_port = ntohs(SINK_PORT); + local.sin_addr.s_addr = INADDR_ANY; + if(bind(s_sink, (struct sockaddr *) &local, sizeof(local)) < 0) { + pexit("bind /sink/ error"); + } + if (setsockopt(s_sink, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) { + pexit("setsockopt /sink/ SO_REUSEADDR"); + } + listen(s_sink, SOMAXCONN); + + e_source = 0; e_sink = 0; + while (true) { + // Wait for a connection on either of the ports + FD_ZERO(&in_fds); + FD_SET(s_source, &in_fds); + FD_SET(s_sink, &in_fds); + num = select(max(s_sink,s_source)+1, &in_fds, 0, 0, 0); + if (FD_ISSET(s_source, &in_fds)) { + len = sizeof(e_source_addr); + if ((e_source = accept(s_source, (struct sockaddr *)&e_source_addr, &len)) < 0) { + pexit("accept /source/"); + } + diag_printf("SOURCE connection from %s:%d\n", + inet_ntoa(e_source_addr.sin_addr), ntohs(e_source_addr.sin_port)); + } + if (FD_ISSET(s_sink, &in_fds)) { + len = sizeof(e_sink_addr); + if ((e_sink = accept(s_sink, (struct sockaddr *)&e_sink_addr, &len)) < 0) { + pexit("accept /sink/"); + } + diag_printf("SINK connection from %s:%d\n", + inet_ntoa(e_sink_addr.sin_addr), ntohs(e_sink_addr.sin_port)); + } + // Continue with test once a connection is established in both directions + if ((e_source != 0) && (e_sink != 0)) { + break; + } + } + + // Wait for "source" to tell us the testing paramters + if (do_read(e_source, &nparams, sizeof(nparams)) != sizeof(nparams)) { + pexit("Can't read initialization parameters"); + } + + params.nbufs = ntohl(nparams.nbufs); + params.bufsize = ntohl(nparams.bufsize); + params.load = ntohl(nparams.load); + + diag_printf("Using %d buffers of %d bytes each, %d%% background load\n", + params.nbufs, params.bufsize, params.load); + + // Tell the sink what the parameters are + if (do_write(e_sink, &nparams, sizeof(nparams)) != sizeof(nparams)) { + pexit("Can't write initialization parameters"); + } + + status.ok = 1; + nstatus.ok = htonl(status.ok); + + // Tell the "source" to start - we're all connected and ready to go! + if (do_write(e_source, &nstatus, sizeof(nstatus)) != sizeof(nstatus)) { + pexit("Can't send ACK to 'source' host"); + } + + TNR_ON(); + + // Echo the data from the source to the sink hosts + for (i = 0; i < params.nbufs; i++) { + if ((len = do_read(e_source, data_buf, params.bufsize)) != params.bufsize) { + TNR_OFF(); + diag_printf("Can't read buf #%d: ", i+1); + if (len < 0) { + perror("I/O error"); + } else { + diag_printf("short read - only %d bytes\n", len); + } + TNR_ON(); + } + if ((len = do_write(e_sink, data_buf, params.bufsize)) != params.bufsize) { + TNR_OFF(); + diag_printf("Can't write buf #%d: ", i+1); + if (len < 0) { + perror("I/O error"); + } else { + diag_printf("short write - only %d bytes\n", len); + } + TNR_ON(); + } + } + + TNR_OFF(); + + // Wait for the data to drain and the "sink" to tell us all is OK. + if (do_read(e_sink, &status, sizeof(status)) != sizeof(status)) { + pexit("Can't receive ACK from 'sink' host"); + } + +} + + +int +main(int argc, char *argv[]) +{ + echo_test(argv[1]); + return 0; +} + + +// EOF +
--- a/packages/net/tcpip/current/tests/make.linux +++ b/packages/net/tcpip/current/tests/make.linux @@ -5,7 +5,7 @@ CC = cc CFLAGS = -O2 -g -all: nc_test_master nc_test_slave tcp_source tcp_sink +all: nc_test_master nc_test_slave tcp_source tcp_sink linux_echo nc_test_master: nc_test_framework.h nc_test_master.c $(CC) -o $@ ${CFLAGS} nc_test_master.c @@ -19,3 +19,6 @@ tcp_source: tcp_source.c tcp_sink: tcp_sink.c $(CC) -o $@ ${CFLAGS} tcp_sink.c +linux_echo: linux_echo.c + $(CC) -o $@ ${CFLAGS} linux_echo.c +
--- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,17 @@ +2001-01-03 Gary Thomas <gthomas@redhat.com> + + * src/main.c (do_version): Update copyright for 2001. + + * src/io.c (gets): Use timeout provided [was hardcoded to 50ms!] + +2000-12-21 Mark Salter <msalter@redhat.com> + + * src/flash.c (fis_init): Use CYGBLD_REDBOOT_FLASH_BOOT_OFFSET to + decide where to create default images. + + * cdl/redboot.cdl (CYGBLD_REDBOOT_FLASH_BOOT_OFFSET): Use this + to define offset from start of FLASH to start of boot image. + 2000-12-15 Gary Thomas <gthomas@redhat.com> * src/version.c: Define GDB stubs version here as well. Also
--- a/packages/redboot/current/cdl/redboot.cdl +++ b/packages/redboot/current/cdl/redboot.cdl @@ -170,6 +170,15 @@ cdl_package CYGPKG_REDBOOT { multiple of the FLASH erase block size." } + cdl_option CYGBLD_REDBOOT_FLASH_BOOT_OFFSET { + display "Offset from start of FLASH to RedBoot boot image" + flavor data + default_value 0 + description " + This option controls where the RedBoot boot image is located + relative to the start of FLASH." + } + cdl_option CYGSEM_REDBOOT_FLASH_CONFIG { display "Keep RedBoot configuration data in FLASH" flavor bool
--- a/packages/redboot/current/src/flash.c +++ b/packages/redboot/current/src/flash.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -181,7 +181,7 @@ fis_init(int argc, char *argv[]) #endif bool full_init = false; struct option_info opts[1]; - unsigned long redboot_image_size; + unsigned long redboot_image_size, redboot_flash_start; init_opts(&opts[0], 'f', false, OPTION_ARG_TYPE_FLG, (void **)&full_init, (bool *)0, "full initialization, erases all of flash"); @@ -195,29 +195,57 @@ fis_init(int argc, char *argv[]) return; } printf("*** Initialize FLASH Image System\n"); + + redboot_flash_start = (unsigned long)flash_start + CYGBLD_REDBOOT_FLASH_BOOT_OFFSET; +#define MIN_REDBOOT_IMAGE_SIZE CYGBLD_REDBOOT_MIN_IMAGE_SIZE + redboot_image_size = block_size > MIN_REDBOOT_IMAGE_SIZE ? block_size : MIN_REDBOOT_IMAGE_SIZE; + if (full_init) { - if ((stat = flash_erase((void *)((unsigned long)flash_start+(2*block_size)), - (blocks-4)*block_size, (void **)&err_addr)) != 0) { - printf(" initialization failed %p: 0x%x(%s)\n", err_addr, stat, flash_errmsg(stat)); - } + // Erase everything except default RedBoot images, fis block, and config block. + // FIXME! This still assumes that fis and config blocks can use top of FLASH. + if (CYGBLD_REDBOOT_FLASH_BOOT_OFFSET == 0) { + if ((stat = flash_erase((void *)((unsigned long)flash_start+(2*redboot_image_size)), + ((blocks-2)*block_size) - (2*redboot_image_size), + (void **)&err_addr)) != 0) { + printf(" initialization failed %p: 0x%x(%s)\n", + err_addr, stat, flash_errmsg(stat)); + } + } else { + if ((stat = flash_erase(flash_start, CYGBLD_REDBOOT_FLASH_BOOT_OFFSET, + (void **)&err_addr)) != 0) { + printf(" initialization failed %p: 0x%x(%s)\n", + err_addr, stat, flash_errmsg(stat)); + } else { + unsigned long erase_start, erase_size; + + erase_start = redboot_flash_start+(2*redboot_image_size); + erase_size = (blocks-2)*block_size; + erase_size -= erase_start - (unsigned long)flash_start; + + if (erase_size && (stat = flash_erase((void *)erase_start, erase_size, + (void **)&err_addr)) != 0) { + printf(" initialization failed %p: 0x%x(%s)\n", + err_addr, stat, flash_errmsg(stat)); + } + } + } + } else { printf(" Warning: device contents not erased, some blocks may not be usable\n"); } // Create a pseudo image for RedBoot -#define MIN_REDBOOT_IMAGE_SIZE CYGBLD_REDBOOT_MIN_IMAGE_SIZE - redboot_image_size = block_size > MIN_REDBOOT_IMAGE_SIZE ? block_size : MIN_REDBOOT_IMAGE_SIZE; img = (struct fis_image_desc *)fis_work_block; memset(img, 0, sizeof(*img)); strcpy(img->name, "RedBoot"); - img->flash_base = (unsigned long)flash_start; - img->mem_base = (unsigned long)flash_start; + img->flash_base = redboot_flash_start; + img->mem_base = redboot_flash_start; img->size = redboot_image_size; img++; img_count++; // And a backup image memset(img, 0, sizeof(*img)); strcpy(img->name, "RedBoot[backup]"); - img->flash_base = (unsigned long)flash_start+redboot_image_size; - img->mem_base = (unsigned long)flash_start+redboot_image_size; + img->flash_base = redboot_flash_start+redboot_image_size; + img->mem_base = redboot_flash_start+redboot_image_size; img->size = redboot_image_size; img++; img_count++; #ifdef CYGSEM_REDBOOT_FLASH_CONFIG @@ -557,7 +585,7 @@ fis_erase(int argc, char *argv[]) } // Safety check - make sure the address range is not within the code we're running if (flash_code_overlaps((void *)flash_addr, (void *)(flash_addr+length-1))) { - printf("Can't program this region - contains code in use!\n"); + printf("Can't erase this region - contains code in use!\n"); return; } if ((stat = flash_erase((void *)flash_addr, length, (void **)&err_addr)) != 0) {
--- a/packages/redboot/current/src/io.c +++ b/packages/redboot/current/src/io.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -181,7 +181,7 @@ gets(char *buf, int buflen, int timeout) } else #endif if ((timeout > 0) && (ptr == buf)) { - mon_set_read_char_timeout(50); + mon_set_read_char_timeout(timeout); while (timeout > 0) { res = mon_read_char_with_timeout(&c); if (res) {
--- a/packages/redboot/current/src/main.c +++ b/packages/redboot/current/src/main.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -117,7 +117,7 @@ do_version(int argc, char *argv[]) #ifdef HAL_PLATFORM_CPU printf("Platform: %s (%s) %s\n", HAL_PLATFORM_BOARD, HAL_PLATFORM_CPU, HAL_PLATFORM_EXTRA); #endif - printf("Copyright (C) 2000, Red Hat, Inc.\n\n"); + printf("Copyright (C) 2000, 2001, Red Hat, Inc.\n\n"); printf("RAM: %p-%p\n", (void*)ram_start, (void*)ram_end); }
