Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Solved] Non root Xorg on AMD video cards
View unanswered posts
View posts from last 24 hours

Goto page Previous  1, 2  
Reply to topic    Gentoo Forums Forum Index Desktop Environments
View previous topic :: View next topic  
Author Message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Thu Apr 25, 2019 4:18 pm    Post subject: Reply with quote

asturm wrote:
kajzer wrote:
I found a way, might not be ideal but it seems it's the only way.

Congratulations, you've went ahead with what will soon be the default in Gentoo as well (elogind instead of consolekit on desktop profile).


Glad to hear that, it should be default, works great, simple, efficient, lower on resources than consolekit...
Had some reservations because it's taken from systemd but I'll take it 8)
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Thu Apr 25, 2019 4:54 pm    Post subject: Reply with quote

Glad you got it to work. :D

Yes, elogind will work as a substitute for the logind component of systemd (effectively the same thing) and it's how void linux (which you mentioned earlier) runs non-suid X.

Maybe your hint will be added to the gentoo non-root X page as another method.
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
argen
n00b
n00b


Joined: 26 Apr 2019
Posts: 25

PostPosted: Fri Apr 26, 2019 5:28 am    Post subject: Reply with quote

This is possible without elogind. The problem with the amdgpu Xorg driver is that it requires the DRM_SET_MASTER ioctl which can only be called by root. The Intel Xorg driver uses a different drm ioctl which can be called by non root users. To allow this you either have to patch the kernel to allow all users to call the DRM_SET_MASTER ioctl which allows anyone in the video group to write to the display, or you have to write a daemon that takes the /dev/dri/card0 file descriptor from the amdgpu Xorg driver and calls DRM_SET_MASTER on the file descriptor.

If anyone is interested I have written a daemon along with a libdrm patch that passes the file descriptor to the daemon instead of calling drmSetMaster directly, but it's a bit messy.
Back to top
View user's profile Send private message
etnull
Apprentice
Apprentice


Joined: 26 Mar 2019
Posts: 175

PostPosted: Fri Apr 26, 2019 11:39 am    Post subject: Reply with quote

kajzer wrote:
I found a way, might not be ideal but it seems it's the only way.

All it takes is in make.conf
Code:
"elogind -consolekit"


None of that input group stuff and anything from Non root Xorg gentoo wiki isn't needed.
There's also no need for 'startx -- vt1', plain 'startx' works.

Should I switch to this if I run nouveau? Which one is more 'secure'?
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 12:46 pm    Post subject: Reply with quote

Ran across this while looking for stuff about drm_master

https://ch1p.io/blog/1/ Non-root Xorg and modesetting driver on Gentoo (or any non-systemd system)

Note: links at bottom of page (for patches) don't work, and I haven't emailed the blog writer yet about it, but it's clear enough in the preceding text to figure it out.
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 1:16 pm    Post subject: Reply with quote

That's very interesting, wished I knew that before yesterday, would try for sure.
Still tempted but I see nothing wrong with elogind, especially if Gentoo is replacing default consolekit with it.
Consolekit2 isn't maintained for couple of years it seems.
While that doesn't mean much it seems that elogind is the future.
And the future is now :)
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 1:29 pm    Post subject: Reply with quote

Nothing wrong with elogind or systemd-logind if you are running it or consolekit or need it for a particular DE/LM and if you're already running dbus.

I don't run *kit/dbus/*logind/session mgmt/cgroups so adding elogind w/dbus just to do non-root Xorg isn't for me.
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 1:47 pm    Post subject: Reply with quote

Understandable.
I guess you don't use some notification daemon, I need dbus because I do use/need one.

Did you try the patch? If not do you have a desire to do it ?
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 1:54 pm    Post subject: Reply with quote

I do indeed intend to try the patch, it'll probably be a little while before I get around to it.

When I do ... and if it works as suggested ... then I'll make mention in this thread and maybe start one in Documentation, Tips & Tricks about it or maybe have the gentoo wiki page for non-root X be modified to mention it.

I didn't mention it before, because the date on the blog says it's pretty recent, I knew about drm set master but didn't realize that it would be so easy to fix.
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 2:40 pm    Post subject: Reply with quote

I made a quick patch for xorg-server-1.20.4
emerge produced errors, will have to look at that later, but here's the patch :
http://dpaste.com/13PJK4Q

error:
Code:
driver.c: In function ‘send_fd’:
driver.c:1523:19: error: storage size of ‘msg’ isn’t known
     struct msghdr msg;



maybe the xorg part on blog site isn't complete, don't know at this point.
his helper program is on github and that works fine.
Back to top
View user's profile Send private message
argen
n00b
n00b


Joined: 26 Apr 2019
Posts: 25

PostPosted: Fri Apr 26, 2019 2:57 pm    Post subject: Reply with quote

kajzer wrote:
I made a quick patch for xorg-server-1.20.4
emerge produced errors, will have to look at that later, but here's the patch :
http://dpaste.com/13PJK4Q

error:
Code:
driver.c: In function ‘send_fd’:
driver.c:1523:19: error: storage size of ‘msg’ isn’t known
     struct msghdr msg;



maybe the xorg part on blog site isn't complete, don't know at this point.
his helper program is on github and that works fine.


The patch seems to be missing the <sys/socket.h> include for the struct msghdr definition.
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 3:49 pm    Post subject: Reply with quote

Just checked my email and he responded, he had forgotten to add the "f" domain, I just downloaded the 1.20.3 patch.

and yes, it includes <sys/socket.h> in the patch.

Just started the compile, will know in a few minutes.
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 3:57 pm    Post subject: Reply with quote

argen wrote:

The patch seems to be missing the <sys/socket.h> include for the struct msghdr definition.


That solved the first error, next one is :
Code:
driver.c: In function ‘SetMaster’:
driver.c:1578:24: error: storage size of ‘addr’ isn’t known
     struct sockaddr_un addr;


I guess #include <netdb.h> is missing, maybe with something more ?
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 4:03 pm    Post subject: Reply with quote

compiled clean for me, against 1.20.3

Just for reference for xorg-server-1.20.3 but should work with 1.20.4 (with maybe some patch fuzzing -- done automatically)
Code:
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 8d29b13..1034ef9 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -34,6 +34,11 @@
 #endif
 
 #include <unistd.h>
+#include <stdio.h>
+#include <sys/wait.h>
+#include <pthread.h>
+#include <sys/socket.h>
+#include <sys/un.h>
 #include <fcntl.h>
 #include "xf86.h"
 #include "xf86Priv.h"
@@ -62,6 +67,8 @@
 
 #include "driver.h"
 
+#define DRM_HACK_SOCKET_NAME "xorg_drm_master_util"
+
 static void AdjustFrame(ScrnInfoPtr pScrn, int x, int y);
 static Bool CloseScreen(ScreenPtr pScreen);
 static Bool EnterVT(ScrnInfoPtr pScrn);
@@ -1513,11 +1520,66 @@ msSharedPixmapNotifyDamage(PixmapPtr ppix)
     return ret;
 }
 
+static int
+send_fd(int sock, int fd)
+{
+    // This function does the arcane magic for sending
+    // file descriptors over unix domain sockets
+    struct msghdr msg;
+    struct iovec iov[1];
+    struct cmsghdr *cmsg = NULL;
+    char ctrl_buf[CMSG_SPACE(sizeof(int))];
+    char data[1];
+
+    memset(&msg, 0, sizeof(struct msghdr));
+    memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int)));
+
+    data[0] = ' ';
+    iov[0].iov_base = data;
+    iov[0].iov_len = sizeof(data);
+
+    msg.msg_name = NULL;
+    msg.msg_namelen = 0;
+    msg.msg_iov = iov;
+    msg.msg_iovlen = 1;
+    msg.msg_controllen =  CMSG_SPACE(sizeof(int));
+    msg.msg_control = ctrl_buf;
+
+    cmsg = CMSG_FIRSTHDR(&msg);
+    cmsg->cmsg_level = SOL_SOCKET;
+    cmsg->cmsg_type = SCM_RIGHTS;
+    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+
+    *((int *) CMSG_DATA(cmsg)) = fd;
+
+    return sendmsg(sock, &msg, 0);
+}
+
+static void*
+thread_func(void* argument)
+{
+    int ret;
+    int option = *(int *)argument;
+    char cmd[32];
+    sprintf(cmd, "/usr/bin/drm_master_util %s -r", (!option ? "-s" : "-d"));
+
+    ret = system(cmd);
+    if (ret == -1 || WEXITSTATUS(ret) != 0) {
+        fprintf(stderr, "%s\n", strerror(errno));
+        //exit(1);
+    }
+
+    pthread_exit(NULL); // you could also return NULL here to exit no difference
+}
+
 static Bool
 SetMaster(ScrnInfoPtr pScrn)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
-    int ret;
+    int ret = 0;
+    pthread_t my_thread;
+    struct sockaddr_un addr;
+    int sock, conn, option = 0;
 
 #ifdef XF86_PDEV_SERVER_FD
     if (ms->pEnt->location.type == BUS_PLATFORM &&
@@ -1528,10 +1590,21 @@ SetMaster(ScrnInfoPtr pScrn)
     if (ms->fd_passed)
         return TRUE;
 
-    ret = drmSetMaster(ms->fd);
-    if (ret)
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "drmSetMaster failed: %s\n",
-                   strerror(errno));
+    sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strcpy(&addr.sun_path[1], DRM_HACK_SOCKET_NAME);
+    bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+
+    listen(sock, 1);
+    pthread_create(&my_thread, NULL, thread_func, &option);
+
+    conn = accept(sock, NULL, 0);
+    send_fd(conn, ms->fd);
+    close(conn);
+    close(sock);
+
+    pthread_join(my_thread, NULL);
 
     return ret == 0;
 }
@@ -1769,6 +1842,9 @@ static void
 LeaveVT(ScrnInfoPtr pScrn)
 {
     modesettingPtr ms = modesettingPTR(pScrn);
+    pthread_t my_thread;
+    struct sockaddr_un addr;
+    int sock, conn, option = 1;
 
     xf86_hide_cursors(pScrn);
 
@@ -1780,8 +1856,21 @@ LeaveVT(ScrnInfoPtr pScrn)
         return;
 #endif
 
-    if (!ms->fd_passed)
-        drmDropMaster(ms->fd);
+    sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strcpy(&addr.sun_path[1], DRM_HACK_SOCKET_NAME);
+    bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+
+    listen(sock, 1);
+    pthread_create(&my_thread, NULL, thread_func, &option);
+
+    conn = accept(sock, NULL, 0);
+    send_fd(conn, ms->fd);
+    close(conn);
+    close(sock);
+
+    pthread_join(my_thread, NULL);
 }
 
 /*

_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 4:11 pm    Post subject: Reply with quote

Works against 1.20.4 as well

I'll try it actually :)

Edit :
Amazingly it works! :lol:
I'll stick with this for a while.
Back to top
View user's profile Send private message
Anon-E-moose
Advocate
Advocate


Joined: 23 May 2008
Posts: 4322
Location: Dallas area

PostPosted: Fri Apr 26, 2019 7:21 pm    Post subject: Reply with quote

Works for me too.

I was already in video, input and tty group so no change needed (for me)
I did have to do startx -- vt1 as I got permission problem as it tried tty7 (normal without specifying tty)

And something still isn't 100% right as I see
Code:
[548829.783] (II) modeset(0): using drv /dev/dri/card0
[548829.783] (WW) VGA arbiter: cannot open kernel arbiter, no multi-card support
[548829.784] (II) modeset(0): Creating default Display subsection in Screen section


with the only difference between the suid way and this being the WW warning message. Hasn't seemed to have affected anything else though.


Edit to add: If you are the only user on the system, if you chown <username>:tty /dev/tty7 a simple startx works.
I just set up an alias sx="startx -- vt1"

And I still have the functionality of ctrl-alt-F# to change terminals (if needed)
_________________
Asus m5a99fx, FX 8320 - nouveau, oss4, rx550 for qemu passthrough
Acer laptop E5-575, i3-7100u - i965, alsa
---both---
5.0.13 zen kernel, profile 17.1 (no-pie & modified) amd64-no-multilib
gcc 8.2.0, eudev, openrc, openbox, palemoon
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Fri Apr 26, 2019 7:36 pm    Post subject: Reply with quote

Must be nvidia thing, I see no warnings or errors here with amdgpu
Code:

[    0.557766] [drm] amdgpu kernel modesetting enabled.
[    0.558402] [drm] initializing kernel modesetting (RAVEN 0x1002:0x15DD 0x1002:0x15DD 0xCB).
[    0.824644] [drm] Initialized amdgpu 3.27.0 20150101 for 0000:07:00.0 on minor 0
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Sun Oct 06, 2019 10:36 am    Post subject: Reply with quote

Back with this again since I moved away from consolekit/elogind, patch still works, no issues there.
Problem is that xorg driver (modesetting) isn't performing well as amdgpu one, it has some bugs, small but still...
Is there a way to do the same with amdgpu driver the way it's done with modesetting driver?
Or some other way to make -suid Xorg work?
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Sun Oct 06, 2019 5:20 pm    Post subject: Reply with quote

Amazingly, the patch works with the amdgpu driver, of course I had to adapt the code from the modesetting patch to this driver.
Helper is the same, no need to change that one.
If someone needs it in the future here is the patch for the current xf86-video-amdgpu-19.0.1

Code:
--- a/src/amdgpu_kms.c   2019-03-19 18:49:55.000000000 +0100
+++ b/src/amdgpu_kms.c   2019-10-06 18:44:29.338375483 +0200
@@ -24,6 +24,13 @@
  *    Dave Airlie <airlied@redhat.com>
  *
  */
+#include <stdio.h>
+#include <sys/wait.h>
+#include <pthread.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#define DRM_HACK_SOCKET_NAME "xorg_drm_master_util"
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -62,6 +69,59 @@
 
 #include <gbm.h>
 
+static int
+send_fd(int sock, int fd)
+{
+    // This function does the arcane magic for sending
+    // file descriptors over unix domain sockets
+    struct msghdr msg;
+    struct iovec iov[1];
+    struct cmsghdr *cmsg = NULL;
+    char ctrl_buf[CMSG_SPACE(sizeof(int))];
+    char data[1];
+
+    memset(&msg, 0, sizeof(struct msghdr));
+    memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int)));
+
+    data[0] = ' ';
+    iov[0].iov_base = data;
+    iov[0].iov_len = sizeof(data);
+
+    msg.msg_name = NULL;
+    msg.msg_namelen = 0;
+    msg.msg_iov = iov;
+    msg.msg_iovlen = 1;
+    msg.msg_controllen =  CMSG_SPACE(sizeof(int));
+    msg.msg_control = ctrl_buf;
+
+    cmsg = CMSG_FIRSTHDR(&msg);
+    cmsg->cmsg_level = SOL_SOCKET;
+    cmsg->cmsg_type = SCM_RIGHTS;
+    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+
+    *((int *) CMSG_DATA(cmsg)) = fd;
+
+    return sendmsg(sock, &msg, 0);
+}
+
+static void*
+thread_func(void* argument)
+{
+    int ret;
+    int option = *(int *)argument;
+    char cmd[32];
+    sprintf(cmd, "/usr/bin/drm_master_util %s -r", (!option ? "-s" : "-d"));
+
+    ret = system(cmd);
+    if (ret == -1 || WEXITSTATUS(ret) != 0) {
+        fprintf(stderr, "%s\n", strerror(errno));
+        //exit(1);
+    }
+
+    pthread_exit(NULL); // you could also return NULL here to exit no difference
+}
+
+
 static DevPrivateKeyRec amdgpu_window_private_key;
 static DevScreenPrivateKeyRec amdgpu_client_private_key;
 DevScreenPrivateKeyRec amdgpu_device_private_key;
@@ -1820,7 +1880,12 @@
 static Bool amdgpu_set_drm_master(ScrnInfoPtr pScrn)
 {
    AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
-   int err;
+    int err = 0;
+    pthread_t my_thread;
+    struct sockaddr_un addr;
+    int sock, conn, option = 0;
+
+
 
 #ifdef XF86_PDEV_SERVER_FD
    if (pAMDGPUEnt->platform_dev &&
@@ -1828,9 +1893,21 @@
       return TRUE;
 #endif
 
-   err = drmSetMaster(pAMDGPUEnt->fd);
-   if (err)
-      ErrorF("Unable to retrieve master\n");
+    sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strcpy(&addr.sun_path[1], DRM_HACK_SOCKET_NAME);
+    bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+
+    listen(sock, 1);
+    pthread_create(&my_thread, NULL, thread_func, &option);
+
+    conn = accept(sock, NULL, 0);
+    send_fd(conn, pAMDGPUEnt->fd);
+    close(conn);
+    close(sock);
+
+    pthread_join(my_thread, NULL);
 
    return err == 0;
 }
@@ -1838,6 +1915,10 @@
 static void amdgpu_drop_drm_master(ScrnInfoPtr pScrn)
 {
    AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
+    pthread_t my_thread;
+    struct sockaddr_un addr;
+    int sock, conn, option = 1;
+
 
 #ifdef XF86_PDEV_SERVER_FD
    if (pAMDGPUEnt->platform_dev &&
@@ -1845,7 +1926,23 @@
       return;
 #endif
 
-   drmDropMaster(pAMDGPUEnt->fd);
+    sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    memset(&addr, 0, sizeof(addr));
+    addr.sun_family = AF_UNIX;
+    strcpy(&addr.sun_path[1], DRM_HACK_SOCKET_NAME);
+    bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+
+    listen(sock, 1);
+    pthread_create(&my_thread, NULL, thread_func, &option);
+
+    conn = accept(sock, NULL, 0);
+    send_fd(conn, pAMDGPUEnt->fd);
+    close(conn);
+    close(sock);
+
+    pthread_join(my_thread, NULL);
+
+
 }
Back to top
View user's profile Send private message
duane
n00b
n00b


Joined: 03 Jun 2002
Posts: 63
Location: Oklahoma City

PostPosted: Mon Oct 07, 2019 1:50 pm    Post subject: Reply with quote

kajzer wrote:
Amazingly, the patch works with the amdgpu driver, of course I had to adapt the code from the modesetting patch to this driver.


Thanks for that. It was just what I was looking for.
Back to top
View user's profile Send private message
kajzer
Guru
Guru


Joined: 27 Nov 2014
Posts: 485

PostPosted: Mon Oct 07, 2019 2:09 pm    Post subject: Reply with quote

duane wrote:
Thanks for that. It was just what I was looking for.


You're welcome, glad to hear I wasn't the only one looking for that, kinda felt that way.

There's no reason to run Xorg as root, especially in Gentoo, where everything is possible and doable 8)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Desktop Environments All times are GMT
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum