OpenSolaris, OpenIndiana, Nexenta Forum
OpenSolaris, OpenIndiana, Nexenta => OpenIndiana => Тема начата: keremet от Декабрь 14, 2014, 08:10:05 pm
-
Требуется установить разрешение экрана 1366x768 вместо устанавливаемого по умолчанию 1024x768
Похоже, что любая видеокарта позволяет выставить любое разрешение
http://frolov-lib.ru/books/bsp/v21/ch4_8.htm
http://pcabc.ru/to/to23.html
https://ru.wikipedia.org/wiki/WXGA
http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/io/vgasubr.c
http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/intel/io/vgatext/vgatext.c
После сообщения "Searching for matching VESA mode(s):" вызывается в драйвере Xorg vesa
функция VBEGetModePool
http://www.macbreaker.com/2012/06/how-to-set-your-hackintosh-bootscreen.html
Как задать требуемую ширину экрана:
http://freespace.virgin.net/hugo.elias/graphics/x_vapp05.htm
В vesa:
/* Set a graphics mode */
static Bool
VESASetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode){
....
if (data->data->XResolution != pScrn->displayWidth)
VBESetLogicalScanline(pVesa->pVbe, pScrn->displayWidth);
}
keremet@openindiana:~$ cvt 1366 768
# 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
Modeline "1368x768_60.00" 85.25 1368 1440 1576 1784 768 771 781 798 -hsync +vsync
Последняя команда завершилась ошибкой "xrandr: Configure crtc 0 failed"
xrandr --newmode "1368x768_60.00" 85.25 1368 1440 1576 1784 768 771 781 798 -hsync +vsync
xrandr --addmode default 1368x768_60.00
xrandr --output default --mode 1368x768_60.00
http://myit-solutions.blogspot.ru/2010/09/how-to-add-and-set-custom-display.html
Драйвер vgatext отвечает исключительно за текстовый режим. Графический режим по всей видимости устанавливается в xorg.
0 -> vgatext_ioctl
0 -> do_gfx_ioctl
0 -> vgatext_kdsetmode
0 -> vgatext_kdsetgraphics
0 -> vgatext_progressbar_stop
0 <- vgatext_progressbar_stop
0 -> vgatext_save_text
0 <- vgatext_save_text
0 <- vgatext_kdsetgraphics
0 <- vgatext_kdsetmode
0 <- do_gfx_ioctl
0 <- vgatext_ioctl
0 -> vgatext_open
0 <- vgatext_open
0 -> vgatext_ioctl
0 -> do_gfx_ioctl
0 <- do_gfx_ioctl
0 <- vgatext_ioctl
Из пользовательного режима запускаю
movw $0x03D4, %dx
movb $4, %al
outb (%dx) //Тут коредамп
Проверить: в VBEGetModePool (вызывается в vesa_drv) ищутся только стандартные или еще и нестандартные режимы (см. Зубков с 158)
xorg-server-1.7.7$ ggrep -Rn --color VBEGetModePool ./
./hw/xfree86/vbe/vbeModes.h:72:extern _X_EXPORT DisplayModePtr VBEGetModePool(ScrnInfoPtr pScrn, vbeInfoPtr pVbe,
./hw/xfree86/vbe/vbeModes.c:273:VBEGetModePool(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe,
#!/usr/sbin/dtrace -s
#pragma D option flowindent
pid$target:::entry,
pid$target:::return
/probemod=="libvbe.so"/
{
}
./X.sh -c X
CPU FUNCTION
0 -> vbeSetup
0 <- vbeSetup
0 -> VBEExtendedInit
0 <- VBEExtendedInit
0 -> VBEGetVBEInfo
0 <- VBEGetVBEInfo
0 -> VBEFindSupportedDepths
0 -> GetDepthFlag
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- GetDepthFlag
....
1 -> GetDepthFlag
1 -> VBEGetModeInfo
1 <- VBEGetModeInfo
1 -> VBEFreeModeInfo
1 <- VBEFreeModeInfo
1 <- GetDepthFlag
1 <- VBEFindSupportedDepths
1 -> vbeDoEDID
1 -> vbeReadEDID
0 <- vbeReadEDID
0 <- vbeDoEDID
0 -> VBEGetModePool
0 -> CheckMode
0 -> VBEGetModeInfo
1 <- VBEGetModeInfo
1 -> VBEFreeModeInfo
1 <- VBEFreeModeInfo
1 <- CheckMode
1 -> CheckMode
1 -> VBEGetModeInfo
1 <- VBEGetModeInfo
1 -> VBEFreeModeInfo
1 <- VBEFreeModeInfo
1 <- CheckMode
....
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
1 <- VBEGetModeInfo
1 <- CheckMode
1 -> CheckMode
1 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
......
0 -> CheckMode
0 -> VBEGetModeInfo
0 <- VBEGetModeInfo
0 -> VBEFreeModeInfo
0 <- VBEFreeModeInfo
0 <- CheckMode
0 <- VBEGetModePool
0 -> VBESetModeNames
0 <- VBESetModeNames
0 -> VBEValidateModes
0 <- VBEValidateModes
0 -> VBEValidateModes
0 <- VBEValidateModes
0 -> VBEPrintModes
0 <- VBEPrintModes
0 -> VBESetModeParameters
0 <- VBESetModeParameters
0 -> vbeFree
0 <- vbeFree
0 -> VBEExtendedInit
0 <- VBEExtendedInit
0 -> VBEGetVBEMode
1 <- VBEGetVBEMode
1 -> VBESaveRestore
0 <- VBESaveRestore
0 -> VBESaveRestore
0 <- VBESaveRestore
0 -> VBESetGetPaletteData
0 <- VBESetGetPaletteData
0 -> VBESetVBEMode
1 <- VBESetVBEMode
1 -> VBESetDisplayStart
1 <- VBESetDisplayStart
В VbeInfoBlock * VBEGetVBEInfo(vbeInfoPtr pVbe) происходит обращение к биос за списком режимов, в предыдущей функции этот список просто используется. Посмотрим в отладчике, выдается ли список нестандартных режимов.
root@openindiana:/home/keremet# mdb /usr/bin/Xorg
Loading modules: [ Xorg ]
> :c
mdb: execve detected: (f)ollow new program or (s)top? f
mdb: lost control of PID 1972 due to exec of 64-bit executable
mdb: restarting debugger to follow PID 1972 ...
mdb: target performed exec of /usr/bin/amd64/Xorg
Loading modules: [ Xorg ld.so.1 ]
> ::bp libvbe.so`VBEGetVBEInfo
> :c
X.Org X Server 1.7.7
Release Date: 2010-05-04
X Protocol Version 11, Revision 0
Build Operating System: SunOS 5.11 i86pc
Current Operating System: SunOS openindiana 5.11 oi_151a8 i86pc
Build Date: 18 February 2013 09:58:49PM
Solaris ABI: 64-bit
Current version of pixman: 0.18.4
Before reporting problems, check http://openindiana.org/consolidation/xnv
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Wed Dec 31 18:13:22 2014
(==) Using default built-in configuration (30 lines)
(EE) Failed to load module "xtsol" (module does not exist, 0)
(EE) Failed to load module "fbdev" (module does not exist, 0)
(II) [KMS] drm report modesetting isn't supported.
mdb: stop at libvbe.so`VBEGetVBEInfo
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo:pushq %rbp
mdb: You've got symbols!
Loading modules: [ libc.so.1 ]
> :e
...
> :e
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo+0x129: call -0xae6 <PLT:strdup>
> ::regs
%rax = 0x00000000006d6dd0
...
> 0x00000000006d6dd0 ::dump
\/ 1 2 3 4 5 6 7 8 9 a b c d e f v123456789abcdef
6d6dd0: 414d4420 41544f4d 42494f53 00000000 AMD ATOMBIOS....
> :e
mdb: target stopped at:
libvbe.so`VBEGetVBEInfo+0x18b: call -0xc08 <PLT=libint10.so`xf86int10Addr>
Функция возвращает 0x00000000006f8684. Смотрим что по этому адресу:
> 0x00000000006f8684 ::dump -g 2 -w 2
0 1 2 3 \/ 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123v56789abcdef0123456789abcdef
6f8680: 0000 0000 0001 0101 0301 0501 0701 1001 1101 1301 1401 1601 1701 1901 1a01 0d01 ................................
> 0x00000000006f8684 ::dump -g 2 -w 2 -r
0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef0123456789abcdef
0: 0001 0101 0301 0501 0701 1001 1101 1301 1401 1601 1701 1901 1a01 0d01 0e01 2001 .............................. .
> 0x00000000006f8684 ::dump -g 2 -r
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
0: 0001 0101 0301 0501 0701 1001 1101 1301 ................
> 0x00000000006f86ee ::dump -g 2 -r
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
0: ffff 0000 0000 0000 0000 0000 0000 0000 ................
> 0x00000000006f86e0 ::dump -g 2 -r
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
0: 8601 d301 d501 d601 e301 e501 e601 ffff ................
Действительно номера режимов - сравним с
grep "Mode:" Xorg.0.log
После ffff идут нули - значит номера нестандарных режимов не передаются сюда
vesa.c:
static void
VESASetModeParameters(vbeInfoPtr pVbe, DisplayModePtr vbemode,
DisplayModePtr ddcmode)
Тут заполняется структура VbeCRTCInfoBlock, которую можно передавать в функцию установки режима. Через mdb выявлено, что сейчас структура не передается.
http://www.arachnoid.com/modelines/
-
scanpci
pci bus 0x0000 cardnum 0x01 function 0x00: vendor 0x1002 device 0x9802
Advanced Micro Devices, Inc. [AMD/ATI] Wrestler [Radeon HD 6310]
Прописал в /etc/X11/xorg.conf драйвер ati.
В /usr/lib/xorg/modules/drivers/amd64/ati_drv.so определяется, какой драйвер соответствует видеокарте. В нашем случае radeon_drv.so
Вызовы функций в radeon_drv.so
1 -> RADEONSetup
1 <- RADEONSetup
1 -> RADEONIdentify
1 <- RADEONIdentify
1 -> RADEONDriverFunc
1 <- RADEONDriverFunc
1 -> RADEONDriverFunc
1 <- RADEONDriverFunc
1 -> radeon_pci_probe
1 <- radeon_pci_probe
Выполнение прерывается на этой функции (radeon_probe.c)
static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev)
{
char *busIdString;
int ret;
if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
"[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n");
return FALSE;
}
busIdString = DRICreatePCIBusID(pci_dev);//"pci:0000:00:01.0"
ret = drmCheckModesettingSupported(busIdString); //%rax = 0x00000000ffffffa7
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
if (ret) {
if (xf86LoadKernelModule("radeonkms")) //Может быть портировать этот модуль?
ret = drmCheckModesettingSupported(busIdString);
}
#endif
free(busIdString);
if (ret) {
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
"[KMS] drm report modesetting isn't supported.\n"); //Это сообщение выводится
return FALSE; //Выход тут
}
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
"[KMS] Kernel modesetting enabled.\n");
return TRUE;
}
Пропытка обмануть драйвер, что KMS есть.
root@openindiana:/home/keremet# mdb /usr/bin/amd64/Xorg
Loading modules: [ Xorg ]
> ::bp radeon_drv.so`radeon_pci_probe
> :c
X.Org X Server 1.7.7
Release Date: 2010-05-04
X Protocol Version 11, Revision 0
Build Operating System: SunOS 5.11 i86pc
Current Operating System: SunOS openindiana 5.11 oi_151a8 i86pc
Build Date: 18 February 2013 09:58:49PM
Solaris ABI: 64-bit
Current version of pixman: 0.18.4
Before reporting problems, check http://openindiana.org/consolidation/xnv
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Tue Jan 6 13:44:28 2015
(==) Using config file: "/etc/X11/xorg.conf"
(EE) Failed to load module "xtsol" (module does not exist, 0)
mdb: stop at radeon_drv.so`radeon_pci_probe
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe: pushq %rbp
mdb: You've got symbols!
Loading modules: [ ld.so.1 libc.so.1 ]
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+1: leaq +0x570b8(%rip),%rcx <radeon_drv.so`RADEONPciChipsets>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+8: xorl %r9d,%r9d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb: xorl %r8d,%r8d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe: xorl %edi,%edi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x10: movq %rsp,%rbp
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x13: movq %rbx,-0x20(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x17: movq %r13,-0x10(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x1b: movq %rdx,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x1e: movq %r14,-0x8(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x22: movq %r12,-0x18(%rbp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x26: subq $0x40,%rsp
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2a: movl %esi,%edx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2c: movl %esi,%r14d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x2f: movq $0x0,0x10(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x38: xorl %esi,%esi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x3a: movq $0x0,0x8(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x43: movq $0x0,(%rsp)
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x4b: call -0x4958 <PLT:xf86ConfigPciEntity>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x50: movq %rax,%r13
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x53: xorl %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x55: testq %r13,%r13
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x58: je +0x32 <radeon_drv.so`radeon_pci_probe+0x8c>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x5a: testq %rbx,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x5d: je +0x96 <radeon_drv.so`radeon_pci_probe+0xf9>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x63: leaq +0x45c9d(%rip),%rdi <0xfffffd7ffe88c4e7>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x6a: call -0x4967 <PLT:xf86LoaderCheckSymbol>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x6f: testl %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0x71: jne +0x2d <radeon_drv.so`radeon_pci_probe+0xa0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa0: movq %rbx,%rdi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa3: call -0x4980 <PLT:DRICreatePCIBusID>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xa8: movq %rax,%rbx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xab: movq %rax,%rdi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xae: call -0x497b <PLT:drmCheckModesettingSupported>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb3: movq %rbx,%rdi
> ::regs
%rax = 0x00000000ffffffa7 %r8 = 0x000000007fffffff
%rbx = 0x00000000006e4130 %r9 = 0x0000000000000030
%rcx = 0x00000000006e4140 %r10 = 0x00000000000005c8
%rdx = 0xfffffd7fffdfeb95 %r11 = 0x0000000000000258
%rsi = 0xfffffd7fffdfeb94 %r12 = 0x0000000000000000
%rdi = 0x00000000006e4130 %r13 = 0x00000000006cfe50
%r14 = 0x0000000000000000
%r15 = 0x0000000000009802
%cs = 0x0053 %fs = 0x0000 %gs = 0x0000
%ds = 0x0000 %es = 0x0000 %ss = 0x004b
%rip = 0xfffffd7ffe846893 radeon_drv.so`radeon_pci_probe+0xb3
%rbp = 0xfffffd7fffdffa00
%rsp = 0xfffffd7fffdff9c0
%rflags = 0x00000292
id=0 vip=0 vif=0 ac=0 vm=0 rf=0 nt=0 iopl=0x0
status=<of,df,IF,tf,SF,zf,AF,pf,cf>
%gsbase = 0x0000000000000000
%fsbase = 0xfffffd7fff162a40
%trapno = 0x3
%err = 0x0
> 0>rax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb6: movl %eax,%r12d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xb9: call -0x4a16 <PLT:free>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xbe: testl %r12d,%r12d
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xc1: je +0x1d <radeon_drv.so`radeon_pci_probe+0xe0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe0: movl 0x18(%r13),%edi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xe4: leaq +0x43e15(%rip),%rcx <0xfffffd7ffe88a6e0>
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xeb: xorl %edx,%edx
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xed: movl $0x7,%esi
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf2: xorl %eax,%eax
> ::step over
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf4: call -0x49e1 <PLT:xf86DrvMsgVerb>
> ::step over
(II) [KMS] Kernel modesetting enabled.
mdb: target stopped at:
radeon_drv.so`radeon_pci_probe+0xf9: movq +0x564e0(%rip),%r10 <0xfffffd7ffe89cdc0>
> :c
(EE) RADEON(0): [drm] Failed to open DRM device for pci:0000:00:01.0: No such device or address
(EE) RADEON(0): Kernel modesetting setup failed
(EE) Screen(s) found, but none have a usable configuration.
Fatal server error:
no screens found
Please consult the OpenIndiana, based on X.Org Foundation & OpenSolaris sources support
at http://openindiana.org/consolidation/xnv
for help.
Please also check the log file at "/var/log/Xorg.0.log" for additional information.
mdb: target has terminated
>
-
Реализация KMS в illumos
https://github.com/raichoo/illumos-gate/commits/kms
-
keremet@openindiana:~/compilation/libdrm-2.4.58$ vi xf86drmMode.c
в функции drmCheckModesettingSupported
-#elif defined(__DragonFly__)
+#elif (defined(__sun) && defined(__SVR4)) || defined(__DragonFly__)
return 0;
#endif
root@openindiana:~# Xorg
....
(II) [KMS] Kernel modesetting enabled.
keremet@openindiana:~/compilation$ tar xf xserver-xorg-video-modesetting_0.9.0.orig.tar.gz
keremet@openindiana:~/compilation$ cd xf86-video-modesetting-0.9.0/
keremet@openindiana:~/compilation/xf86-video-modesetting-0.9.0$ PKG_CONFIG_PATH=/home/keremet/compilation/ati_bin/lib/pkgconfig/ CFLAGS="-m64" ./configure --prefix=/home/keremet/compilation/ati_bin/
make
make install
root@openindiana:~# cp /home/keremet/compilation/ati_bin/lib/xorg/modules/drivers/modesetting_drv.so /usr/lib/xorg/modules/drivers/amd64
root@openindiana:~# vi /etc/X11/xorg.conf
Section "Device"
### Available Driver options are:-
### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
### [arg]: arg optional
#Option "ShadowFB" # [<bool>]
#Option "DefaultRefresh" # [<bool>]
#Option "ModeSetClearScreen" # [<bool>]
Identifier "Card0"
Driver "modesetting"
VendorName "Advanced Micro Devices, Inc. [AMD/ATI]"
BoardName "Wrestler [Radeon HD 6310]"
BusID "PCI:0:1:0"
EndSection
Трассировка modesetting_drv.so
CPU FUNCTION
0 -> Setup
0 <- Setup
0 -> Identify
0 <- Identify
0 -> ms_driver_func
0 <- ms_driver_func
0 -> ms_driver_func
0 <- ms_driver_func
0 -> ms_pci_probe
0 -> probe_hw_pci
0 -> open_hw
0 <- open_hw
0 <- probe_hw_pci
0 <- ms_pci_probe
0 -> Probe
0 <- Probe
open_hw нормально открывает /dev/dri/card0 (сейчас подгружен измененный модуль radeon, в список поддерживаемых устройств которого добавлена моя видеокарта)
display, instance #0 (driver name: radeon)
....
Device Minor Nodes:
dev=(290,0)
dev_path=/pci@0,0/display@1:gfx0
spectype=chr type=minor
dev_link=/dev/fbs/gfx0
dev_link=/dev/fb2
dev_link=/dev/vt00
dev_link=/dev/fb
Minor properties:
name='ddi-kernel-ioctl' type=boolean dev=(290,0)
dev=(290,2)
dev_path=/pci@0,0/display@1:drm0
spectype=chr type=minor
dev_link=/dev/dri/card0
Падает тут:
if (drmSetInterfaceVersion(fd, &sv)) {
close(fd);
return FALSE;
}
Скриптом
$ cat radeon.d
#!/usr/sbin/dtrace -s
#pragma D option flowindent
fbt:drm::entry,
fbt:drm::return,
fbt:radeon::entry,
fbt:radeon::return
{
}
выявлено, что падает потому что drmSetInterfaceVersion запрашивает версию 1.4, а ядро отвечает отказом, потому что поддерживает только 1.2 (функция в ядре drm_setversion)
Версия 1.4 доступна в исходниках FreeBSD http://src.illumos.org/source/xref/freebsd-head/sys/dev/drm2/drm_core.h#34
Попробуем запросить версию 1.2 и определить, чего не хватает.
keremet@openindiana:~/compilation/xf86-video-modesetting-0.9.0$ vi src/driver.c
static Bool probe_hw_pci(const char *dev, struct pci_device *pdev)
{
int ret = FALSE, fd = open_hw(dev);
char *id, *devid;
drmSetVersion sv;
if (fd == -1)
return FALSE;
sv.drm_di_major = 1;
- sv.drm_di_minor = 4;
+ sv.drm_di_minor = 2;
CPU FUNCTION
1 -> Setup
1 <- Setup
1 -> Identify
1 <- Identify
1 -> ms_driver_func
1 <- ms_driver_func
1 -> ms_driver_func
1 <- ms_driver_func
1 -> ms_pci_probe
1 -> probe_hw_pci
1 -> open_hw
1 <- open_hw
1 -> ms_DRICreatePCIBusID
1 <- ms_DRICreatePCIBusID
1 -> check_outputs
1 <- check_outputs
0 <- probe_hw_pci
0 <- ms_pci_probe
0 -> Probe
0 <- Probe
Оказалось, что в модуле drm не реализован DRM_IOCTL_MODE_GETRESOURCES и выполнение останавливается на check_outputs. Во FreeBSD DRM_IOCTL_MODE_GETRESOURCES реализован. Надо перенести.