#include <const.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arch/i386.h>
#include <arch/mem.h>
#include <arch/paging.h>
#include <arch/v86.h>
#include <kernel/clock.h>
#include <kernel/console.h>
#include <kernel/elf32.h>
#include <kernel/ext2.h>
#include <kernel/fat.h>
#include <kernel/floppy.h>
#include <kernel/Ide.h>
#include <kernel/IdeDebug.h>
#include <kernel/IdeTimer.h>
#include <kernel/IdeLow.h>
#include <kernel/kernel.h>
#include <kernel/keyboard.h>
#include <kernel/kmalloc.h>
#include <kernel/pci.h>
#include <kernel/speaker.h>
#include <kernel/task.h>
#include <kernel/serial.h>
#include <kernel/time.h>
#include <net/arp.h>
#include <net/eth.h>
#include <net/icmp.h>
#include <kernel/shell.h>
Go to the source code of this file.
Defines | |
#define | SH_HELP 0 |
#define | SH_UNAME 1 |
#define | SH_CLEAR 2 |
#define | SH_REBOOT 3 |
#define | SH_DUMP 4 |
#define | SH_READ 5 |
#define | SH_WRITE 6 |
#define | SH_PAGES 7 |
#define | SH_MEM 8 |
#define | SH_CHECKMEM 9 |
#define | SH_FRAMES 10 |
#define | SH_BG 11 |
#define | SH_V86EXEC 12 |
#define | SH_V86BG 13 |
#define | SH_TEST 14 |
#define | SH_CPUID 15 |
#define | SH_MOUNT 16 |
#define | SH_LS 17 |
#define | SH_CAT 18 |
#define | SH_CD 19 |
#define | SH_PS 20 |
#define | SH_KILL 21 |
#define | SH_RS232 22 |
#define | SH_EXEC 23 |
#define | SH_PCISCAN 24 |
#define | SH_ETH_ARP 25 |
#define | SH_RTL8139_INIT 26 |
#define | SH_ETH_PING 27 |
#define | SH_HALT 28 |
#define | SH_RM 29 |
#define | SH_ELF 30 |
#define | SH_IDETEST 31 |
#define | SH_IDEREAD 32 |
#define | SH_IDEWRITE 33 |
#define | SH_IDEDEVICEINFO 34 |
#define | SH_LS_EXT2 35 |
#define | SH_CAT_EXT2 36 |
#define | SH_CD_EXT2 37 |
#define | SH_TIME 38 |
#define | V86_START_ADDRESS 0x10000 |
#define | SH_PROMPT "\r[root:/fd0/%s]# " |
#define | CMD_ARG (cmd+strlen(commands[i].name)+1) |
Functions | |
void | Sh_IdeTest () |
void | Sh_IdeRead () |
void | Sh_IdeWrite () |
void | Sh_IdeDeviceInfo () |
void | sh_cd2 (char *argv) |
void | sh_cat2 (char *argv) |
void | sh_read (char *argv) |
void | sh_write (char *argv) |
void | sh_kill (char *argv) |
void | sh_v86_exec (char *argv) |
void | sh_v86_bg (char *argv) |
int | sh_parse_params (const char *cmd_str, char ***argv, int *argc) |
Parse parameters passed to the task by the command line. | |
void | sh_exec (char *cmd_line) |
Run a program in foreground. | |
void | sh_bg (char *cmd_line) |
Run a program in background. | |
void | sh_cat (char *argv) |
void | sh_cd (char *argv) |
void | sh_rm (char *argv) |
void | task_test () |
void | sh_test (char *argv) |
void | show_cpuid () |
void | sh_help (char *argv) |
void | ps_task () |
void | sh_ps () |
void | sh_halt () |
void | sh_elf (char *argv) |
void | shell () |
Variables | |
CMD_t | commands [] |
The commands supported in MiniShell. | |
byte | fd_buffer [FDC_SECTOR_SIZE] |
Definition in file shell.c.
|
|
|
|
|
|
|
Definition at line 875 of file shell.c.
|
|
Run a program in background.
Definition at line 543 of file shell.c.
00544 { 00545 int file_size; 00546 task_t *child; 00547 int u_argc; 00548 char **u_argv; 00549 00550 // If all goes well the u_argv array will be allocated in the // 00551 // kernel space. // 00552 if ( sh_parse_params(cmd_line, &u_argv, &u_argc) < 0 ) 00553 { 00554 kprintf("\n\rOut of virtual memory!!!"); 00555 return; 00556 } 00557 00558 if( !u_argv ) 00559 { 00560 kprintf("file name?\n"); 00561 return; 00562 } 00563 strtoupper( u_argv[0] ); 00564 00565 // Get the file size if exists // 00566 file_size = get_file_size( u_argv[0] ); 00567 00568 if ( file_size != -1 ) 00569 { 00570 // Create the task // 00571 child = new_task(u_argv[0], u_argc, u_argv, USER_PRIVILEGE); 00572 if ( child == NULL ) 00573 { 00574 // An error occurs. Treat this file as a 00575 // simple binary 8086 code. 00576 sh_v86_bg( u_argv[0] ); 00577 kfree( u_argv ); 00578 return; 00579 } 00580 } 00581 else 00582 kprintf("\n\rFile not found!\n\r"); 00583 00584 // Free the unused memory // 00585 kfree( u_argv ); 00586 } |
|
Definition at line 588 of file shell.c.
00589 { 00590 // Concatenate a FILE to the standard output // 00591 strtoupper(argv); 00592 if ( cat(argv) ) 00593 kprintf("\n\r"); 00594 else 00595 kprintf("\n\rFile not found!\n\r"); 00596 } |
|
Definition at line 295 of file shell.c.
|
|
Definition at line 598 of file shell.c.
00599 { 00600 // Change the current directory // 00601 strtoupper(argv); 00602 if (argv[0]=='\0') return; 00603 if ( !(cd(argv)) ) 00604 kprintf("\n\rMiniShell: cd: %s: No such directory\n\r", argv); 00605 } |
|
Definition at line 287 of file shell.c.
00288 { 00289 // Change the current ext2 directory // 00290 if (argv[0]=='\0') return; 00291 00292 cd_ext2(argv); 00293 } |
|
Definition at line 911 of file shell.c.
00912 { 00913 // Check if the file is a valid ELF32. // 00914 byte *file_buffer; 00915 int file_size; 00916 00917 if( !argv ) 00918 { 00919 kprintf("background file?\n"); 00920 return; 00921 } 00922 strtoupper(argv); 00923 00924 // Get the file size if exists // 00925 file_size = get_file_size(argv); 00926 00927 // Load the ELF32 file // 00928 file_buffer = kmalloc(file_size); 00929 switch ( elf32_load_file(argv, file_buffer) ) 00930 { 00931 case -ENOENT: 00932 kprintf("file not found!\n\r"); 00933 break; 00934 00935 case -ENOEXEC: 00936 kprintf("not a valid ELF32 file!\n\r"); 00937 break; 00938 00939 default: 00940 kprintf("ELF32 file-format OK!\n\r"); 00941 break; 00942 } 00943 kfree(file_buffer); 00944 } |
|
Run a program in foreground.
Definition at line 494 of file shell.c.
00495 { 00496 task_t *child; 00497 int file_size; 00498 int status; 00499 int u_argc; 00500 char **u_argv; 00501 00502 // If all goes well the u_argv array will be allocated in the // 00503 // kernel space. // 00504 if ( sh_parse_params(cmd_line, &u_argv, &u_argc) < 0 ) 00505 { 00506 kprintf("\n\rOut of virtual memory!!!"); 00507 return; 00508 } 00509 00510 if( !u_argv ) 00511 { 00512 kprintf("file name?\n"); 00513 return; 00514 } 00515 strtoupper( u_argv[0] ); 00516 00517 // Get the file size if exists // 00518 file_size = get_file_size( u_argv[0] ); 00519 00520 if ( file_size != -1 ) 00521 { 00522 // Create the task // 00523 child = new_task(u_argv[0], u_argc, u_argv, USER_PRIVILEGE); 00524 if ( child == NULL ) 00525 { 00526 // An error occurs. Treat this file as a 00527 // simple binary 8086 code. 00528 sh_v86_exec( u_argv[0] ); 00529 kfree( u_argv ); 00530 return; 00531 } 00532 // Wait until the child is killed // 00533 waitpid(child->pid, &status, 0); 00534 } 00535 else 00536 kprintf("\n\rFile not found!\n\r"); 00537 00538 // Free the unused memory // 00539 kfree( u_argv ); 00540 } |
|
Definition at line 890 of file shell.c.
00891 { 00892 // Halt the system // 00893 kprintf("\n\rHalting system using APM features..."); 00894 beep(); 00895 00896 sh_cd("/"); 00897 sh_cd("bin"); 00898 sh_v86_exec("halt.bin"); 00899 00900 // If you reach this point it means that your motherboard // 00901 // does not support APM features... // 00902 00903 // Be sure that the floppy motor has been turned off! // 00904 out(0x03F2, 0x0C); 00905 00906 // Halt the system // 00907 kprintf("\n\rNow you can turn off power."); 00908 halt(); 00909 } |
|
Definition at line 828 of file shell.c.
00829 { 00830 // Print the help // 00831 int i, row; 00832 00833 kprintf("\n\r%s\n\r", SH_VERSION); 00834 00835 if ( *argv != NULL ) 00836 { 00837 // Print only the selected commands // 00838 for (i=0; i<SH_COMMANDS; i++) 00839 if (strcmp(argv, commands[i].name)==0) 00840 { 00841 // Print usage and command info // 00842 kprintf("\n\r-> "); 00843 set_color(WHITE); 00844 kprintf("%s", commands[i].usage); 00845 set_color(DEFAULT_COLOR); 00846 kprintf("\n\r %s;\n\n\r", commands[i].help); 00847 return; 00848 } 00849 // Command not found! // 00850 kprintf("\n\r Command not found!\n\n\r"); 00851 return; 00852 } 00853 00854 // Print all commands // 00855 for (i=0, row=2; i<SH_COMMANDS; i++) 00856 { 00857 // Print usage and command info // 00858 kprintf("\n\r-> "); 00859 set_color(WHITE); 00860 kprintf("%s", commands[i].usage); 00861 set_color(DEFAULT_COLOR); 00862 kprintf("\n\r %s;", commands[i].help); 00863 00864 // Wait for keypressed to avoid screen scrolling // 00865 row += 2; 00866 if (row >= 24) 00867 { 00868 if (kgetchar() == CTRL_C) break; 00869 row = 0; 00870 } 00871 } 00872 kprintf("\n\n\r"); 00873 } |
|
Definition at line 257 of file shell.c.
00258 { 00259 int Dev; 00260 00261 kprintf("\n\rInsert the channel number (0 or 1): 0\b"); 00262 scanf("%i", &Dev); 00263 kprintf("\n\rChannel %i Selected",Dev); 00264 if ( Dev==0 ) 00265 SelectAtaChannel(CC_PRIMARY); 00266 else if ( Dev==1 ) 00267 SelectAtaChannel(CC_SECONDARY); 00268 else 00269 { 00270 kprintf("\n\rBad Channel Number Channel 0 will be selected"); 00271 SelectAtaChannel(CC_PRIMARY); 00272 } 00273 00274 00275 kprintf("\n\rInsert the device number (0 or 1): 0\b"); 00276 scanf("%i", &Dev); 00277 kprintf("\n\rDevice %i Selected",Dev); 00278 if ( Dev==0 || Dev==1 ) 00279 { 00280 ShowDeviceData(Dev,30); 00281 } 00282 } |
|
Definition at line 154 of file shell.c.
00155 { 00156 int Dev; 00157 int Lba; 00158 int Err=FALSE; 00159 byte DataBuffer[512]; 00160 00161 kprintf("\n\rInsert the channel number (0 or 1): 0\b"); 00162 scanf("%i", &Dev); 00163 kprintf("\n\rChannel %i Selected",Dev); 00164 if ( Dev==0 ) 00165 SelectAtaChannel(CC_PRIMARY); 00166 else if ( Dev==1 ) 00167 SelectAtaChannel(CC_SECONDARY); 00168 else 00169 { 00170 kprintf("\n\rBad Channel Number: Channel 0 will be selected"); 00171 SelectAtaChannel(CC_PRIMARY); 00172 } 00173 00174 kprintf("\n\rInsert the device number to Read (0 or 1): 0\b"); 00175 scanf("%i", &Dev); 00176 kprintf("\n\rDevice %i Selected",Dev); 00177 if ( Dev==0 || Dev==1 ) 00178 { 00179 00180 kprintf("\n\rInsert Lba : "); 00181 scanf("%i", &Lba); 00182 kprintf("\n\rLba Selected %i",Lba); 00183 00184 Err=ReadSectorsLba(Dev,(int64) Lba,1,(word *) &DataBuffer,TRUE); 00185 if (Err) 00186 ShowIdeErrorMessage(Err,TRUE); 00187 else 00188 { 00189 kprintf("\n\r HEX DATA"); 00190 ShowMatrixData(DataBuffer,1,16,20,512,DBG_SHOWMAT_HEX); 00191 WaitKeyPress(MSG_PRESSKEY); 00192 kprintf("\n\r CHAR DATA"); 00193 ShowMatrixData(DataBuffer,1,40,20,512,DBG_SHOWMAT_ASCII); 00194 WaitKeyPress(MSG_PRESSKEY); 00195 } 00196 } 00197 else 00198 kprintf("\n\rBad Device Number"); 00199 kprintf("\n\r "); 00200 } |
|
Definition at line 149 of file shell.c.
00150 { 00151 kprintf("\n\rThis command is only for debug purpose.\n\r"); 00152 } |
|
Definition at line 202 of file shell.c.
00203 { 00204 int Dev; 00205 int i=0; 00206 int Lba; 00207 char DataBuffer[512]; 00208 int Pattern; 00209 int Err=FALSE; 00210 byte Data; 00211 00212 kprintf("\n\rInsert the channel number (0 or 1): 0\b"); 00213 scanf("%i", &Dev); 00214 kprintf("\n\rChannel %i Selected",Dev); 00215 if ( Dev==0 ) 00216 { 00217 SelectAtaChannel(CC_PRIMARY); 00218 } 00219 else if ( Dev==1 ) 00220 { 00221 SelectAtaChannel(CC_SECONDARY); 00222 } 00223 else 00224 { 00225 kprintf("\n\rBad Channel Number Channel 0 will be selected"); 00226 SelectAtaChannel(CC_PRIMARY); 00227 } 00228 00229 00230 kprintf("\n\rInsert the device number to Write (0 or 1): 0\b"); 00231 scanf("%i", &Dev); 00232 kprintf("\n\rDevice %i Selected",Dev); 00233 if ( Dev==0 || Dev==1 ) 00234 { 00235 00236 kprintf("\n\rInsert Lba : "); 00237 scanf("%i", &Lba); 00238 kprintf("\n\rLba Selected %i",Lba); 00239 00240 kprintf("\n\rSpecify Type of Pattern To Write (1 byte in decimal format): "); 00241 scanf("%i",&Pattern); 00242 kprintf("\n\rPattern: %i",Pattern); 00243 Data=(byte) Pattern; 00244 for (i=0;i<512;i++) 00245 DataBuffer[i]=Data; 00246 00247 Err=WriteSectorsLba(Dev,(int64) Lba,1,(word *) &DataBuffer,TRUE); 00248 if (Err) 00249 ShowIdeErrorMessage(Err,TRUE); 00250 } 00251 else 00252 kprintf("\n\rBad Device Number"); 00253 kprintf("\n\r "); 00254 00255 } |
|
Definition at line 347 of file shell.c.
|
|
Parse parameters passed to the task by the command line.
Definition at line 416 of file shell.c.
00417 { 00418 char *strtmp=NULL, *cmd_line=NULL; 00419 int i, len; 00420 00421 // Initialize argv and argc // 00422 *argv = (char **)NULL; 00423 *argc = 0; 00424 00425 // Empty command line?! // 00426 if ( cmd_str==NULL ) 00427 return( 0 ); 00428 if ( *cmd_str == '\0' ) 00429 return( 0 ); 00430 00431 // Copy the command string into a temporary array // 00432 if ( (len=strlen(cmd_str))!=0 ) 00433 cmd_line = kmalloc(len+1); 00434 00435 if ( cmd_line == NULL ) 00436 return( -ENOMEM ); 00437 00438 strcpy( cmd_line, cmd_str ); 00439 00440 // Skip the initial spaces // 00441 while( *cmd_line == ' ' ) 00442 cmd_line++; 00443 00444 // Calculate the number of parameters (argc) // 00445 strtmp = cmd_line; 00446 while( TRUE ) 00447 { 00448 switch( *strtmp ) 00449 { 00450 case ' ': 00451 *strtmp++ = '\0'; 00452 (*argc)++; 00453 while( *strtmp == ' ' ) 00454 { 00455 *strtmp++ = '\0'; 00456 } 00457 if ( *strtmp == '\0' ) 00458 { 00459 goto argc_done; 00460 } 00461 break; 00462 00463 case '\0': 00464 case '\n': 00465 *strtmp = '\0'; 00466 (*argc)++; 00467 goto argc_done; 00468 break; 00469 00470 default: 00471 strtmp++; 00472 break; 00473 } 00474 } 00475 argc_done: 00476 // Allocate the argv array // 00477 *argv = kmalloc( (*argc) * sizeof(char *) ); 00478 00479 // Calculate the parameter string pointers // 00480 for( i=0; i<(*argc); i++ ) 00481 { 00482 (*argv)[i] = cmd_line; 00483 len = strlen(cmd_line); 00484 cmd_line += (len); 00485 while( *(++cmd_line) == '\0' ); 00486 } 00487 00488 // Free the unused memory // 00489 kfree( cmd_line ); 00490 return( 0 ); 00491 } |
|
Definition at line 882 of file shell.c.
00883 { 00884 pid_t pid; 00885 int status; 00886 pid = create_process(&ps_task, &ps_task, 0, "ps", KERNEL_PRIVILEGE)->pid; 00887 waitpid(pid, &status, 0); 00888 } |
|
Definition at line 310 of file shell.c.
00311 { 00312 // Read 1 sector from the floppy disk to the FDC buffer // 00313 int block, i; 00314 00315 block = atoi(argv); 00316 kprintf("\n\rReading block %u...\n\r", block); 00317 kprintf("\n\r"); 00318 00319 memset(fd_buffer, 0, FDC_SECTOR_SIZE); 00320 00321 for(i=0; i<3; i++) 00322 if (fdc_read(block, fd_buffer, 1)) break; 00323 00324 if (i != 3) 00325 for(i=0; i<512; i++) 00326 kputchar(fd_buffer[i]); 00327 else 00328 kprintf("\n\rFloppy I/O error. Unable to read the block!!!\n\r"); 00329 00330 kprintf("\n\r"); 00331 } |
|
Definition at line 607 of file shell.c.
00608 { 00609 // Remove a file // 00610 strtoupper(argv); 00611 if ( rm(argv) ) 00612 kprintf("Deleted!\n\r"); 00613 else 00614 kprintf("\n\rFile not found!\n\r"); 00615 } |
|
Definition at line 628 of file shell.c.
00629 { 00630 int i; 00631 short int n; 00632 00633 n = atoi(argv); 00634 if ( !n ) n=1; 00635 kprintf("\n\rCreating %u background tasks. Please wait.\n\r", n); 00636 for(i=0; i<n; i++) 00637 { 00638 create_process(&task_test, &task_test, 0, "sh_task_test", KERNEL_PRIVILEGE); 00639 kputchar('.'); 00640 } 00641 } |
|
Definition at line 388 of file shell.c.
00389 { 00390 // Create a v86 background task // 00391 byte *file_buffer; 00392 int file_size; 00393 00394 if( !argv ) 00395 { 00396 kprintf("file name?\n"); 00397 return; 00398 } 00399 strtoupper(argv); 00400 00401 // Get the file size if exists // 00402 file_size = get_file_size(argv); 00403 00404 if (file_size != -1) 00405 { 00406 // Create the task // 00407 file_buffer = kmalloc(file_size); 00408 load_file(argv, file_buffer); 00409 create_v86_process((void *)V86_START_ADDRESS, file_buffer, file_size, argv); 00410 kfree(file_buffer); 00411 } 00412 } |
|
Definition at line 359 of file shell.c.
00360 { 00361 byte *file_buffer; 00362 int file_size; 00363 task_t *child; 00364 int status; 00365 00366 if( !argv ) 00367 { 00368 kprintf("file name?\n"); 00369 return; 00370 } 00371 strtoupper(argv); 00372 00373 // Get the file size if exists // 00374 file_size = get_file_size(argv); 00375 00376 if (file_size != -1) 00377 { 00378 // Create the task // 00379 file_buffer = kmalloc(file_size); 00380 load_file(argv, file_buffer); 00381 child = create_v86_process((void *)V86_START_ADDRESS, file_buffer, file_size, argv); 00382 kfree(file_buffer); 00383 // Wait until the child is killed // 00384 waitpid(child->pid, &status, 0); 00385 } 00386 } |
|
Definition at line 333 of file shell.c.
00334 { 00335 // Write 1 sector from the FDC buffer to the floppy disk // 00336 int block, i; 00337 00338 block = atoi(argv); 00339 kprintf("\n\rWriting block %u...\n\r", block); 00340 for(i=0; i<3; i++) 00341 if (fdc_write(block, fd_buffer, 1)) break; 00342 00343 if (i == 3) 00344 kprintf("\n\rFloppy I/O error. Unable to write the block!!!\n\r"); 00345 } |
|
Definition at line 946 of file shell.c.
00947 { 00948 // The MINIShell main program // 00949 00950 #define SH_PROMPT "\r[root:/fd0/%s]# " 00951 #define CMD_ARG (cmd+strlen(commands[i].name)+1) 00952 00953 // Shell command buffer // 00954 char cmd[STR_MAX_LENGTH]; 00955 int i; 00956 00957 // Reset the command buffer // 00958 memset(cmd, 0, sizeof(cmd)); 00959 00960 // Welcome message // 00961 set_color(DEFAULT_COLOR); 00962 kprintf("\n\rWelcome to the MiniShell (tty%u)", get_curr_task()->console); 00963 kprintf("\n\rHave a lot of fun...\n\r"); 00964 00965 // Command line // 00966 while(TRUE) 00967 { 00968 kprintf(SH_PROMPT, pwd()); 00969 gets(cmd); 00970 00971 for(i=0; i<SH_COMMANDS; i++) 00972 { 00973 // Parse the command // 00974 if ( strncmp(cmd, commands[i].name, strlen(commands[i].name))==0 ) 00975 { 00976 if (*(cmd+strlen(commands[i].name)) == '\0') 00977 { 00978 *CMD_ARG = '\0'; 00979 break; 00980 } 00981 if (*(cmd+strlen(commands[i].name)) == ' ') 00982 break; 00983 } 00984 } 00985 00986 if (i == SH_COMMANDS) 00987 { 00988 // No command requested // 00989 if (!cmd[0]) continue; 00990 00991 // Execute a file in the current path in foreground // 00992 if( !strncmp(cmd, "./", 2) ) 00993 { 00994 if( cmd[2]=='\0' ) 00995 { 00996 kprintf("\n%s: is a directory\n"); 00997 continue; 00998 } 00999 else 01000 { 01001 sh_exec(cmd+2); 01002 continue; 01003 } 01004 } 01005 01006 // Command not found // 01007 kprintf("\n%s: command not found\n", cmd); 01008 continue; 01009 } 01010 01011 switch(commands[i].index) 01012 { 01013 case SH_HELP: 01014 sh_help(CMD_ARG); 01015 break; 01016 01017 case SH_UNAME: 01018 kprintf("\n\r%s - Kernel [v%s]\n\r", KERNEL_NAME, KERNEL_VERSION); 01019 break; 01020 01021 case SH_CLEAR: 01022 set_color(DEFAULT_COLOR); 01023 clrscr(); 01024 break; 01025 01026 case SH_REBOOT: 01027 reboot(); 01028 break; 01029 01030 case SH_DUMP: 01031 breakpoint(); 01032 break; 01033 01034 case SH_READ: 01035 sh_read(CMD_ARG); 01036 break; 01037 01038 case SH_WRITE: 01039 sh_write(CMD_ARG); 01040 break; 01041 01042 case SH_PAGES: 01043 dump_dirty_pages(); 01044 break; 01045 01046 case SH_MEM: 01047 dump_memory_map(); 01048 break; 01049 01050 case SH_CHECKMEM: 01051 create_process( 01052 &check_free_frames_integrity, 01053 &check_free_frames_integrity, 01054 0, 01055 "frames_check", 01056 KERNEL_PRIVILEGE 01057 ); 01058 break; 01059 01060 case SH_FRAMES: 01061 dump_free_frames(); 01062 break; 01063 01064 case SH_EXEC: 01065 sh_exec(CMD_ARG); 01066 break; 01067 01068 case SH_BG: 01069 sh_bg(CMD_ARG); 01070 break; 01071 01072 case SH_V86EXEC: 01073 sh_v86_exec(CMD_ARG); 01074 break; 01075 01076 case SH_V86BG: 01077 sh_v86_bg(CMD_ARG); 01078 break; 01079 01080 case SH_TEST: 01081 sh_test(CMD_ARG); 01082 break; 01083 01084 case SH_CPUID: 01085 show_cpuid(); 01086 break; 01087 01088 case SH_MOUNT: 01089 Read_FAT(); 01090 break; 01091 01092 case SH_LS: 01093 ls(); 01094 break; 01095 01096 case SH_CAT: 01097 sh_cat(CMD_ARG); 01098 break; 01099 01100 case SH_CD: 01101 sh_cd(CMD_ARG); 01102 break; 01103 01104 case SH_RM: 01105 sh_rm(CMD_ARG); 01106 break; 01107 01108 case SH_PS: 01109 sh_ps(); 01110 break; 01111 01112 case SH_KILL: 01113 sh_kill(CMD_ARG); 01114 break; 01115 01116 case SH_RS232: 01117 rs232_chat(CMD_ARG); 01118 break; 01119 01120 case SH_PCISCAN: 01121 pci_scan(); 01122 break; 01123 01124 case SH_RTL8139_INIT: 01125 ifconfig(CMD_ARG); 01126 break; 01127 01128 case SH_ETH_PING: 01129 ping(CMD_ARG); 01130 break; 01131 01132 case SH_ETH_ARP: 01133 arp_request(CMD_ARG); 01134 break; 01135 01136 case SH_HALT: 01137 sh_halt(); 01138 break; 01139 01140 case SH_ELF: 01141 sh_elf(CMD_ARG); 01142 break; 01143 01144 // **************** Luca Giovacchini (Ide) **************** 01145 case SH_IDETEST: 01146 Sh_IdeTest(); 01147 break; 01148 case SH_IDEREAD: 01149 Sh_IdeRead(); 01150 break; 01151 case SH_IDEWRITE: 01152 Sh_IdeWrite(); 01153 break; 01154 case SH_IDEDEVICEINFO: 01155 Sh_IdeDeviceInfo(); 01156 break; 01157 // ******************************************************** 01158 01159 // ******************** Filippo Brogi ********************* 01160 case SH_LS_EXT2: 01161 ls_ext2(); 01162 break; 01163 01164 case SH_CD_EXT2: 01165 sh_cd2(CMD_ARG); 01166 break; 01167 01168 case SH_CAT_EXT2: 01169 sh_cat2(CMD_ARG); 01170 break; 01171 // ******************************************************** 01172 01173 case SH_TIME: 01174 kprintf("\r%u\n\r", time_read()); 01175 break; 01176 } 01177 } 01178 } |
|
Definition at line 643 of file shell.c.
00644 { 00645 typedef struct cache_info { 00646 byte index; 00647 char *string; 00648 } cache_info_t; 00649 00650 // Cache TLB informations // 00651 static cache_info_t cache_strings[37] = { 00652 // { 0x00, "Null descriptor" }, 00653 { 0x01, "Instruction TLB: 4KB Pages 4-way set associative, 32 entries" }, 00654 { 0x02, "Instruction TLB: 4MB Pages, 4-way set associative, 2 entries" }, 00655 { 0x03, "Data TLB: 4KB Pages, 4-way set associative, 64 entries" }, 00656 { 0x04, "Data TLB: 4MB Pages, 4-way set associative, 8 entries" }, 00657 { 0x06, "1st-level instruction cache: 8KB, 4-way set associative, 32 byte line size" }, 00658 { 0x08, "1st-level instruction cache: 16KB, 4-way set associative, 32 byte line size" }, 00659 { 0x0A, "1st-level data cache: 8KB, 2-way set associative, 32 byte line size" }, 00660 { 0x0C, "1st-level data cache: 16KB, 4-way set associative, 32 byte line size" }, 00661 { 0x22, "3rd-level cache: 512KB, 4-way set associative, dual-sectored line, 64 byte sector size" }, 00662 { 0x23, "3rd-level cache: 1MB, 8-way set associative, dual-sectored line, 64 byte sector size" }, 00663 { 0x40, "No 2nd-level cache or, if processor contains a valid 2nd-level cache, no 3rd-level cache" }, 00664 { 0x41, "2nd-level cache: 128KB, 4-way set associative, 32 byte line size" }, 00665 { 0x42, "2nd-level cache: 256KB, 4-way set associative, 32 byte line size" }, 00666 { 0x43, "2nd-level cache: 512KB, 4-way set associative, 32 byte line size" }, 00667 { 0x44, "2nd-level cache: 1MB, 4-way set associative, 32 byte line size" }, 00668 { 0x45, "2nd-level cache: 2MB, 4-way set associative, 32 byte line size" }, 00669 { 0x50, "Instruction TLB: 4KB and 2MB or 4MB pages, 64 entries" }, 00670 { 0x51, "Instruction TLB: 4KB and 2MB or 4MB pages, 128 entries" }, 00671 { 0x52, "Instruction TLB: 4KB and 2MB or 4MB pages, 256 entries" }, 00672 { 0x5B, "Data TLB: 4KB and 4MB pages, 64 entries" }, 00673 { 0x5C, "Data TLB: 4KB and 4MB pages, 128 entries" }, 00674 { 0x5D, "Data TLB: 4KB and 4MB pages, 256 entries" }, 00675 { 0x66, "1st-level data cache: 8KB, 4-way set associative, 64 byte line size" }, 00676 { 0x67, "1st-level data cache: 16KB, 4-way set associative, 64 byte line size" }, 00677 { 0x68, "1st-level data cache: 32KB, 4-way set associative, 64 byte line size" }, 00678 { 0x70, "Trace cache: 12K-op, 8-way set associative" }, 00679 { 0x71, "Trace cache: 16K-op, 8-way set associative" }, 00680 { 0x72, "Trace cache: 32K-op, 8-way set associative" }, 00681 { 0x79, "2nd-level cache: 128KB, 8-way set associative, dual-sectored line, 64 byte sector size" }, 00682 { 0x7A, "2nd-level cache: 256KB, 8-way set associative, dual-sectored line, 64 byte sector size" }, 00683 { 0x7B, "2nd-level cache: 512KB, 8-way set associative, dual-sectored line, 64 byte sector size" }, 00684 { 0x7C, "2nd-level cache: 1MB, 8-way set associative, dual-sectored line, 64 byte sector size" }, 00685 { 0x82, "2nd-level cache: 256KB, 8-way set associative, 32 byte line size" }, 00686 { 0x83, "2nd-level cache: 512KB, 8-way set associative, 32 byte line size" }, 00687 { 0x84, "2nd-level cache: 1MB, 8-way set associative, 32 byte line size" }, 00688 { 0x85, "2nd-level cache: 2MB, 8-way set associative, 32 byte line size" }, 00689 }; 00690 00691 int eax, ebx, ecx, edx; 00692 dword vendor[4]; 00693 dword i, j; 00694 int virtual; 00695 uint64_t timestamp1, timestamp2; 00696 uint32_t mhz_freq; 00697 dword IF = GET_IF(); 00698 00699 kprintf("\n\rReading CPU informations..."); 00700 00701 // Calculate the CPU frequency using the real-time clock // 00702 disable(); 00703 00704 // Wait until the second has precisely just started // 00705 (void)time_read(); 00706 // Read the value of the current time-stamp counter (64-bit) // 00707 __asm__ __volatile__("rdtsc" : "=A"(timestamp1)); 00708 // Wait exactly a second // 00709 (void)time_read(); 00710 // Read the value of the current time-stamp counter again // 00711 __asm__ __volatile__("rdtsc" : "=A"(timestamp2)); 00712 // Now we can estimate the CPU frequency as follows // 00713 mhz_freq = ((uint32_t)(timestamp2 - timestamp1))/1000000; 00714 kprintf("\n\rFrequency: %u MHz", mhz_freq); 00715 00716 SET_IF(IF); 00717 00718 // Execute the CPUID instruction command 0 // 00719 cpuid(0, &eax, &ebx, &ecx, &edx); 00720 00721 vendor[0] = ebx; 00722 vendor[1] = edx; 00723 vendor[2] = ecx; 00724 vendor[3] = 0; 00725 00726 kprintf("\n\rDetected \"%s\" CPU", (char *)vendor); 00727 00728 // Execute the CPUID instruction command 1 // 00729 cpuid(1, &eax, &ebx, &ecx, &edx); 00730 00731 // Detect processor type // 00732 switch((eax >> 12) & 0x03) 00733 { 00734 case 0: 00735 kprintf("\n\rOriginal OEM Processor"); 00736 break; 00737 00738 case 1: 00739 kprintf("\n\rIntel Overdrive(R) Processor"); 00740 break; 00741 00742 case 2: 00743 kprintf("\n\rDual Processor"); 00744 break; 00745 00746 case 3: 00747 kprintf("\n\r??? (reserved)"); 00748 break; 00749 } 00750 // Detect processor family & model // 00751 kprintf( "\n\rFamily=%u Model=%u SteppingID=%u\n\r", 00752 ((eax >> 8) & 0x0F), ((eax >> 4) & 0x0F), ((eax >> 0) & 0x0F) ); 00753 00754 // Detect with brand string // 00755 switch(ebx & 0xFF) 00756 { 00757 case 0: 00758 kprintf( "Brand identification not supported\n\r" 00759 "Processor produced before the introduction of Pentium III Xeon processor\n\r"); 00760 break; 00761 00762 case 1: 00763 kprintf("Celeron\n\r"); 00764 break; 00765 00766 case 2: 00767 kprintf("Pentium III\n\r"); 00768 break; 00769 00770 case 3: 00771 kprintf("Pentium III Xeon\n\r"); 00772 break; 00773 00774 case 6: 00775 kprintf("Pentium III Mobile\n\r"); 00776 break; 00777 00778 case 8: 00779 kprintf("Pentium 4 (Willamette)\n\r"); 00780 break; 00781 00782 case 9: 00783 kprintf("Pentium 4 (Northwood)\n\r"); 00784 break; 00785 00786 default: 00787 kprintf("??? (processor) %u\n\r", (ebx & 0xFF)); 00788 break; 00789 } 00790 00791 // Detect technology // 00792 if ( edx & (1<<23) ) kprintf("MMX Technology found\n\r"); 00793 if ( edx & (1<<25) ) kprintf("SSE extension supported\n\r"); 00794 if ( edx & (1<<26) ) kprintf("SSE2 extension supported\n\r"); 00795 if ( (edx & (1<<28)) ) 00796 { 00797 virtual = ( (ebx >> 16) & 0xFF ); 00798 kprintf("Hyper-Threading Technology found (%u virtual %s)\n\r", 00799 virtual, (virtual > 1) ? ("processors") : ("processor") ); 00800 } 00801 00802 // Detect Cache informations // 00803 do 00804 { 00805 // Execute the CPUID instruction command 2 // 00806 cpuid(2, &eax, &ebx, &ecx, &edx); 00807 } while ((eax & 0x0F) != 1); 00808 00809 kprintf("\n\r- Internal cache informations -\n\r"); 00810 if (!(eax & 0x80000000)) vendor[0] = (eax >> 8); 00811 if (!(ebx & 0x80000000)) vendor[1] = ebx; 00812 if (!(ecx & 0x80000000)) vendor[2] = ecx; 00813 if (!(edx & 0x80000000)) vendor[3] = edx; 00814 00815 for (j=0; j<(sizeof(cache_strings)/sizeof(cache_info_t)); j++) 00816 for (i=0; i<4*sizeof(dword); i++) 00817 { 00818 if ( ((char *)vendor)[i] != 0) 00819 if ( ((char *)vendor)[i]==cache_strings[j].index ) 00820 { 00821 kprintf("%s\n\r", cache_strings[j].string); 00822 break; 00823 } 00824 } 00825 kprintf("\n\r"); 00826 } |
|
Definition at line 617 of file shell.c.
|
|
|