Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 #include <hwcore/ioports.h> 018 #include <hwcore/ioports.h>
019 #include <sos/klibc.h> 019 #include <sos/klibc.h>
020 020
021 #include "bochs.h" 021 #include "bochs.h"
022 022
023 023
024 024
025 #define SOS_BOCHS_IOPORT 0xe9 025 #define SOS_BOCHS_IOPORT 0xe9
026 026
027 sos_ret_t sos_bochs_setup(void) !! 027 sos_ret_t sos_bochs_subsystem_setup(void)
028 { 028 {
029 return SOS_OK; 029 return SOS_OK;
030 } 030 }
031 031
032 #define _putchar(chr) \ 032 #define _putchar(chr) \
033 outb((chr), SOS_BOCHS_IOPORT) 033 outb((chr), SOS_BOCHS_IOPORT)
034 034
035 sos_ret_t sos_bochs_putchar(char c) 035 sos_ret_t sos_bochs_putchar(char c)
036 { 036 {
037 _putchar(c); 037 _putchar(c);
038 038
039 return SOS_OK; 039 return SOS_OK;
040 } 040 }
041 041
042 sos_ret_t sos_bochs_putstring(const char* str) 042 sos_ret_t sos_bochs_putstring(const char* str)
043 { 043 {
044 for ( ; str && (*str != '\0') ; str++) 044 for ( ; str && (*str != '\0') ; str++)
045 _putchar(*str); 045 _putchar(*str);
046 046
047 return SOS_OK; 047 return SOS_OK;
048 } 048 }
049 049
050 sos_ret_t sos_bochs_puthex(unsigned val, int n 050 sos_ret_t sos_bochs_puthex(unsigned val, int nbytes)
051 { 051 {
052 unsigned c; 052 unsigned c;
053 053
054 #define BOCHS_PRTHEX(q) \ 054 #define BOCHS_PRTHEX(q) \
055 ({ unsigned char r; if ((q) >= 10) r='a'+(q) 055 ({ unsigned char r; if ((q) >= 10) r='a'+(q)-10; \
056 else r='0'+(q); _putchar(r); }) 056 else r='0'+(q); _putchar(r); })
057 057
058 switch (nbytes) 058 switch (nbytes)
059 { 059 {
060 case 4: 060 case 4:
061 c = (val >> 24) & 0xff; 061 c = (val >> 24) & 0xff;
062 BOCHS_PRTHEX((c >> 4)&0xf); 062 BOCHS_PRTHEX((c >> 4)&0xf);
063 BOCHS_PRTHEX(c&0xf); 063 BOCHS_PRTHEX(c&0xf);
064 case 3: 064 case 3:
065 c = (val >> 16) & 0xff; 065 c = (val >> 16) & 0xff;
066 BOCHS_PRTHEX((c >> 4)&0xf); 066 BOCHS_PRTHEX((c >> 4)&0xf);
067 BOCHS_PRTHEX(c&0xf); 067 BOCHS_PRTHEX(c&0xf);
068 case 2: 068 case 2:
069 c = (val >> 8) & 0xff; 069 c = (val >> 8) & 0xff;
070 BOCHS_PRTHEX((c >> 4)&0xf); 070 BOCHS_PRTHEX((c >> 4)&0xf);
071 BOCHS_PRTHEX(c&0xf); 071 BOCHS_PRTHEX(c&0xf);
072 case 1: 072 case 1:
073 c = val & 0xff; 073 c = val & 0xff;
074 BOCHS_PRTHEX((c >> 4)&0xf); 074 BOCHS_PRTHEX((c >> 4)&0xf);
075 BOCHS_PRTHEX(c&0xf); 075 BOCHS_PRTHEX(c&0xf);
076 } 076 }
077 077
078 return SOS_OK; 078 return SOS_OK;
079 } 079 }
080 080
081 081
082 sos_ret_t sos_bochs_hexdump(const void* addr, 082 sos_ret_t sos_bochs_hexdump(const void* addr, int nbytes)
083 { 083 {
084 int offs; 084 int offs;
085 for (offs = 0 ; offs < nbytes ; offs++) 085 for (offs = 0 ; offs < nbytes ; offs++)
086 { 086 {
087 const unsigned char *c; 087 const unsigned char *c;
088 088
089 if ((offs % 16) == 0) 089 if ((offs % 16) == 0)
090 { 090 {
091 sos_bochs_putstring("0x"); 091 sos_bochs_putstring("0x");
092 sos_bochs_puthex(offs, 4); 092 sos_bochs_puthex(offs, 4);
093 } 093 }
094 094
095 if ((offs % 8) == 0) 095 if ((offs % 8) == 0)
096 sos_bochs_putstring(" "); 096 sos_bochs_putstring(" ");
097 097
098 c = (const unsigned char*)(addr + offs); 098 c = (const unsigned char*)(addr + offs);
099 sos_bochs_puthex(*c, 1); 099 sos_bochs_puthex(*c, 1);
100 sos_bochs_putstring(" "); 100 sos_bochs_putstring(" ");
101 101
102 if (((offs + 1) % 16) == 0) 102 if (((offs + 1) % 16) == 0)
103 sos_bochs_putstring("\n"); 103 sos_bochs_putstring("\n");
104 } 104 }
105 105
106 if (offs % 16) 106 if (offs % 16)
107 sos_bochs_putstring("\n"); 107 sos_bochs_putstring("\n");
108 108
109 return SOS_OK; 109 return SOS_OK;
110 } 110 }
111 111
112 112
113 sos_ret_t sos_bochs_printf(const char *format, 113 sos_ret_t sos_bochs_printf(const char *format, ...)
114 { 114 {
115 char buff[256]; 115 char buff[256];
116 va_list ap; 116 va_list ap;
117 117
118 va_start(ap, format); 118 va_start(ap, format);
119 vsnprintf(buff, sizeof(buff), format, ap); 119 vsnprintf(buff, sizeof(buff), format, ap);
120 va_end(ap); 120 va_end(ap);
121 121
122 return sos_bochs_putstring(buff); 122 return sos_bochs_putstring(buff);
123 } 123 }