From bochs-dev Tue Jun 21 19:51:03 2005 From: Russell Miller Date: Tue, 21 Jun 2005 19:51:03 +0000 To: bochs-dev Subject: Re: [Bochs-developers] Keyboard interception question Message-Id: <200506211251.03945.rmiller () duskglow ! com> X-MARC-Message: https://marc.info/?l=bochs-dev&m=111938336728905 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--Boundary-00=_n+GuC1H9zipjZwe" --Boundary-00=_n+GuC1H9zipjZwe Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline On Tuesday 21 June 2005 12:30, Daniel Gryniewicz wrote: > possible. The problem is that DOS drivers access the hardware directly > by invoking BIOS function mapped into specific locations in memory. > These BIOS functions directly poke the harware. That kind of hardware > access is not possible in protected mode in userspace, only in kernel > space. You'd have to write a kernel level driver to directly emulate > the DOS hardware interface, and then export that to userpsace, and then > hook the output of the bochs BIOS to it. My guess is that would require > enough information to write a real driver for Linux for the keyboard. > Regarding the access to the hardware not being possible in protected mode in userspace, I respectfully say BS. :) Because I've done it, and I even have a little program to do it. All you have to do is have permission to access /dev/port. I wrote the proof of concept last night. Basically, you read from position 0x64 and 0x60 in /dev/port, and write to 0x60. Attached is the sample program that works under linux, just to prove it. So now that that is out of the way, how do I hook the output of the BOCHS bios to the userspace program? Thanks. --Russell -- Russell Miller - rmiller@duskglow.com - Agoura, CA --Boundary-00=_n+GuC1H9zipjZwe Content-Type: text/x-csrc; charset="utf-8"; name="prg.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="prg.c" #include #include #include #include #define CMD_E9 0xE9 #define ENABLE_KBD 0xF4 #define DISABLE_KBD 0xF5 #define ECHO_KBD 0xEE #define RST_SELFTST_KBD 0xFF void wait_for_kbd(int fd) { char data; do { lseek(fd, 0x64, 0); read(fd, &data, 1); } while ((data & 2) == 2); } void write_kbd(int fd, unsigned char data) { fprintf(stderr, "writing keyboard\n"); wait_for_kbd(fd); lseek(fd, 0x60, 0); write(fd, &data, 1); } void read_kbd(int fd, unsigned char *data) { lseek(fd, 0x60, 0); read(fd, data, 1); } void enable_kbd(int fd) { fprintf(stderr, "enabling keyboard\n"); write_kbd(fd, 0xf4); } void disable_kbd(int fd) { fprintf(stderr, "disabling keyboard\n"); write_kbd(fd, 0xf5); } int main(int argc, char **argv) { int fd; int tries = 0; unsigned char data; if ((fd = open("/dev/port", O_RDWR)) < 0) { fprintf(stderr, "Cannot open /dev/port: %s\n", strerror(errno)); exit(1); } /* disable_kbd(fd);*/ data = RST_SELFTST_KBD; write_kbd(fd, data); data = 0; fprintf(stderr, "reading keyboard\n"); do { read_kbd(fd, &data); if (tries == 200000) { break; } tries++; } while (data != ECHO_KBD); /* enable_kbd(fd);*/ if (data == 0xaa) { printf("test succeeded!\n"); } else { printf("test failed! (data is %d)\n", data); } } --Boundary-00=_n+GuC1H9zipjZwe-- ------------------------------------------------------- SF.Net email is sponsored by: Discover Easy Linux Migration Strategies from IBM. Find simple to follow Roadmaps, straightforward articles, informative Webcasts and more! Get everything you need to get up to speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click _______________________________________________ bochs-developers mailing list bochs-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bochs-developers