/[hurd]/hurd/console-client/vga-support.c
ViewVC logotype

Diff of /hurd/console-client/vga-support.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by marcus, Mon Sep 30 17:13:14 2002 UTC revision 1.4 by marcus, Mon Nov 18 07:35:47 2002 UTC
# Line 76  error_t Line 76  error_t
76  vga_init (void)  vga_init (void)
77  {  {
78    error_t err;    error_t err;
 #if OSKIT_MACH  
79    int fd;    int fd;
 #else  
   device_t device_master = MACH_PORT_NULL;  
   memory_object_t kd_mem = MACH_PORT_NULL;  
   static device_t kd_device = MACH_PORT_NULL;  
   vm_address_t mapped;  
 #endif  
80    
81  #if OSKIT_MACH    /* Acquire I/O port access.  */
82    if (ioperm (VGA_MIN_REG, VGA_MAX_REG - VGA_MIN_REG + 1, 1) < 0)    if (ioperm (VGA_MIN_REG, VGA_MAX_REG - VGA_MIN_REG + 1, 1) < 0)
83      {      {
84        free (vga_state);        /* GNU Mach v1 is broken in that it doesn't implement an I/O
85        return errno;           perm interface and just allows all tasks to access any I/O
86             port.  */
87          if (errno != EMIG_BAD_ID && errno != ENOSYS)
88            {
89              free (vga_state);
90              return errno;
91            }
92      }      }
93    
94    fd = open ("/dev/mem", O_RDWR);    fd = open ("/dev/mem", O_RDWR);
95    if (fd < 0)    if (fd >= 0)
96        {
97          vga_videomem = mmap (0, VGA_VIDEO_MEM_LENGTH, PROT_READ | PROT_WRITE,
98                               MAP_SHARED, fd, VGA_VIDEO_MEM_BASE_ADDR);
99          err = errno;
100          close (fd);
101          if (vga_videomem == (void *) -1)
102            return err;
103        }
104      else if (errno == ENXIO)
105        {
106          /* GNU Mach v1 does not provide /dev/mem, but allows direct
107             memory access to the video memory through the special "kd"
108             kernel device.  */
109          device_t device_master = MACH_PORT_NULL;
110          memory_object_t kd_mem = MACH_PORT_NULL;
111          static device_t kd_device = MACH_PORT_NULL;
112          vm_address_t mapped;
113    
114          err = get_privileged_ports (0, &device_master);
115          if (err)
116            return err;
117    
118          err = device_open (device_master, D_WRITE, "kd", &kd_device);
119          if (err)
120            return err;
121    
122          err = device_map (kd_device, VM_PROT_READ | VM_PROT_WRITE,
123                            VIDMMAP_BEGIN - VIDMMAP_KDOFS, VIDMMAP_SIZE,
124                            &kd_mem, 0);
125          if (err)
126            return err;
127    
128          err = vm_map (mach_task_self (), &mapped, VIDMMAP_SIZE,
129                        0, 1, kd_mem, VIDMMAP_BEGIN - VIDMMAP_KDOFS, 0,
130                        VM_PROT_READ | VM_PROT_WRITE, VM_PROT_READ | VM_PROT_WRITE,
131                        VM_INHERIT_NONE);
132          if (err)
133            return err;
134    
135          vga_videomem = (char *) mapped;
136          assert (vga_videomem != NULL);
137    
138          mach_port_deallocate (mach_task_self (), device_master);
139          mach_port_deallocate (mach_task_self (), kd_mem);
140        }
141      else
142      return errno;      return errno;
   vga_videomem = mmap (0, VGA_VIDEO_MEM_LENGTH, PROT_READ | PROT_WRITE,  
                        MAP_SHARED, fd, VGA_VIDEO_MEM_BASE_ADDR);  
   err = errno;  
   close (fd);  
   if (vga_videomem == (void *) -1)  
     return err;  
 #else  
   err = get_privileged_ports (0, &device_master);  
   if (err)  
     return err;  
   
   err = device_open (device_master, D_WRITE, "kd", &kd_device);  
   if (err)  
     return err;  
   
   err = device_map (kd_device, VM_PROT_READ | VM_PROT_WRITE,  
                     VIDMMAP_BEGIN - VIDMMAP_KDOFS, VIDMMAP_SIZE,  
                     &kd_mem, 0);  
   if (err)  
     return err;  
   
   err = vm_map (mach_task_self (), &mapped, VIDMMAP_SIZE,  
                 0, 1, kd_mem, VIDMMAP_BEGIN - VIDMMAP_KDOFS, 0,  
                 VM_PROT_READ | VM_PROT_WRITE, VM_PROT_READ | VM_PROT_WRITE,  
                 VM_INHERIT_NONE);  
   if (err)  
     return err;  
   
   vga_videomem = (char *) mapped;  
   assert (vga_videomem != NULL);  
   
   mach_port_deallocate (mach_task_self (), device_master);  
   mach_port_deallocate (mach_task_self (), kd_mem);  
 #endif  
143    
144    /* Save the current state.  */    /* Save the current state.  */
145    vga_state = malloc (sizeof (*vga_state));    vga_state = malloc (sizeof (*vga_state));

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26