SysCons VESA driver for XF86_SVGA 3.3.6

Antony T Curtis antony at abacus.co.uk
Wed May 23 18:13:16 BST 2001


This is a multi-part message in MIME format.
--------------9F2FEA2DD8D22337F6C15E80
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit


Here is my VESA framebuffer driver (as discussed at meet couple weeks
back)

-------- Original Message --------
Date: Tue, 01 Aug 2000 04:14:35 +0100
From: Antony T Curis <antony at abacus.co.uk>
X-Mailer: Mozilla 4.73 [en] (X11; I; FreeBSD 4.1-STABLE i386)
X-Accept-Language: en
MIME-Version: 1.0
To: fixes at XFree86.Org
Subject: (fixes seq: A.110) SysCons VESA driver for XF86_SVGA 3.3.6
Content-Type:
multipart/mixed;boundary="------------122047D34601157560143010"
Reply-To: patchers at XFree86.Org
Errors-To: owner-fixes at XFree86.Org
Sender: owner-fixes at XFree86.Org
X-Mailing-List: fixes at XFree86.Org
Resent-From: dawes at XFree86.Org
Resent-Date: Wed, 23 May 2001 11:38:58 -0400
Resent-To: Antony T Curis <antony at abacus.co.uk>


I wrote this driver because the video chipset on my notebook is
currently not supported. (S3 Savage/MV-IX)

It is written for FreeBSD's SysCons interface and makes use of the VESA
loadable kernel module - hence there is no direct HW I/O in this driver.

It will be of much use to anyone as it should work on all modern PCI/AGP
adapters which have a VESA 1.2+ BIOS.

I have compiled it

Regards,

Antony T Curtis,
--------------9F2FEA2DD8D22337F6C15E80
Content-Type: text/plain; charset=iso-8859-1;
 name="fbcons_driver.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="fbcons_driver.c"

LyogJCBFeHAgJCAqLwovKgogKiBGcmVlQlNEIFN5c0NvbnMgVkVTQSBkcml2ZXIgZGV2ZWxv
cGVkIGZyb20gc3R1YiBkcml2ZXIuCiAqCiAqIEFudG9ueSBUIEN1cnRpcyA8YW50b255LmN1
cnRpc0BvbGNzLm5ldD4KICovCgojaW5jbHVkZSAiWC5oIgojaW5jbHVkZSAiaW5wdXQuaCIK
I2luY2x1ZGUgInNjcmVlbmludC5oIgoKI2luY2x1ZGUgImNvbXBpbGVyLmgiCiNpbmNsdWRl
ICJ4Zjg2LmgiCiNpbmNsdWRlICJ4Zjg2UHJpdi5oIgojaW5jbHVkZSAieGY4Nl9PU2xpYi5o
IgojaW5jbHVkZSAieGY4Nl9IV2xpYi5oIgojaW5jbHVkZSAidmdhLmgiCgojaW5jbHVkZSA8
c3lzL2ZiaW8uaD4KI2luY2x1ZGUgPHN5cy9jb25zaW8uaD4KCiNpZmRlZiBYRnJlZVhER0Eg
CiNpbmNsdWRlICJYLmgiCiNpbmNsdWRlICJYcHJvdG8uaCIKI2luY2x1ZGUgInNjcm5pbnRz
dHIuaCIKI2luY2x1ZGUgInNlcnZlcm1kLmgiCiNkZWZpbmUgX1hGODZER0FfU0VSVkVSXwoj
aW5jbHVkZSAiZXh0ZW5zaW9ucy94Zjg2ZGdhc3RyLmgiCiNlbmRpZgoKI2luY2x1ZGUgInhm
ODZfQ29uZmlnLmgiCgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBzaG9ydCBXaWR0aDsK
CXVuc2lnbmVkIHNob3J0IEhlaWdodDsKCXVuc2lnbmVkIHNob3J0IFZlc2FNb2RlOwp9IEZC
TU9ERVRBQkxFLCAqUEZCTU9ERVRBQkxFOwoKdHlwZWRlZiBzdHJ1Y3QgewoJdmdhSFdSZWMg
c3RkOyAgICAgICAgICAgICAgIC8qIGdvb2Qgb2xkIElCTSBWR0EgKi8KCXVuc2lnbmVkIGlu
dCBtb2RlOwkgICAgLyogVkVTQSBtb2RlICovCn0gdmdhRkJDb25zUmVjLCAqdmdhRkJDb25z
UHRyOwoKI2RlZmluZSBuZXcgKCh2Z2FGQkNvbnNQdHIpdmdhTmV3VmlkZW9TdGF0ZSkKCnN0
YXRpYyBCb29sICAgICBGQkNvbnNQcm9iZSgpOwpzdGF0aWMgY2hhciAqICAgRkJDb25zSWRl
bnQoKTsKc3RhdGljIHZvaWQgICAgIEZCQ29uc0VudGVyTGVhdmUoKTsKc3RhdGljIEJvb2wg
ICAgIEZCQ29uc0luaXQoKTsKc3RhdGljIGludCAgICAgIEZCQ29uc1ZhbGlkTW9kZSgpOwpz
dGF0aWMgdm9pZCAqICAgRkJDb25zU2F2ZSgpOwpzdGF0aWMgdm9pZCAgICAgRkJDb25zUmVz
dG9yZSgpOwpzdGF0aWMgdm9pZCAgICAgRkJDb25zQWRqdXN0KCk7CgpzdGF0aWMgaW50CUZC
Q29uc0dldE1vZGVDb3VudCgpOwpzdGF0aWMgdm9pZAlGQkNvbnNHZXRNb2RlVGFibGUoKTsK
c3RhdGljIGludAlGQkNvbnNHZXRMaW5lYXJCYXNlKCk7Cgp2Z2FWaWRlb0NoaXBSZWMgRkJD
T05TID0gewoJLyogCgkgKiBGdW5jdGlvbiBwb2ludGVycwoJICovCglGQkNvbnNQcm9iZSwK
CUZCQ29uc0lkZW50LAoJRkJDb25zRW50ZXJMZWF2ZSwKCUZCQ29uc0luaXQsCglGQkNvbnNW
YWxpZE1vZGUsCglGQkNvbnNTYXZlLAoJRkJDb25zUmVzdG9yZSwKCUZCQ29uc0FkanVzdCwK
CXZnYUhXU2F2ZVNjcmVlbiwKCSh2b2lkICgqKSgpKU5vb3BEREEsCS8qIENoaXBHZXRNb2Rl
ICovCgkodm9pZCAoKikoKSlOb29wRERBLAkvKiBGQkNvbnNGYkluaXQsICovCgkodm9pZCAo
KikoKSlOb29wRERBLAkvKiBObyBiYW5raW5nLiAqLwoJKHZvaWQgKCopKCkpTm9vcEREQSwK
CSh2b2lkICgqKSgpKU5vb3BEREEsCgkweDEwMDAwLAkvKiBpbnQgQ2hpcE1hcFNpemUgKi8K
CTB4MTAwMDAsCS8qIGludCBDaGlwU2VnbWVudFNpemUgKi8KCTE2LAkJLyogaW50IENoaXBT
ZWdtZW50U2hpZnQgKi8KCTB4RkZGRiwJCS8qIGludCBDaGlwU2VnbWVudE1hc2sgKi8KCTB4
MDAwMDAsIDB4MTAwMDAsCS8qIGludCBDaGlwUmVhZEJvdHRvbSwgQ2hpcFJlYWRUb3AgKi8K
CTB4MDAwMDAsIDB4MTAwMDAsCS8qIGludCBDaGlwV3JpdGVCb3R0b20sIENoaXBXcml0ZVRv
cCAqLwoJRkFMU0UsCQkJLyogQm9vbCBDaGlwVXNlMkJhbmtzICovCglWR0FfTk9fRElWSURF
X1ZFUlQsCS8qIGludCBDaGlwSW50ZXJsYWNlVHlwZSAqLwoJezAsfSwJCQkvKiBPRmxhZ1Nl
dCBDaGlwT3B0aW9uRmxhZ3MgKi8KCTgsCQkJLyogaW50IENoaXBSb3VuZGluZyAqLwoJVFJV
RSwJCQkvKiBCb29sIENoaXBVc2VMaW5lYXJBZGRyZXNzaW5nICovCgkwLAkJCS8qIGludCBD
aGlwTGluZWFyQmFzZSAqLwoJMCwJCQkvKiBpbnQgQ2hpcExpbmVhclNpemUgKi8KCVRSVUUs
CQkJLyogQm9vbCBIYXZlMTZicHAgKi8KCVRSVUUsCQkJLyogQm9vbCBIYXZlMjRicHAgKi8K
CVRSVUUsCQkJLyogQm9vbCBIYXZlMzJicHAgKi8KCU5VTEwsCQkJLyogRGlzcGxheU1vZGVQ
dHIgQ2hpcEJ1aWx0aW5Nb2RlcyAqLwoJMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyog
Q2hpcENsb2NrTXVsRmFjdG9yICovCgkxICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBD
aGlwQ2xvY2tEaXZGYWN0b3IgKi8KfTsKCnN0YXRpYyBzdHJ1Y3QgdmlkZW9fYWRhcHRlcl9p
bmZvIGFkYXB0ZXJfaW5mbzsKc3RhdGljIHN0cnVjdCB2aWRlb19pbmZvIG1vZGVfaW5mbzsK
CmV4dGVybiB2Z2FIV0N1cnNvclJlYyB2Z2FIV0N1cnNvcjsKCnN0YXRpYyBQRkJNT0RFVEFC
TEUgZmJNb2RlVGFibGU7CnN0YXRpYyBpbnQgZmJNb2RlQ291bnQ7CnN0YXRpYyBpbnQgZmJJ
bml0aWFsVlQgPSAxOwoKc3RhdGljIGNoYXIgKgpGQkNvbnNJZGVudChuKQppbnQgbjsKewoJ
c3RhdGljIGNoYXIgKmNoaXBzZXQgPSAiZmJjb25zIjsKCWlmIChuID09IDApIHJldHVybihj
aGlwc2V0KTsKCXJldHVybihOVUxMKTsKfQoKc3RhdGljIEJvb2wKRkJDb25zUHJvYmUoKQp7
CgkvKgoJICogRmlyc3Qgd2UgYXR0ZW1wdCB0byBmaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUg
c3VwcG9ydGVkIGNoaXBzZXRzCgkgKiBpcyBwcmVzZW50LgoJICovCglpZiAodmdhMjU2SW5m
b1JlYy5jaGlwc2V0KQoJewoJCWlmIChTdHJDYXNlQ21wKHZnYTI1NkluZm9SZWMuY2hpcHNl
dCwgRkJDb25zSWRlbnQoMCkpKQoJCQlyZXR1cm4gKEZBTFNFKTsKICAgIAl9CgkKCUVycm9y
RigiJXMgJXM6IEZyZWVCU0QgU3lzQ29ucyBWRVNBIFZpZGVvIERyaXZlciAlc1xuIiwKCQlY
Q09ORklHX0dJVkVOLCB2Z2EyNTZJbmZvUmVjLm5hbWUsICIwLjEuMCIpOwoJRXJyb3JGKCIl
cyAlczogQW50b255IFQgQ3VydGlzIDxhbnRvbnkuY3VydGlzQG9sY3MubmV0PlxuIiwKCQlY
Q09ORklHX0dJVkVOLCB2Z2EyNTZJbmZvUmVjLm5hbWUpOwoKCWlmIChpb2N0bCh4Zjg2SW5m
by5jb25zb2xlRmQsIENPTlNfQURQSU5GTywgJmFkYXB0ZXJfaW5mbykpCgl7CgkJcGVycm9y
KCJpb2N0bChDT05TX0FEUElORk8pIik7CgkJRXJyb3JGKCIlcyAlczogU3lzQ29ucyBjb25z
b2xlIHJlcXVpcmVkXG4iLAoJCQlYQ09ORklHX1BST0JFRCwgdmdhMjU2SW5mb1JlYy5uYW1l
KTsKCQlyZXR1cm4oRkFMU0UpOwoJfQoKCS8qaW9jdGwoeGY4NkluZm8uY29uc29sZUZkLCBW
VF9HRVRBQ1RJVkUsICZmYkluaXRpYWxWVCk7Ki8KCglpZiAoRkJDb25zR2V0TGluZWFyQmFz
ZSgpKQoJewoJCUVycm9yRigiJXMgJXM6IG5vIGxpbmVhciBhZGRyZXNzIGF2YWlsYWJsZVxu
IiwKCQkJWENPTkZJR19QUk9CRUQsIHZnYTI1NkluZm9SZWMubmFtZSk7CgkJcmV0dXJuKEZB
TFNFKTsKCX0KCgl2Z2EyNTZJbmZvUmVjLm5hbWUgPSAiVkVTQSI7Cgl2Z2EyNTZJbmZvUmVj
LmNoaXBzZXQgPSBGQkNvbnNJZGVudCgwKTsKCglpZiAoZmJNb2RlVGFibGUpCgkJeGZyZWUo
ZmJNb2RlVGFibGUpOwoKCWZiTW9kZUNvdW50ID0gRkJDb25zR2V0TW9kZUNvdW50KCB2Z2FC
aXRzUGVyUGl4ZWwgKTsKCWlmICggIWZiTW9kZUNvdW50ICkKCXsKCQlFcnJvckYoIiVzICVz
OiBGYWlsZWQgdG8gZmV0Y2ggYW55IG1vZGVzLlxuIiwKCQkJWENPTkZJR19QUk9CRUQsIHZn
YTI1NkluZm9SZWMubmFtZQoJCSk7CgkJcmV0dXJuKEZBTFNFKTsKCX0KCglmYk1vZGVUYWJs
ZSA9IChQRkJNT0RFVEFCTEUpeGNhbGxvYyhzaXplb2YoRkJNT0RFVEFCTEUpLCBmYk1vZGVD
b3VudCk7CglGQkNvbnNHZXRNb2RlVGFibGUoIHZnYUJpdHNQZXJQaXhlbCwgZmJNb2RlVGFi
bGUgKTsKCgl2Z2EyNTZJbmZvUmVjLm1heENsb2NrID0gLyoyNTIwMCovMTEwMDAwOwogIAl2
Z2EyNTZJbmZvUmVjLmJhbmtlZE1vbm8gPSBGQUxTRTsKI2lmbmRlZiBNT05PVkdBCiNpZmRl
ZiBYRnJlZVhER0EgCgl2Z2EyNTZJbmZvUmVjLmRpcmVjdE1vZGUgPSBYRjg2REdBRGlyZWN0
UHJlc2VudDsKI2VuZGlmCiNlbmRpZgoJT0ZMR19TRVQoT1BUSU9OX05PQUNDRUwsICZGQkNP
TlMuQ2hpcE9wdGlvbkZsYWdzKTsKCU9GTEdfU0VUKE9QVElPTl9TV19DVVJTT1IsICZGQkNP
TlMuQ2hpcE9wdGlvbkZsYWdzKTsKCS8qT0ZMR19TRVQoT1BUSU9OX0hXX0NVUlNPUiwgJkZC
Q09OUy5DaGlwT3B0aW9uRmxhZ3MpOyovCgoJRkJDT05TLkNoaXBMaW5lYXJCYXNlID0gdmdh
MjU2SW5mb1JlYy5NZW1CYXNlOwoJRkJDT05TLkNoaXBMaW5lYXJTaXplID0gdmdhMjU2SW5m
b1JlYy52aWRlb1JhbSAqIDEwMjQ7CgoJRXJyb3JGKCIlcyAlczogbnVtYmVyIG9mIG1vZGVz
IGF2YWlsYWJsZSBhdCAlZGJwcDogJWRcbiIsCgkJWENPTkZJR19QUk9CRUQsdmdhMjU2SW5m
b1JlYy5uYW1lLAoJCXZnYUJpdHNQZXJQaXhlbCwgZmJNb2RlQ291bnQpOwoJRXJyb3JGKCIl
cyAlczogbGluZWFyIGFkZHJlc3M6IDB4JTA4eCAtIDB4JTA4eFxuIiwKCQlYQ09ORklHX1BS
T0JFRCwgdmdhMjU2SW5mb1JlYy5uYW1lLAoJCXZnYTI1NkluZm9SZWMuTWVtQmFzZSwKCQl2
Z2EyNTZJbmZvUmVjLk1lbUJhc2UrRkJDT05TLkNoaXBMaW5lYXJTaXplLTEpOwoKCWlmICgh
dmdhMjU2SW5mb1JlYy5jbG9ja3MpCiAgICAgICAgewoJCUVycm9yRigiJXMgJXM6IHVzaW5n
IGZha2UgY2xvY2tzXG4iLCAKCQkJWENPTkZJR19HSVZFTiwgdmdhMjU2SW5mb1JlYy5uYW1l
KTsKICAgICAgICAgICAgICAgIHZnYTI1NkluZm9SZWMuY2xvY2tzID0gNTsKICAgICAgICAg
ICAgICAgIHZnYTI1NkluZm9SZWMuY2xvY2tbMF0gPSAyNTE4MDsKCQl2Z2EyNTZJbmZvUmVj
LmNsb2NrWzFdID0gNDAwMDA7CgkJdmdhMjU2SW5mb1JlYy5jbG9ja1syXSA9IDY1MDAwOwoJ
CXZnYTI1NkluZm9SZWMuY2xvY2tbM10gPSA3NTAwMDsKCQl2Z2EyNTZJbmZvUmVjLmNsb2Nr
WzRdID0gODUwMDA7CiAgICAgICAgfQoKICAJcmV0dXJuIChUUlVFKTsKfQoKc3RhdGljIGlu
dApGQkNvbnNHZXRMaW5lYXJCYXNlKCkKewoJc3RydWN0IHZpZGVvX2luZm8gaW5mbzsKCWlu
dCBtb2RlLCBtb2RlY291bnQgPSAwOwoJCglmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTV9WRVNB
X01PREVfTUFYOyArK21vZGUpCgl7CgkJaW5mby52aV9tb2RlID0gbW9kZTsKCQlpZiAoaW9j
dGwoeGY4NkluZm8uY29uc29sZUZkLCBDT05TX01PREVJTkZPLCAmaW5mbykpCgkJCWNvbnRp
bnVlOwoJCWlmIChpbmZvLnZpX21vZGUgPT0gbW9kZSAmJgoJCSAgICAoaW5mby52aV9mbGFn
cyAmIFZfSU5GT19HUkFQSElDUykgJiYKCQkgICAgKGluZm8udmlfZmxhZ3MgJiBWX0lORk9f
TElORUFSKSAmJgoJCSAgICBpbmZvLnZpX3BsYW5lcyA9PSAxKQoJCXsKCQkJdmdhMjU2SW5m
b1JlYy5NZW1CYXNlID0gaW5mby52aV9idWZmZXI7CgkJCXZnYTI1NkluZm9SZWMudmlkZW9S
YW0gPSBpbmZvLnZpX2J1ZmZlcl9zaXplIC8gMTAyNDsKCQkJcmV0dXJuKDApOwoJCX0KCX0K
CXJldHVybigtMSk7Cn0KCnN0YXRpYyBpbnQKRkJDb25zR2V0TW9kZUNvdW50KGJpdHNQZXJQ
aXhlbCkKaW50IGJpdHNQZXJQaXhlbDsKewoJc3RydWN0IHZpZGVvX2luZm8gaW5mbzsKCWlu
dCBtb2RlLCBtb2RlY291bnQgPSAwOwoKCWZvciAobW9kZSA9IDA7IG1vZGUgPCBNX1ZFU0Ff
TU9ERV9NQVg7ICsrbW9kZSkKCXsKCQlpbmZvLnZpX21vZGUgPSBtb2RlOwoJCWlmIChpb2N0
bCh4Zjg2SW5mby5jb25zb2xlRmQsIENPTlNfTU9ERUlORk8sICZpbmZvKSkKCQkJY29udGlu
dWU7CgkJaWYgKGluZm8udmlfbW9kZSAhPSBtb2RlIHx8CgkJICAgICEoaW5mby52aV9mbGFn
cyAmIFZfSU5GT19HUkFQSElDUykgfHwKCQkgICAgIShpbmZvLnZpX2ZsYWdzICYgVl9JTkZP
X0xJTkVBUikgfHwKCQkgICAgaW5mby52aV9wbGFuZXMgIT0gMSB8fAoJCSAgICBpbmZvLnZp
X2RlcHRoICE9IGJpdHNQZXJQaXhlbCApCgkJCWNvbnRpbnVlOwoJCQoJCSsrbW9kZWNvdW50
OwoJfQoKCXJldHVybihtb2RlY291bnQpOwkKfQoKc3RhdGljIHZvaWQgCkZCQ29uc0dldE1v
ZGVUYWJsZShiaXRzUGVyUGl4ZWwsbW9kZVRhYmxlKQppbnQgYml0c1BlclBpeGVsOwpQRkJN
T0RFVEFCTEUgbW9kZVRhYmxlOwp7CglzdHJ1Y3QgdmlkZW9faW5mbyBpbmZvOwoJaW50IG1v
ZGUsIGkgPSAwOwoJZm9yIChtb2RlID0gMDsgbW9kZSA8IE1fVkVTQV9NT0RFX01BWDsgKytt
b2RlKQoJewoJCWluZm8udmlfbW9kZSA9IG1vZGU7CgkJaWYgKGlvY3RsKHhmODZJbmZvLmNv
bnNvbGVGZCwgQ09OU19NT0RFSU5GTywgJmluZm8pKQoJCQljb250aW51ZTsKCQlpZiAoaW5m
by52aV9tb2RlICE9IG1vZGUgfHwKCQkgICAgIShpbmZvLnZpX2ZsYWdzICYgVl9JTkZPX0dS
QVBISUNTKSB8fAoJCSAgICAhKGluZm8udmlfZmxhZ3MgJiBWX0lORk9fTElORUFSKSB8fAoJ
CSAgICBpbmZvLnZpX3BsYW5lcyAhPSAxIHx8CgkJICAgIGluZm8udmlfZGVwdGggIT0gYml0
c1BlclBpeGVsKQoJCQljb250aW51ZTsKCgkJbW9kZVRhYmxlW2ldLldpZHRoID0gaW5mby52
aV93aWR0aDsKCQltb2RlVGFibGVbaV0uSGVpZ2h0ID0gaW5mby52aV9oZWlnaHQ7CgkJbW9k
ZVRhYmxlW2ldLlZlc2FNb2RlID0gaW5mby52aV9tb2RlOwoKCQkrK2k7Cgl9Cn0KCnN0YXRp
YyB2b2lkIApGQkNvbnNFbnRlckxlYXZlKGVudGVyKQpCb29sIGVudGVyOwp7CglyZXR1cm47
Cn0KCgpzdGF0aWMgdm9pZCAKRkJDb25zUmVzdG9yZShyZXN0b3JlKQp2Z2FGQkNvbnNQdHIg
cmVzdG9yZTsKewoJdmdhUHJvdGVjdChUUlVFKTsKCglpZiAocmVzdG9yZS0+bW9kZSA8IE1f
VkVTQV9CQVNFKQoJewoJCXZnYUhXUmVzdG9yZSgodmdhSFdQdHIpIHJlc3RvcmUpOwoKCQlp
b2N0bCh4Zjg2SW5mby5jb25zb2xlRmQsX0lPKCdTJywgcmVzdG9yZS0+bW9kZSksIE5VTEwp
OwoJCWlmIChyZXN0b3JlLT5tb2RlKQoJCQlyZXR1cm47CgoJCWlvY3RsKHhmODZJbmZvLmNv
bnNvbGVGZCxfSU8oJ1MnLCBhZGFwdGVyX2luZm8udmFfbW9kZSksIE5VTEwpOwoJCWlmIChp
b2N0bCh4Zjg2SW5mby5jb25zb2xlRmQsIFZUX0FDVElWQVRFLCBmYkluaXRpYWxWVCkhPTAp
CgkJCUVycm9yRigiaW9jdGwoVlRfQUNUSVZBVEUpIGZhaWxlZCIpOwoJCS8qaWYgKGlvY3Rs
KHhmODZJbmZvLmNvbnNvbGVGZCwgVlRfV0FJVEFDVElWRSwgZmJJbml0aWFsVlQpIT0wKQoJ
CQlFcnJvckYoImlvY3RsKFZUX1dBSVRBQ1RJVkUpIGZhaWxlZCIpOyovCgkKCQlyZXR1cm47
Cgl9CgoJaW9jdGwoeGY4NkluZm8uY29uc29sZUZkLF9JTygnVicsIHJlc3RvcmUtPm1vZGUt
TV9WRVNBX0JBU0UpLCBOVUxMKTsKCglpb2N0bCh4Zjg2SW5mby5jb25zb2xlRmQsRkJJT19T
RVRMSU5FV0lEVEgsdmdhMjU2SW5mb1JlYy5kaXNwbGF5V2lkdGgpOwoKCWlmICh2Z2FCaXRz
UGVyUGl4ZWwgPT0gOCkKCXsKCQl1X2NoYXIgZmJfcmVkWzI1Nl0sIGZiX2dyZWVuWzI1Nl0s
IGZiX2JsdWVbMjU2XTsKCQl1X2NoYXIgKnIgPSBmYl9yZWQsKmcgPSBmYl9ncmVlbiwqYiA9
IGZiX2JsdWU7CgkJc3RydWN0IHZpZGVvX2NvbG9yX3BhbGV0dGUgcGFsZXR0ZSA9CgkJCXsg
MCwgMjU2LCBmYl9yZWQsIGZiX2dyZWVuLCBmYl9ibHVlLCBOVUxMIH07CgkJdV9jaGFyICpz
cmMgPSByZXN0b3JlLT5zdGQuREFDOwoJCWludCBpOwoKCQkvKiBSZXN0b3JlIHRoZSBEQUMs
IHNpbmNlIHdlJ3JlIG5vdCB1c2luZyB2Z2FIV1Jlc3RvcmUoKSAqLwoKCQlmb3IgKGk9MDsg
aTwyNTY7IGkrKykKCQl7CgkJCSoocisrKSA9ICooc3JjKyspOwoJCQkqKGcrKykgPSAqKHNy
YysrKTsKCQkJKihiKyspID0gKihzcmMrKyk7CgkJfQoKCQlpb2N0bCh4Zjg2SW5mby5jb25z
b2xlRmQsIEZCSU9fU0VUUEFMRVRURSwgJnBhbGV0dGUpOwoJfQoKCXZnYVByb3RlY3QoRkFM
U0UpOwp9CgoKc3RhdGljIHZvaWQgKgpGQkNvbnNTYXZlKHNhdmUpCnZnYUZCQ29uc1B0ciBz
YXZlOwp7CglzYXZlID0gKHZnYUZCQ29uc1B0cil2Z2FIV1NhdmUoKHZnYUhXUHRyKXNhdmUs
IHNpemVvZih2Z2FGQkNvbnNSZWMpKTsKCiAgCXJldHVybiAoKHZvaWQgKikgc2F2ZSk7Cn0K
CgpzdGF0aWMgQm9vbApGQkNvbnNJbml0KG1vZGUpCkRpc3BsYXlNb2RlUHRyIG1vZGU7CnsK
CWludCBpOwoKCWlmICghdmdhSFdJbml0KG1vZGUsc2l6ZW9mKHZnYUZCQ29uc1JlYykpKQoJ
CXJldHVybihGQUxTRSk7CgoJbmV3LT5tb2RlID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgZmJN
b2RlQ291bnQ7ICsraSkKCXsKCQlpZiAoKGZiTW9kZVRhYmxlW2ldLldpZHRoID09IG1vZGUt
PkhEaXNwbGF5KSAmJgoJCSAgICAoZmJNb2RlVGFibGVbaV0uSGVpZ2h0ID09IG1vZGUtPlZE
aXNwbGF5KSkKCQl7CgkJCW5ldy0+bW9kZSA9IGZiTW9kZVRhYmxlW2ldLlZlc2FNb2RlOwoJ
CQlyZXR1cm4oVFJVRSk7CgkJfQoJfQoKCXJldHVybihGQUxTRSk7Cn0KCgpzdGF0aWMgdm9p
ZCAKRkJDb25zQWRqdXN0KHgsIHkpCmludCB4LCB5Owp7CglzdHJ1Y3QgdmlkZW9fZGlzcGxh
eV9zdGFydCBzY3JlZW5fc3RhcnQ7CgkKCXNjcmVlbl9zdGFydC54ID0geDsKCXNjcmVlbl9z
dGFydC55ID0geTsKCQoJaW9jdGwoeGY4NkluZm8uY29uc29sZUZkLCBDT05TX1NFVFdJTk9S
RywgJnNjcmVlbl9zdGFydCk7CgojaWZkZWYgWEZyZWVYREdBCglpZiAodmdhMjU2SW5mb1Jl
Yy5kaXJlY3RNb2RlICYgWEY4NkRHQURpcmVjdEdyYXBoaWNzKSB7CgkJLyogV2FpdCB1bnRp
bCB2ZXJ0aWNhbCByZXRyYWNlIGlzIGluIHByb2dyZXNzLiAqLwoJCXdoaWxlIChpbmIodmdh
SU9CYXNlICsgMHhBKSAmIDB4MDgpOwoJCXdoaWxlICghKGluYih2Z2FJT0Jhc2UgKyAweEEp
ICYgMHgwOCkpOwoJfQojZW5kaWYKfQoKLyoKICogR2VuZXJpY1ZhbGlkTW9kZSAtLQogKgog
Ki8Kc3RhdGljIGludApGQkNvbnNWYWxpZE1vZGUobW9kZSwgdmVyYm9zZSxmbGFnKQpEaXNw
bGF5TW9kZVB0ciBtb2RlOwpCb29sIHZlcmJvc2U7CmludCBmbGFnOwp7CglyZXR1cm4gTU9E
RV9PSzsKfQoKCg==
--------------9F2FEA2DD8D22337F6C15E80--





More information about the Ukfreebsd mailing list