summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2009-10-02 10:52:58 +1000
committerDave Airlie <airlied@redhat.com>2009-10-02 10:52:58 +1000
commitd515a265609d985e18cc601145bf30480ff2d99b (patch)
tree45a9cf0b4341e82988ec304dfed3023bf0814648
parentc4b309446c21f21d4ade5b0d46136ccf39390ef6 (diff)
vbetool: don't allow execution of any thing that might screw up kms
This blocks operations that might happen on s/r when kms is in operation. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--vbetool.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/vbetool.c b/vbetool.c
index f77c191..6fd56f0 100644
--- a/vbetool.c
+++ b/vbetool.c
@@ -40,6 +40,34 @@ version 2
#define DPMS_STATE_OFF 0x0400
#define DPMS_STATE_LOW 0x0800
+static int primary_gpu_has_kernel_driver(void)
+{
+ struct pci_id_match dev_match = {
+ PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY,
+ (0x03 << 16), 0xff000, 0 };
+ struct pci_device *dev;
+ struct pci_device_iterator *iter;
+ int ret = 0;
+
+ iter = pci_id_match_iterator_create(&dev_match);
+ if (iter == NULL) {
+ return 1;
+ }
+
+ while ((dev = pci_device_next(iter)) != NULL) {
+ int is_boot = pci_device_is_boot_vga(dev);
+ if (!is_boot)
+ continue;
+
+ if (pci_device_has_kernel_driver(dev)) {
+ ret = 1;
+ break;
+ }
+ }
+ pci_iterator_destroy(iter);
+ return ret;
+}
+
int vbetool_init (void) {
if (!LRMI_init()) {
fprintf(stderr, "Failed to initialise LRMI (Linux Real-Mode Interface).\n");
@@ -70,6 +98,10 @@ int main(int argc, char *argv[])
return err;
}
+ if (primary_gpu_has_kernel_driver()) {
+ fprintf(stderr,"no save or restore with kernel driver loaded\n");
+ return 0;
+ }
if (!strcmp(argv[2], "save")) {
save_state();
} else if (!strcmp(argv[2], "restore")) {
@@ -92,6 +124,12 @@ int main(int argc, char *argv[])
goto usage;
}
} else if (!strcmp(argv[1], "vbemode")) {
+
+ if (primary_gpu_has_kernel_driver()) {
+ fprintf(stderr,"no save or restore with kernel driver loaded\n");
+ return 0;
+ }
+
if (!strcmp(argv[2], "set")) {
return do_set_mode(atoi(argv[3]),0);
} else if (!strcmp(argv[2], "get")) {
@@ -100,6 +138,12 @@ int main(int argc, char *argv[])
goto usage;
}
} else if (!strcmp(argv[1], "vgamode")) {
+
+ if (primary_gpu_has_kernel_driver()) {
+ fprintf(stderr,"no save or restore with kernel driver loaded\n");
+ return 0;
+ }
+
if (!strcmp(argv[2], "set")) {
return do_set_mode(atoi(argv[3]),1);
} else {
@@ -149,6 +193,12 @@ int main(int argc, char *argv[])
return -1;
#endif
} else if (!strcmp(argv[1], "vgastate")) {
+
+ if (primary_gpu_has_kernel_driver()) {
+ fprintf(stderr,"no save or restore with kernel driver loaded\n");
+ return 0;
+ }
+
if (!strcmp(argv[2], "on")) {
return enable_vga();
} else {