Требуется установить разрешение экрана 1366x768 вместо устанавливаемого по умолчанию 1024x768
Похоже, что любая видеокарта позволяет выставить любое разрешение
http://frolov-lib.ru/books/bsp/v21/ch4_8.htmhttp://pcabc.ru/to/to23.htmlhttps://ru.wikipedia.org/wiki/WXGAhttp://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/io/vgasubr.chttp://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/