Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/cmd.c

    r6eef3c4 r593e023  
    4545#include <console/kconsole.h>
    4646#include <print.h>
     47#include <log.h>
    4748#include <panic.h>
    4849#include <typedefs.h>
     
    5657#include <cpu.h>
    5758#include <mm/tlb.h>
     59#include <mm/km.h>
    5860#include <arch/mm/tlb.h>
    5961#include <mm/frame.h>
     
    8183        .func = cmd_help,
    8284        .argc = 0
     85};
     86
     87/* Data and methods for pio_read_8 command */
     88static int cmd_pio_read_8(cmd_arg_t *argv);
     89static cmd_arg_t pio_read_8_argv[] = { { .type = ARG_TYPE_INT } };
     90static cmd_info_t pio_read_8_info = {
     91        .name = "pio_read_8",
     92        .description = "pio_read_8 <address> Read 1 byte from memory (or port).",
     93        .func = cmd_pio_read_8,
     94        .argc = 1,
     95        .argv = pio_read_8_argv
     96};
     97
     98/* Data and methods for pio_read_16 command */
     99static int cmd_pio_read_16(cmd_arg_t *argv);
     100static cmd_arg_t pio_read_16_argv[] = { { .type = ARG_TYPE_INT } };
     101static cmd_info_t pio_read_16_info = {
     102        .name = "pio_read_16",
     103        .description = "pio_read_16 <address> Read 2 bytes from memory (or port).",
     104        .func = cmd_pio_read_16,
     105        .argc = 1,
     106        .argv = pio_read_16_argv
     107};
     108
     109/* Data and methods for pio_read_32 command */
     110static int cmd_pio_read_32(cmd_arg_t *argv);
     111static cmd_arg_t pio_read_32_argv[] = { { .type = ARG_TYPE_INT } };
     112static cmd_info_t pio_read_32_info = {
     113        .name = "pio_read_32",
     114        .description = "pio_read_32 <address> Read 4 bytes from memory (or port).",
     115        .func = cmd_pio_read_32,
     116        .argc = 1,
     117        .argv = pio_read_32_argv
     118};
     119
     120/* Data and methods for pio_write_8 command */
     121static int cmd_pio_write_8(cmd_arg_t *argv);
     122static cmd_arg_t pio_write_8_argv[] = {
     123        { .type = ARG_TYPE_INT },
     124        { .type = ARG_TYPE_INT }
     125};
     126static cmd_info_t pio_write_8_info = {
     127        .name = "pio_write_8",
     128        .description = "pio_write_8 <address> <value> Write 1 byte to memory (or port).",
     129        .func = cmd_pio_write_8,
     130        .argc = 2,
     131        .argv = pio_write_8_argv
     132};
     133
     134/* Data and methods for pio_write_16 command */
     135static int cmd_pio_write_16(cmd_arg_t *argv);
     136static cmd_arg_t pio_write_16_argv[] = {
     137        { .type = ARG_TYPE_INT },
     138        { .type = ARG_TYPE_INT }
     139};
     140static cmd_info_t pio_write_16_info = {
     141        .name = "pio_write_16",
     142        .description = "pio_write_16 <address> <value> Write 2 bytes to memory (or port).",
     143        .func = cmd_pio_write_16,
     144        .argc = 2,
     145        .argv = pio_write_16_argv
     146};
     147
     148/* Data and methods for pio_write_32 command */
     149static int cmd_pio_write_32(cmd_arg_t *argv);
     150static cmd_arg_t pio_write_32_argv[] = {
     151        { .type = ARG_TYPE_INT },
     152        { .type = ARG_TYPE_INT }
     153};
     154static cmd_info_t pio_write_32_info = {
     155        .name = "pio_write_32",
     156        .description = "pio_write_32 <address> <value> Write 4 bytes to memory (or port).",
     157        .func = cmd_pio_write_32,
     158        .argc = 2,
     159        .argv = pio_write_32_argv
    83160};
    84161
     
    531608        &btrace_info,
    532609#endif
     610        &pio_read_8_info,
     611        &pio_read_16_info,
     612        &pio_read_32_info,
     613        &pio_write_8_info,
     614        &pio_write_16_info,
     615        &pio_write_32_info,
    533616        NULL
    534617};
     
    557640        for (i = 0; basic_commands[i]; i++) {
    558641                if (!cmd_register(basic_commands[i])) {
    559                         printf("Cannot register command %s\n",
     642                        log(LF_OTHER, LVL_ERROR,
     643                            "Cannot register command %s",
    560644                            basic_commands[i]->name);
    561645                }
     
    574658       
    575659        size_t len = 0;
    576         list_foreach(cmd_list, cur) {
    577                 cmd_info_t *hlp;
    578                 hlp = list_get_instance(cur, cmd_info_t, link);
    579                
     660        list_foreach(cmd_list, link, cmd_info_t, hlp) {
    580661                spinlock_lock(&hlp->lock);
    581662                if (str_length(hlp->name) > len)
     
    586667        unsigned int _len = (unsigned int) len;
    587668        if ((_len != len) || (((int) _len) < 0)) {
    588                 printf("Command length overflow\n");
     669                log(LF_OTHER, LVL_ERROR, "Command length overflow");
    589670                return 1;
    590671        }
    591672       
    592         list_foreach(cmd_list, cur) {
    593                 cmd_info_t *hlp;
    594                 hlp = list_get_instance(cur, cmd_info_t, link);
    595                
     673        list_foreach(cmd_list, link, cmd_info_t, hlp) {
    596674                spinlock_lock(&hlp->lock);
    597675                printf("%-*s %s\n", _len, hlp->name, hlp->description);
     
    604682}
    605683
     684/** Read 1 byte from phys memory or io port.
     685 *
     686 * @param argv Argument vector.
     687 *
     688 * @return 0 on failure, 1 on success.
     689 */
     690static int cmd_pio_read_8(cmd_arg_t *argv)
     691{
     692        uint8_t *ptr = NULL;
     693       
     694#ifdef IO_SPACE_BOUNDARY
     695        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     696                ptr = (void *) argv[0].intval;
     697        else
     698#endif
     699                ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
     700                    PAGE_NOT_CACHEABLE);
     701       
     702        const uint8_t val = pio_read_8(ptr);
     703        printf("read %" PRIxn ": %" PRIx8 "\n", argv[0].intval, val);
     704       
     705#ifdef IO_SPACE_BOUNDARY
     706        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     707                return 1;
     708#endif
     709       
     710        km_unmap((uintptr_t) ptr, sizeof(uint8_t));
     711        return 1;
     712}
     713
     714/** Read 2 bytes from phys memory or io port.
     715 *
     716 * @param argv Argument vector.
     717 *
     718 * @return 0 on failure, 1 on success.
     719 */
     720static int cmd_pio_read_16(cmd_arg_t *argv)
     721{
     722        uint16_t *ptr = NULL;
     723       
     724#ifdef IO_SPACE_BOUNDARY
     725        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     726                ptr = (void *) argv[0].intval;
     727        else
     728#endif
     729                ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
     730                    PAGE_NOT_CACHEABLE);
     731       
     732        const uint16_t val = pio_read_16(ptr);
     733        printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val);
     734       
     735#ifdef IO_SPACE_BOUNDARY
     736        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     737                return 1;
     738#endif
     739       
     740        km_unmap((uintptr_t) ptr, sizeof(uint16_t));
     741        return 1;
     742}
     743
     744/** Read 4 bytes from phys memory or io port.
     745 *
     746 * @param argv Argument vector.
     747 *
     748 * @return 0 on failure, 1 on success.
     749 */
     750static int cmd_pio_read_32(cmd_arg_t *argv)
     751{
     752        uint32_t *ptr = NULL;
     753       
     754#ifdef IO_SPACE_BOUNDARY
     755        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     756                ptr = (void *) argv[0].intval;
     757        else
     758#endif
     759                ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
     760                    PAGE_NOT_CACHEABLE);
     761       
     762        const uint32_t val = pio_read_32(ptr);
     763        printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val);
     764       
     765#ifdef IO_SPACE_BOUNDARY
     766        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     767                return 1;
     768#endif
     769       
     770        km_unmap((uintptr_t) ptr, sizeof(uint32_t));
     771        return 1;
     772}
     773
     774/** Write 1 byte to phys memory or io port.
     775 *
     776 * @param argv Argument vector.
     777 *
     778 * @return 0 on failure, 1 on success.
     779 */
     780static int cmd_pio_write_8(cmd_arg_t *argv)
     781{
     782        uint8_t *ptr = NULL;
     783       
     784#ifdef IO_SPACE_BOUNDARY
     785        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     786                ptr = (void *) argv[0].intval;
     787        else
     788#endif
     789                ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
     790                    PAGE_NOT_CACHEABLE);
     791       
     792        printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval,
     793            (uint8_t) argv[1].intval);
     794        pio_write_8(ptr, (uint8_t) argv[1].intval);
     795       
     796#ifdef IO_SPACE_BOUNDARY
     797        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     798                return 1;
     799#endif
     800       
     801        km_unmap((uintptr_t) ptr, sizeof(uint8_t));
     802        return 1;
     803}
     804
     805/** Write 2 bytes to phys memory or io port.
     806 *
     807 * @param argv Argument vector.
     808 *
     809 * @return 0 on failure, 1 on success.
     810 */
     811static int cmd_pio_write_16(cmd_arg_t *argv)
     812{
     813        uint16_t *ptr = NULL;
     814       
     815#ifdef IO_SPACE_BOUNDARY
     816        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     817                ptr = (void *) argv[0].intval;
     818        else
     819#endif
     820                ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
     821                    PAGE_NOT_CACHEABLE);
     822       
     823        printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval,
     824            (uint16_t) argv[1].intval);
     825        pio_write_16(ptr, (uint16_t) argv[1].intval);
     826       
     827#ifdef IO_SPACE_BOUNDARY
     828        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     829                return 1;
     830#endif
     831       
     832        km_unmap((uintptr_t) ptr, sizeof(uint16_t));
     833        return 1;
     834}
     835
     836/** Write 4 bytes to phys memory or io port.
     837 *
     838 * @param argv Argument vector.
     839 *
     840 * @return 0 on failure, 1 on success.
     841 */
     842static int cmd_pio_write_32(cmd_arg_t *argv)
     843{
     844        uint32_t *ptr = NULL;
     845       
     846#ifdef IO_SPACE_BOUNDARY
     847        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     848                ptr = (void *) argv[0].intval;
     849        else
     850#endif
     851                ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
     852                    PAGE_NOT_CACHEABLE);
     853       
     854        printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval,
     855            (uint32_t) argv[1].intval);
     856        pio_write_32(ptr, (uint32_t) argv[1].intval);
     857       
     858#ifdef IO_SPACE_BOUNDARY
     859        if ((void *) argv->intval < IO_SPACE_BOUNDARY)
     860                return 1;
     861#endif
     862       
     863        km_unmap((uintptr_t) ptr, sizeof(uint32_t));
     864        return 1;
     865}
     866
    606867/** Reboot the system.
    607868 *
     
    647908        spinlock_lock(&cmd_lock);
    648909       
    649         list_foreach(cmd_list, cur) {
    650                 cmd_info_t *hlp;
    651                
    652                 hlp = list_get_instance(cur, cmd_info_t, link);
     910        list_foreach(cmd_list, link, cmd_info_t, hlp) {
    653911                spinlock_lock(&hlp->lock);
    654912               
     
    8911149int cmd_set4(cmd_arg_t *argv)
    8921150{
    893         uintptr_t addr;
     1151        uintptr_t addr = 0; // Prevent -Werror=maybe-uninitialized
    8941152        uint32_t arg1 = argv[1].intval;
    8951153        bool pointer = false;
     
    10991357        printf("The kernel will now relinquish the console.\n");
    11001358        release_console();
    1101        
    1102         event_notify_0(EVENT_KCONSOLE, false);
    11031359        indev_pop_character(stdin);
    11041360       
Note: See TracChangeset for help on using the changeset viewer.